Sha256: 76a356ba82acee8071a9ba46ec9303b12cb9bd5c673b9751e2a35d8eed97ee95

Contents?: true

Size: 1.54 KB

Versions: 2

Compression:

Stored size: 1.54 KB

Contents

require 'sandal'

module Doorkeeper
  module OpenidConnect
    module Models
      class IdToken
        include ActiveModel::Validations

        def initialize(access_token)
          @access_token = access_token
          @resource_owner = access_token.instance_eval(&Doorkeeper::OpenidConnect.configuration.resource_owner_from_access_token)
          @issued_at = Time.now
          @signer = Sandal::Sig::RS256.new(Doorkeeper::OpenidConnect.configuration.jws_private_key)
          @public_key = Doorkeeper::OpenidConnect.configuration.jws_public_key
        end

        def claims
          {
            iss: issuer,
            sub: subject,
            aud: audience,
            exp: expiration,
            iat: issued_at
          }
        end

        def as_json(options = {})
          claims
        end

        # TODO make signature strategy configurable with keys?
        # TODO move this out of the model
        def as_jws_token
          Sandal.encode_token(claims, @signer, {
            kid: @public_key
          })
        end

        private

        def issuer
          Doorkeeper::OpenidConnect.configuration.issuer
        end

        def subject
          @resource_owner.instance_eval(&Doorkeeper::OpenidConnect.configuration.subject).to_s
        end

        def audience
          @access_token.application.uid
        end

        def expiration
          (@issued_at.utc + Doorkeeper::OpenidConnect.configuration.expiration).to_i
        end

        def issued_at
          @issued_at.utc.to_i
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
doorkeeper-openid_connect-1.0.1 lib/doorkeeper/openid_connect/models/id_token.rb
doorkeeper-openid_connect-1.0.0 lib/doorkeeper/openid_connect/models/id_token.rb