class FaradayMiddleware::Reddit::Authentication

Request middleware that automatically handles user login.

Requires that either a ‘user` and `password` are provided or a pre-generated `cookie`. Performs an additional login request when no valid login cookie is available.

Constants

AUTH_DOMAIN
AUTH_PATH
AUTH_URL

Public Class Methods

new(app, options) click to toggle source
Calls superclass method
# File lib/faraday_middleware/reddit/request/authentication.rb, line 19
def initialize(app, options)
  super(app)
  @options      = options
  @user         = @options[:user]
  @passwd       = @options[:password]
  @rem          = @options[:remember]
  @access_token = @options[:access_token]
  @cookie       = @options[:cookie]

  unless (@options[:user] && @options[:password]) || @options[:cookie] || @options[:access_token]
    fail ArgumentError, 'Either `user` and `password`, `cookie`, or `access_token` need to be provided as options to the :reddit_authentication middleware'
  end
end

Public Instance Methods

apply_access_token(env) click to toggle source
# File lib/faraday_middleware/reddit/request/authentication.rb, line 46
def apply_access_token(env)
  env.url.scheme = 'https'
  env.url.port = 443
  env.url.host = 'oauth.reddit.com'
  env[:request_headers]['Authorization'] = "bearer #{@access_token}"
end
authenticate(env) click to toggle source
# File lib/faraday_middleware/reddit/request/authentication.rb, line 58
def authenticate(env)
  response = connection(env).post AUTH_PATH, user: @user, passwd: @passwd, rem: @rem, api_type: 'json'
  env[:modhash] = extract_modhash(response.env)
  @cookie = response.headers['set-cookie']
end
call(env) click to toggle source
# File lib/faraday_middleware/reddit/request/authentication.rb, line 33
def call(env)
  if @access_token
    apply_access_token(env)
  elsif @cookie
    apply_cookie(env)
  else
    authenticate(env)
    apply_cookie(env)
  end

  @app.call(env)
end
connection(env) click to toggle source
# File lib/faraday_middleware/reddit/request/authentication.rb, line 64
def connection(env)
  Faraday.new(url: AUTH_DOMAIN, headers: env['request_headers']) do |faraday|
    faraday.request  :url_encoded
    faraday.request  :retry, max: 5, interval: 2, exceptions: FaradayMiddleware::Reddit::RETRIABLE_ERRORS
    faraday.response :reddit_raise_error
    faraday.adapter  Faraday.default_adapter
  end
end