Class: Faraday::OAuth::Middleware

Inherits:
Middleware
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/faraday/oauth/middleware.rb

Overview

Uses the simple_oauth library to sign requests according the OAuth protocol.

The options for this middleware are forwarded to SimpleOAuth::Header: :consumer_key, :consumer_secret, :token, :token_secret. All these parameters are optional.

The signature is added to the “Authorization” HTTP request header. If the value for this header already exists, it is not overriden.

If no Content-Type header is specified, this middleware assumes that request body parameters should be included while signing the request. Otherwise, it only includes them if the Content-Type is “application/x-www-form-urlencoded”, as per OAuth 1.0.

For better performance while signing requests, this middleware should be positioned before UrlEncoded middleware on the stack, but after any other body-encoding middleware (such as EncodeJson).

Constant Summary collapse

AUTH_HEADER =
"Authorization"
CONTENT_TYPE =
"Content-Type"
TYPE_URLENCODED =
"application/x-www-form-urlencoded"

Instance Method Summary collapse

Instance Method Details

#body_params(env) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/faraday/oauth/middleware.rb', line 58

def body_params(env)
  if include_body_params?(env)
    if env.request_body.respond_to?(:to_str)
      parse_nested_query(env.request_body)
    else
      env.request_body
    end
  end || {}
end

#include_body_params?(env) ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
71
# File 'lib/faraday/oauth/middleware.rb', line 68

def include_body_params?(env)
  # see RFC 5849, section 3.4.1.3.1 for details
  !(type = env.request_headers[CONTENT_TYPE]) || (type == TYPE_URLENCODED)
end

#oauth_header(env) ⇒ Object



39
40
41
42
43
44
# File 'lib/faraday/oauth/middleware.rb', line 39

def oauth_header(env)
  SimpleOAuth::Header.new(env.method,
                          env.url.to_s,
                          signature_params(body_params(env)),
                          oauth_options(env))
end

#oauth_options(env) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/faraday/oauth/middleware.rb', line 50

def oauth_options(env)
  if (extra = env.request[:oauth]) && extra.is_a?(Hash) && !extra.empty?
    options.merge extra
  else
    options
  end
end

#on_request(env) ⇒ Object

Parameters:

  • env (Faraday::Env)

    the environment of the request being processed



35
36
37
# File 'lib/faraday/oauth/middleware.rb', line 35

def on_request(env)
  env.request_headers[AUTH_HEADER] ||= oauth_header(env).to_s if sign_request?(env)
end

#sign_request?(env) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
# File 'lib/faraday/oauth/middleware.rb', line 46

def sign_request?(env)
  !!env.request.fetch(:oauth, true)
end

#signature_params(params) ⇒ Object



73
74
75
76
77
78
79
# File 'lib/faraday/oauth/middleware.rb', line 73

def signature_params(params)
  if params.empty?
    params
  else
    params.reject { |_k, v| v.respond_to?(:content_type) }
  end
end