Sha256: 46159a71258651870d723b40598dec56ffeb09af1183cdf4325d5b5fadeb9164

Contents?: true

Size: 1.8 KB

Versions: 6

Compression:

Stored size: 1.8 KB

Contents

# frozen_string_literal: true

require 'warden/jwt_auth/errors'

module Warden
  module JWTAuth
    # Layer above token decoding which directly decodes a user from a JWT
    class UserDecoder
      include JWTAuth::Import['revocation_strategies']

      attr_reader :helper

      def initialize(*args)
        super
        @helper = PayloadUserHelper
      end

      # Returns the user that is encoded in a JWT. The scope is used to choose
      # the user repository to which send `#find_for_jwt_authentication(sub)`
      # with decoded `sub` claim.
      #
      # @param token [String] a JWT
      # @param scope [Symbol] Warden scope
      # @param aud [String] Expected aud claim
      # @return [Interfaces::User] an user, whatever it is
      # @raise [Errors::RevokedToken] when token has been revoked for the
      # encoded user
      # @raise [Errors::NilUser] when decoded user is nil
      # @raise [Errors::WrongScope] when encoded scope does not match with scope
      # @raise [Errors::WrongAud] when encoded aud does not match with aud
      # argument
      def call(token, scope, aud)
        payload = TokenDecoder.new.call(token)
        check_valid_claims(payload, scope, aud)
        user = helper.find_user(payload)
        check_valid_user(payload, user, scope)
        user
      end

      private

      def check_valid_claims(payload, scope, aud)
        raise Errors::WrongScope, 'wrong scope' unless helper.scope_matches?(payload, scope)
        raise Errors::WrongAud, 'wrong aud' unless helper.aud_matches?(payload, aud)
      end

      def check_valid_user(payload, user, scope)
        raise Errors::NilUser, 'nil user' unless user
        strategy = revocation_strategies[scope]
        raise Errors::RevokedToken, 'revoked token' if strategy.jwt_revoked?(payload, user)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
warden-jwt_auth-0.3.5 lib/warden/jwt_auth/user_decoder.rb
warden-jwt_auth-0.3.4 lib/warden/jwt_auth/user_decoder.rb
warden-jwt_auth-0.3.3 lib/warden/jwt_auth/user_decoder.rb
warden-jwt_auth-0.3.2 lib/warden/jwt_auth/user_decoder.rb
warden-jwt_auth-0.3.1 lib/warden/jwt_auth/user_decoder.rb
warden-jwt_auth-0.3.0 lib/warden/jwt_auth/user_decoder.rb