Class: TDiary::Rack::Auth::OmniAuth::Authorization

Inherits:
Object
  • Object
show all
Defined in:
lib/tdiary/rack/auth/omniauth/authorization.rb

Instance Method Summary collapse

Constructor Details

#initialize(app, provider, &block) ⇒ Authorization

Returns a new instance of Authorization.



8
9
10
11
12
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 8

def initialize(app, provider, &block)
  @app = app
  @provider = provider
  @authz = block
end

Instance Method Details

#authenticate?(env) ⇒ Boolean

Returns:

  • (Boolean)


57
58
59
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 57

def authenticate?(env)
  env['omniauth.auth'] || env['rack.session']['auth']
end

#call(env) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 14

def call(env)
  if not authenticate?(env)
    # phase 1: request phase
    (env)
  elsif env['REQUEST_PATH'].match(%r|auth/#{@provider}/callback|)
    # phase 2: callback phase
    callback(env)
  else
    # phase 3: authorization phase
    auth = env['rack.session']['auth']
    env['REMOTE_USER'] = "#{auth.uid}@#{auth.provider}"
    return forbidden unless @authz.call(auth)
    @app.call(env)
  end
end

#callback(env) ⇒ Object



46
47
48
49
50
51
52
53
54
55
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 46

def callback(env)
  # reset sesstion to prevend session fixation attack
  # see: http://www.ipa.go.jp/security/vuln/documents/website_security.pdf (section 1.4)
  env['rack.session.options'][:renew] = true
  auth = env['omniauth.auth']
  env['rack.session']['auth'] = auth
  env['REMOTE_USER'] = "#{auth.uid}@#{auth.provider}"
  redirect = env['rack.session']['tdiary.auth.redirect'] || '/'
  [302, {'Content-Type' => 'text/plain', 'Location' => redirect}, []]
end

#forbiddenObject



42
43
44
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 42

def forbidden
  [403, {'Content-Type' => 'text/plain'}, ['forbidden']]
end

#login(env) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 30

def (env)
  STDERR.puts "use #{@provider} authentication strategy"
  req = ::Rack::Request.new(env)
  env['rack.session']['tdiary.auth.redirect'] = "#{req.base_url}#{req.fullpath}"
  redirect = File.join("#{req.base_url}#{req.path}", "#{::OmniAuth.config.path_prefix}/#{@provider}")
  [302, {'Content-Type' => 'text/plain', 'Location' => redirect}, []]
end

#logout(env) ⇒ Object



38
39
40
# File 'lib/tdiary/rack/auth/omniauth/authorization.rb', line 38

def logout(env)
  env['rack.session']['user_id'] = nil
end