Class: FaradayMiddleware::Reddit::Authentication

Inherits:
Faraday::Middleware
  • Object
show all
Includes:
ModhashHelpers
Defined in:
lib/faraday_middleware/reddit/request/authentication.rb

Overview

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.

Constant Summary collapse

AUTH_URL =
'https://ssl.reddit.com/api/login'.freeze

Instance Method Summary collapse

Methods included from ModhashHelpers

#extract_modhash, included

Constructor Details

#initialize(app, options) ⇒ Authentication



17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/faraday_middleware/reddit/request/authentication.rb', line 17

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

Instance Method Details

#apply_access_token(env) ⇒ Object



44
45
46
47
48
49
# File 'lib/faraday_middleware/reddit/request/authentication.rb', line 44

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


51
52
53
54
# File 'lib/faraday_middleware/reddit/request/authentication.rb', line 51

def apply_cookie(env)
  upstream_cookies = env[:request_headers]['Cookie']
  env[:request_headers]['Cookie'] = upstream_cookies ? "#{upstream_cookies}; #{@cookie}" : @cookie
end

#authenticate(env) ⇒ Object



56
57
58
59
60
# File 'lib/faraday_middleware/reddit/request/authentication.rb', line 56

def authenticate(env)
  response = Faraday.post AUTH_URL, user: @user, passwd: @passwd, rem: @rem, api_type: 'json'
  env[:modhash] = extract_modhash(response.env)
  @cookie = response.headers['set-cookie']
end

#call(env) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/faraday_middleware/reddit/request/authentication.rb', line 31

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