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