Module: OmniAuth::Strategy

Included in:
OmniAuth::Strategies::Password
Defined in:
lib/omniauth/strategy.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



6
7
8
9
10
11
# File 'lib/omniauth/strategy.rb', line 6

def self.included(base)
  OmniAuth.strategies << base
  base.class_eval do
    attr_reader :app, :name, :env, :options, :response
  end
end

Instance Method Details

#auth_hashObject



133
134
135
136
137
138
# File 'lib/omniauth/strategy.rb', line 133

def auth_hash
  {
    'provider' => name.to_s,
    'uid' => nil
  }
end

#call(env) ⇒ Object



21
22
23
# File 'lib/omniauth/strategy.rb', line 21

def call(env)
  dup.call!(env)
end

#call!(env) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/omniauth/strategy.rb', line 25

def call!(env)
  raise OmniAuth::NoSessionError.new("You must provide a session to use OmniAuth.") unless env['rack.session']

  @env = env
  @env['omniauth.strategy'] = self      
  
  setup_phase            
  return mock_call!(env) if OmniAuth.config.test_mode
  
  if current_path == request_path && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym)
    if response = call_through_to_app
      response
    else
      if request.params['origin']
        env['rack.session']['omniauth.origin'] = request.params['origin']            
      elsif env['HTTP_REFERER'] && !env['HTTP_REFERER'].match(/#{request_path}$/)
        env['rack.session']['omniauth.origin'] = env['HTTP_REFERER']
      end
      request_phase
    end
  elsif current_path == callback_path
    env['omniauth.origin'] = session.delete('omniauth.origin')
    env['omniauth.origin'] = nil if env['omniauth.origin'] == ''

    callback_phase
  else
    if respond_to?(:other_phase)
      other_phase
    else
      @app.call(env)
    end
  end
end

#call_app!(env = @env) ⇒ Object



129
130
131
# File 'lib/omniauth/strategy.rb', line 129

def call_app!(env = @env)
  @app.call(env)
end

#call_through_to_appObject



122
123
124
125
126
127
# File 'lib/omniauth/strategy.rb', line 122

def call_through_to_app
  status, headers, body = *call_app!
  @response = Rack::Response.new(body, status, headers)
  
  status == 404 ? nil : @response.finish
end

#callback_pathObject



106
107
108
# File 'lib/omniauth/strategy.rb', line 106

def callback_path
  options[:callback_path] || "#{path_prefix}/#{name}/callback"
end

#callback_phaseObject



93
94
95
96
# File 'lib/omniauth/strategy.rb', line 93

def callback_phase
  @env['omniauth.auth'] = auth_hash
  call_app! 
end

#callback_urlObject



154
155
156
# File 'lib/omniauth/strategy.rb', line 154

def callback_url
  full_host + script_name + callback_path + query_string
end

#current_pathObject



114
115
116
# File 'lib/omniauth/strategy.rb', line 114

def current_path
  request.path_info.downcase.sub(/\/$/,'')
end

#fail!(message_key, exception = nil) ⇒ Object



185
186
187
188
189
190
191
# File 'lib/omniauth/strategy.rb', line 185

def fail!(message_key, exception = nil)
  self.env['omniauth.error'] = exception
  self.env['omniauth.error.type'] = message_key.to_sym
  self.env['omniauth.error.strategy'] = self
  
  OmniAuth.config.on_failure.call(self.env)
end

#full_hostObject



140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/omniauth/strategy.rb', line 140

def full_host
  case OmniAuth.config.full_host
    when String
      OmniAuth.config.full_host
    when Proc
      OmniAuth.config.full_host.call(env)
    else
      uri = URI.parse(request.url.gsub(/\?.*$/,''))
      uri.path = ''
      uri.query = nil
      uri.to_s
  end
end

#initialize(app, name, *args) {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



13
14
15
16
17
18
19
# File 'lib/omniauth/strategy.rb', line 13

def initialize(app, name, *args, &block)
  @app = app
  @name = name.to_sym
  @options = args.last.is_a?(Hash) ? args.pop : {}
  
  yield self if block_given?
end

#mock_call!(env) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/omniauth/strategy.rb', line 59

def mock_call!(env)
  if current_path == request_path 
    if response = call_through_to_app
      response
    else
      env['rack.session']['omniauth.origin'] = env['HTTP_REFERER']
      redirect(callback_path)
    end
  elsif current_path == callback_path
    mocked_auth = OmniAuth.mock_auth_for(name.to_sym)
    if mocked_auth.is_a?(Symbol)
      fail!(mocked_auth)
    else
      @env['omniauth.auth'] = mocked_auth
      call_app!
    end
  else
    call_app!
  end
end

#path_prefixObject



98
99
100
# File 'lib/omniauth/strategy.rb', line 98

def path_prefix
  options[:path_prefix] || OmniAuth.config.path_prefix
end

#query_stringObject



118
119
120
# File 'lib/omniauth/strategy.rb', line 118

def query_string
  request.query_string.empty? ? "" : "?#{request.query_string}"
end

#redirect(uri) ⇒ Object



170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/omniauth/strategy.rb', line 170

def redirect(uri)
  r = Rack::Response.new

  if options[:iframe]
    r.write("<script type='text/javascript' charset='utf-8'>top.location.href = '#{uri}';</script>")
  else
    r.write("Redirecting to #{uri}...")
    r.redirect(uri)
  end
  
  r.finish
end

#requestObject



166
167
168
# File 'lib/omniauth/strategy.rb', line 166

def request
  @request ||= Rack::Request.new(@env)
end

#request_pathObject



102
103
104
# File 'lib/omniauth/strategy.rb', line 102

def request_path
  options[:request_path] || "#{path_prefix}/#{name}"
end

#request_phaseObject

Raises:

  • (NotImplementedError)


89
90
91
# File 'lib/omniauth/strategy.rb', line 89

def request_phase
  raise NotImplementedError
end

#script_nameObject



158
159
160
# File 'lib/omniauth/strategy.rb', line 158

def script_name
  @env['SCRIPT_NAME'] || ''
end

#sessionObject



162
163
164
# File 'lib/omniauth/strategy.rb', line 162

def session
  @env['rack.session']
end

#setup_pathObject



110
111
112
# File 'lib/omniauth/strategy.rb', line 110

def setup_path
  options[:setup_path] || "#{path_prefix}/#{name}/setup"
end

#setup_phaseObject



80
81
82
83
84
85
86
87
# File 'lib/omniauth/strategy.rb', line 80

def setup_phase
  if options[:setup].respond_to?(:call)
    options[:setup].call(env) 
  elsif options[:setup]
    setup_env = env.merge('PATH_INFO' => setup_path, 'REQUEST_METHOD' => 'GET')
    call_app!(setup_env)
  end
end

#user_infoObject



183
# File 'lib/omniauth/strategy.rb', line 183

def ; {} end