Class: FaradayMiddleware::OAuth2

Inherits:
Faraday::Middleware
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/faraday_middleware/request/oauth2.rb

Overview

Public: A simple middleware that adds an access token to each request.

By default, the token is added as both “access_token” query parameter and the “Authorization” HTTP request header. It can alternatively be added exclusively as a bearer token “Authorization” header by specifying a “token_type” option of “bearer”. However, an explicit “access_token” parameter or “Authorization” header for the current request are not overriden.

Examples

# configure default token:
OAuth2.new(app, 'abc123')

# configure query parameter name:
OAuth2.new(app, 'abc123', :param_name => 'my_oauth_token')

# use bearer token authorization header only
OAuth2.new(app, 'abc123', :token_type => 'bearer')

# default token value is optional:
OAuth2.new(app, :param_name => 'my_oauth_token')

Constant Summary collapse

PARAM_NAME =
'access_token'
TOKEN_TYPE =
'param'
AUTH_HEADER =
'Authorization'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, token = nil, options = {}) ⇒ OAuth2

Returns a new instance of OAuth2.

Raises:

  • (ArgumentError)


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/faraday_middleware/request/oauth2.rb', line 56

def initialize(app, token = nil, options = {})
  super(app)
  if token.is_a? Hash
    options = token
    token = nil
  end
  @token = token&.to_s
  @param_name = options.fetch(:param_name, PARAM_NAME).to_s
  @token_type = options.fetch(:token_type, TOKEN_TYPE).to_s

  raise ArgumentError, ":param_name can't be blank" if @token_type == 'param' && @param_name.empty?

  return unless options[:token_type].nil?

  warn "\nWarning: FaradayMiddleware::OAuth2 initialized with default "\
    'token_type - token will be added as both a query string parameter '\
    'and an Authorization header. In the next major release, tokens will '\
    'be added exclusively as an Authorization header by default. Please '\
    'see https://github.com/lostisland/faraday_middleware/wiki.'
end

Instance Attribute Details

#param_nameObject (readonly)

Returns the value of attribute param_name.



34
35
36
# File 'lib/faraday_middleware/request/oauth2.rb', line 34

def param_name
  @param_name
end

#token_typeObject (readonly)

Returns the value of attribute token_type.



34
35
36
# File 'lib/faraday_middleware/request/oauth2.rb', line 34

def token_type
  @token_type
end

Instance Method Details

#call(env) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/faraday_middleware/request/oauth2.rb', line 39

def call(env)
  params = { param_name => @token }.update query_params(env[:url])
  token = params[param_name]

  if token.respond_to?(:empty?) && !token.empty?
    case @token_type.downcase
    when 'param'
      env[:url].query = build_query params
      env[:request_headers][AUTH_HEADER] ||= %(Token token="#{token}")
    when 'bearer'
      env[:request_headers][AUTH_HEADER] ||= %(Bearer #{token})
    end
  end

  @app.call env
end

#query_params(url) ⇒ Object



77
78
79
80
81
82
83
# File 'lib/faraday_middleware/request/oauth2.rb', line 77

def query_params(url)
  if url.query.nil? || url.query.empty?
    {}
  else
    parse_query url.query
  end
end