Sha256: 1d07c76b4a9e2550807aaf23af1bd2d95fdf771a3848d9212045cce4cbb820f6

Contents?: true

Size: 1.91 KB

Versions: 2

Compression:

Stored size: 1.91 KB

Contents

require 'devise/strategies/base'
module Devise
  module Strategies
    class AccessTokenAuthenticatable < Authenticatable
      def store?
        false # no no for session here
      end

      def valid?
        @access_tokens = [access_token_in_header, access_token_in_payload].compact
        @access_tokens.present?
      end

      def authenticate!
        return oauth_error! if @access_tokens.length > 1

        access_token = Devise::Oauth::AccessToken.where(value: @access_tokens.first).first

        return oauth_error!(403, :access_denied) unless access_token
        return oauth_error!(403, :access_denied) if access_token.expired?

        resource = access_token.resource_owner
        if validate(resource)
          env["devise.oauth.access_token"] = access_token
          resource.oauth_token = access_token
          success!(resource)
        else
          oauth_error!
        end
      end

    private
      def oauth_error!(status = 400, error_code = :invalid_request, description = nil)
        body = {error: error_code}
        body[:error_description] = description if description

        headers = {"Content-Type" => "application/json; charset=utf-8"}
        
        custom! [status, headers, [body.to_json]]
      end

      # Access Token Authenticatable can be authenticated with params in any controller and any verb.
      def valid_params_request?
        true
      end

      # Do not use remember_me behavior with token.
      def remember_me?
        false
      end

      def access_token_in_payload
        params['access_token']
      end

      def access_token_in_header
        auth_header = ::Rack::Auth::AbstractRequest.new(env)
        if auth_header.provided? && auth_header.scheme == :bearer
          auth_header.params
        else
          nil
        end
      end

    end
  end
end

Warden::Strategies.add(:access_token_authenticatable, Devise::Strategies::AccessTokenAuthenticatable)

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
devise_oauth-2.0.1 lib/devise/strategies/access_token_authenticatable.rb
devise_oauth-2.0.0 lib/devise/strategies/access_token_authenticatable.rb