# class SignedGlobalID

### Constants

DEFAULT_PURPOSE

### Attributes

expires_in[RW]
verifier[RW]
expires_at[R]
purpose[R]
verifier[R]

### Public Class Methods

new(gid, options = {}) click to toggle source
Calls superclass method GlobalID.new

    # File lib/global_id/signed_global_id.rb, line 51
    def initialize(gid, options = {})
      super
      @verifier = self.class.pick_verifier(options)
      @purpose = self.class.pick_purpose(options)
      @expires_at = pick_expiration(options)
    end

parse(sgid, options = {}) click to toggle source
Calls superclass method GlobalID.parse

    # File lib/global_id/signed_global_id.rb, line 11
    def parse(sgid, options = {})
      super verify(sgid.to_s, options), options
    end

pick_purpose(options) click to toggle source

    # File lib/global_id/signed_global_id.rb, line 27
    def pick_purpose(options)
      options.fetch :for, DEFAULT_PURPOSE
    end

pick_verifier(options) click to toggle source

Grab the verifier from options and fall back to ::verifier. Raise ArgumentError if neither is available.

    # File lib/global_id/signed_global_id.rb, line 17
    def pick_verifier(options)
      options.fetch :verifier do
        verifier || raise(ArgumentError, 'Pass a `verifier:` option with an `ActiveSupport::MessageVerifier` instance, or set a default SignedGlobalID.verifier.')
      end
    end

### Private Class Methods

raise_if_expired(expires_at) click to toggle source

    # File lib/global_id/signed_global_id.rb, line 42
    def raise_if_expired(expires_at)
      if expires_at && Time.now.utc > Time.iso8601(expires_at)
        raise ExpiredMessage, 'This signed global id has expired.'
      end
    end

verify(sgid, options) click to toggle source

    # File lib/global_id/signed_global_id.rb, line 32
    def verify(sgid, options)
      metadata = pick_verifier(options).verify(sgid)

      raise_if_expired(metadata['expires_at'])

      metadata['gid'] if pick_purpose(options) == metadata['purpose']
    rescue ActiveSupport::MessageVerifier::InvalidSignature, ExpiredMessage
      nil
    end

### Public Instance Methods

==(other) click to toggle source
Calls superclass method GlobalID#==

    # File lib/global_id/signed_global_id.rb, line 69
    def ==(other)
      super && @purpose == other.purpose
    end

to_h() click to toggle source

    # File lib/global_id/signed_global_id.rb, line 63
    def to_h
      # Some serializers decodes symbol keys to symbols, others to strings.
      # Using string keys remedies that.
      { 'gid' => @uri.to_s, 'purpose' => purpose, 'expires_at' => encoded_expiration }
    end

to_param()
Alias for: to_s
to_s() click to toggle source

    # File lib/global_id/signed_global_id.rb, line 58
    def to_s
      @sgid ||= @verifier.generate(to_h)
    end

Also aliased as: to_param

### Private Instance Methods

encoded_expiration() click to toggle source

    # File lib/global_id/signed_global_id.rb, line 74
    def encoded_expiration
      expires_at.utc.iso8601(3) if expires_at
    end

pick_expiration(options) click to toggle source

    # File lib/global_id/signed_global_id.rb, line 78
    def pick_expiration(options)
      return options[:expires_at] if options.key?(:expires_at)

      if expires_in = options.fetch(:expires_in) { self.class.expires_in }
        expires_in.from_now
      end
    end