Module: OmniAuth::Strategy
- Defined in:
- lib/omniauth/strategy.rb
Overview
The Strategy is the base unit of OmniAuth's ability to wrangle multiple providers. Each strategy provided by OmniAuth includes this mixin to gain the default functionality necessary to be compatible with the OmniAuth library.
Class Method Summary collapse
Instance Method Summary collapse
- #auth_hash ⇒ Object
- #call(env) ⇒ Object
- #call!(env) ⇒ Object
- #call_app!(env = @env) ⇒ Object
- #call_through_to_app ⇒ Object
-
#callback_call ⇒ Object
Performs the steps necessary to run the callback phase of a strategy.
- #callback_path ⇒ Object
- #callback_phase ⇒ Object
- #callback_url ⇒ Object
- #current_path ⇒ Object
- #fail!(message_key, exception = nil) ⇒ Object
- #full_host ⇒ Object
- #initialize(app, name, *args) {|_self| ... } ⇒ Object
- #inspect ⇒ Object
- #mock_call!(env) ⇒ Object
- #mock_callback_call ⇒ Object
- #mock_request_call ⇒ Object
- #on_auth_path? ⇒ Boolean
- #on_callback_path? ⇒ Boolean
- #on_request_path? ⇒ Boolean
- #path_prefix ⇒ Object
- #query_string ⇒ Object
- #redirect(uri) ⇒ Object
- #request ⇒ Object
-
#request_call ⇒ Object
Performs the steps necessary to run the request phase of a strategy.
- #request_path ⇒ Object
- #request_phase ⇒ Object
- #script_name ⇒ Object
- #session ⇒ Object
- #setup_path ⇒ Object
- #setup_phase ⇒ Object
- #user_info ⇒ Object
Class Method Details
.included(base) ⇒ Object
10 11 12 13 14 15 |
# File 'lib/omniauth/strategy.rb', line 10 def self.included(base) OmniAuth.strategies << base base.class_eval do attr_reader :app, :name, :env, :options, :response end end |
Instance Method Details
#auth_hash ⇒ Object
167 168 169 170 171 172 |
# File 'lib/omniauth/strategy.rb', line 167 def auth_hash { 'provider' => name.to_s, 'uid' => nil } end |
#call(env) ⇒ Object
29 30 31 |
# File 'lib/omniauth/strategy.rb', line 29 def call(env) dup.call!(env) end |
#call!(env) ⇒ Object
33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/omniauth/strategy.rb', line 33 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 if on_auth_path? return mock_call!(env) if OmniAuth.config.test_mode return request_call if on_request_path? && OmniAuth.config.allowed_request_methods.include?(request.request_method.downcase.to_sym) return callback_call if on_callback_path? return other_phase if respond_to?(:other_phase) @app.call(env) end |
#call_app!(env = @env) ⇒ Object
163 164 165 |
# File 'lib/omniauth/strategy.rb', line 163 def call_app!(env = @env) @app.call(env) end |
#call_through_to_app ⇒ Object
156 157 158 159 160 161 |
# File 'lib/omniauth/strategy.rb', line 156 def call_through_to_app status, headers, body = *call_app! @response = Rack::Response.new(body, status, headers) status == 404 ? nil : @response.finish end |
#callback_call ⇒ Object
Performs the steps necessary to run the callback phase of a strategy.
63 64 65 66 67 68 69 |
# File 'lib/omniauth/strategy.rb', line 63 def callback_call setup_phase @env['omniauth.origin'] = session.delete('omniauth.origin') @env['omniauth.origin'] = nil if env['omniauth.origin'] == '' callback_phase end |
#callback_path ⇒ Object
140 141 142 |
# File 'lib/omniauth/strategy.rb', line 140 def callback_path [:callback_path] || "#{path_prefix}/#{name}/callback" end |
#callback_phase ⇒ Object
127 128 129 130 |
# File 'lib/omniauth/strategy.rb', line 127 def callback_phase @env['omniauth.auth'] = auth_hash call_app! end |
#callback_url ⇒ Object
188 189 190 |
# File 'lib/omniauth/strategy.rb', line 188 def callback_url full_host + script_name + callback_path + query_string end |
#current_path ⇒ Object
148 149 150 |
# File 'lib/omniauth/strategy.rb', line 148 def current_path request.path_info.downcase.sub(/\/$/,'') end |
#fail!(message_key, exception = nil) ⇒ Object
219 220 221 222 223 224 225 |
# File 'lib/omniauth/strategy.rb', line 219 def fail!(, exception = nil) self.env['omniauth.error'] = exception self.env['omniauth.error.type'] = .to_sym self.env['omniauth.error.strategy'] = self OmniAuth.config.on_failure.call(self.env) end |
#full_host ⇒ Object
174 175 176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/omniauth/strategy.rb', line 174 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
17 18 19 20 21 22 23 |
# File 'lib/omniauth/strategy.rb', line 17 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 |
#inspect ⇒ Object
25 26 27 |
# File 'lib/omniauth/strategy.rb', line 25 def inspect "#<#{self.class.to_s}>" end |
#mock_call!(env) ⇒ Object
83 84 85 86 87 |
# File 'lib/omniauth/strategy.rb', line 83 def mock_call!(env) return mock_request_call if on_request_path? return mock_callback_call if on_callback_path? call_app! end |
#mock_callback_call ⇒ Object
101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/omniauth/strategy.rb', line 101 def mock_callback_call setup_phase mocked_auth = OmniAuth.mock_auth_for(name.to_sym) if mocked_auth.is_a?(Symbol) fail!(mocked_auth) else @env['omniauth.auth'] = mocked_auth @env['omniauth.origin'] = session.delete('omniauth.origin') @env['omniauth.origin'] = nil if env['omniauth.origin'] == '' call_app! end end |
#mock_request_call ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/omniauth/strategy.rb', line 89 def mock_request_call setup_phase return response if response = call_through_to_app 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 redirect(script_name + callback_path) end |
#on_auth_path? ⇒ Boolean
71 72 73 |
# File 'lib/omniauth/strategy.rb', line 71 def on_auth_path? on_request_path? || on_callback_path? end |
#on_callback_path? ⇒ Boolean
79 80 81 |
# File 'lib/omniauth/strategy.rb', line 79 def on_callback_path? current_path.casecmp(callback_path) == 0 end |
#on_request_path? ⇒ Boolean
75 76 77 |
# File 'lib/omniauth/strategy.rb', line 75 def on_request_path? current_path.casecmp(request_path) == 0 end |
#path_prefix ⇒ Object
132 133 134 |
# File 'lib/omniauth/strategy.rb', line 132 def path_prefix [:path_prefix] || OmniAuth.config.path_prefix end |
#query_string ⇒ Object
152 153 154 |
# File 'lib/omniauth/strategy.rb', line 152 def query_string request.query_string.empty? ? "" : "?#{request.query_string}" end |
#redirect(uri) ⇒ Object
204 205 206 207 208 209 210 211 212 213 214 215 |
# File 'lib/omniauth/strategy.rb', line 204 def redirect(uri) r = Rack::Response.new if [: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 |
#request ⇒ Object
200 201 202 |
# File 'lib/omniauth/strategy.rb', line 200 def request @request ||= Rack::Request.new(@env) end |
#request_call ⇒ Object
Performs the steps necessary to run the request phase of a strategy.
48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/omniauth/strategy.rb', line 48 def request_call setup_phase 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 end |
#request_path ⇒ Object
136 137 138 |
# File 'lib/omniauth/strategy.rb', line 136 def request_path [:request_path] || "#{path_prefix}/#{name}" end |
#request_phase ⇒ Object
123 124 125 |
# File 'lib/omniauth/strategy.rb', line 123 def request_phase raise NotImplementedError end |
#script_name ⇒ Object
192 193 194 |
# File 'lib/omniauth/strategy.rb', line 192 def script_name @env['SCRIPT_NAME'] || '' end |
#session ⇒ Object
196 197 198 |
# File 'lib/omniauth/strategy.rb', line 196 def session @env['rack.session'] end |
#setup_path ⇒ Object
144 145 146 |
# File 'lib/omniauth/strategy.rb', line 144 def setup_path [:setup_path] || "#{path_prefix}/#{name}/setup" end |
#setup_phase ⇒ Object
114 115 116 117 118 119 120 121 |
# File 'lib/omniauth/strategy.rb', line 114 def setup_phase if [:setup].respond_to?(:call) [:setup].call(env) elsif [:setup] setup_env = env.merge('PATH_INFO' => setup_path, 'REQUEST_METHOD' => 'GET') call_app!(setup_env) end end |
#user_info ⇒ Object
217 |
# File 'lib/omniauth/strategy.rb', line 217 def user_info; {} end |