Sha256: f7f4506b08dba11cd32e233680baeebb293b98fe9876188c759e8a21ce344de4

Contents?: true

Size: 1.16 KB

Versions: 2

Compression:

Stored size: 1.16 KB

Contents

require 'uri'

module Keratin::AuthN
  class IDTokenVerifier
    def initialize(str, keychain)
      @id_token = str
      @keychain = keychain
      @time = Time.now.to_i
    end

    def subject
      jwt['sub']
    end

    def verified?
      jwt.present? &&
        token_from_us? &&
        token_for_us? &&
        !token_expired? &&
        token_intact?
    end

    def token_from_us?
      # the server or client may be configured with an extra trailing slash, unnecessary port number,
      # or something else that is an equivalent URI but not an equivalent string.
      URI.parse(jwt[:iss]) == URI.parse(Keratin::AuthN.config.issuer)
    end

    def token_for_us?
      jwt[:aud] == Keratin::AuthN.config.audience
    end

    def token_expired?
      jwt[:exp] < @time
    end

    def token_intact?
      jwt.verify!(@keychain.getset(jwt['iss']){ Issuer.new(jwt['iss']).signing_key })
    rescue JSON::JWT::VerificationFailed, JSON::JWT::UnexpectedAlgorithm
      false
    end

    private def jwt
      return @jwt if defined? @jwt
      @jwt = JSON::JWT.decode(@id_token || '', :skip_verification)
    rescue JSON::JWT::InvalidFormat
      @jwt = nil
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
keratin-authn-0.2.0 lib/keratin/authn/id_token_verifier.rb
keratin-authn-0.1.3 lib/keratin/authn/id_token_verifier.rb