Class: Rack::OAuth
- Inherits:
- 
      Object
      
        - Object
- Rack::OAuth
 
- Defined in:
- lib/rack-oauth.rb
Overview
Rack Middleware for integrating OAuth into your application
Note: this requires that a Rack::Session middleware be enabled
Defined Under Namespace
Modules: Methods
Constant Summary collapse
- DEFAULT_OPTIONS =
- { :login_path => '/oauth_login', :callback_path => '/oauth_callback', :redirect_to => '/oauth_complete', :rack_session => 'rack.session' } 
Class Attribute Summary collapse
- 
  
    
      .default_instance_name  ⇒ Object 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    The name we use for Rack::OAuth instances when a name is not given. 
- 
  
    
      .test_mode_enabled  ⇒ Object 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    Set this equal to true to enable ‘test mode’. 
Instance Attribute Summary collapse
- 
  
    
      #callback_path  ⇒ Object 
    
    
      (also: #callback)
    
  
  
  
  
    
    
  
  
  
  
  
  
    the URL that the OAuth provider should callback to after OAuth login is complete. 
- 
  
    
      #consumer_key  ⇒ Object 
    
    
      (also: #key)
    
  
  
  
  
    
    
  
  
  
  
  
  
    - required
- 
Your OAuth consumer key. 
 
- 
  
    
      #consumer_secret  ⇒ Object 
    
    
      (also: #secret)
    
  
  
  
  
    
    
  
  
  
  
  
  
    - required
- 
Your OAuth consumer secret. 
 
- 
  
    
      #consumer_site  ⇒ Object 
    
    
      (also: #site)
    
  
  
  
  
    
    
  
  
  
  
  
  
    - required
- 
The site you want to request OAuth for, eg. 
 
- 
  
    
      #login_path  ⇒ Object 
    
    
      (also: #login)
    
  
  
  
  
    
    
  
  
  
  
  
  
    the URL that should initiate OAuth and redirect to the OAuth provider’s login page. 
- 
  
    
      #name  ⇒ Object 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    an arbitrary name for this instance of Rack::OAuth. 
- 
  
    
      #rack_session  ⇒ Object 
    
    
  
  
  
  
    
    
  
  
  
  
  
  
    the name of the Rack env variable used for the session. 
- 
  
    
      #redirect_to  ⇒ Object 
    
    
      (also: #redirect)
    
  
  
  
  
    
    
  
  
  
  
  
  
    the URL that Rack::OAuth should redirect to after the OAuth has been completed (part of your app). 
Class Method Summary collapse
- 
  
    
      .all(env)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns all of the Rack::OAuth instances found in this Rack ‘env’ Hash. 
- .disable_test_mode ⇒ Object
- .enable_test_mode ⇒ Object
- 
  
    
      .get(env, name = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Simple helper to get an instance of Rack::OAuth by name found in this Rack ‘env’ Hash. 
- 
  
    
      .mock_request(method, path, response = nil)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Set the response that should be returned when a particular method and path are called. 
- 
  
    
      .mock_response_for(method, path)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns the mock response, if one has been set via #mock_request, for a method and path. 
- .test_mode? ⇒ Boolean
Instance Method Summary collapse
- #call(env) ⇒ Object
- #consumer ⇒ Object
- #do_callback(env) ⇒ Object
- #do_login(env) ⇒ Object
- 
  
    
      #get_access_token(env)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    See #set_access_token. 
- 
  
    
      #get_access_token!(env)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Same as #get_access_token but it clears the access token info out of the session. 
- 
  
    
      #initialize(app, *args)  ⇒ OAuth 
    
    
  
  
  
    constructor
  
  
  
  
  
  
  
    A new instance of OAuth. 
- 
  
    
      #name_unless_default  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns the #name of this Rack::OAuth unless the name is ‘default’, in which case it returns nil. 
- #raise_validation_exception ⇒ Object
- 
  
    
      #request(token, method, path = nil, *args)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Usage:. 
- 
  
    
      #session(env)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Returns a hash of session variables, specific to this instance of Rack::OAuth and the end-user. 
- 
  
    
      #set_access_token(env, token)  ⇒ Object 
    
    
  
  
  
  
  
  
  
  
  
    Stores the access token in this env’s session in a way that we can get it back out via #get_access_token(env). 
- #valid? ⇒ Boolean
- #verified?(env) ⇒ Boolean
Constructor Details
#initialize(app, *args) ⇒ OAuth
Returns a new instance of OAuth.
| 158 159 160 161 162 163 164 165 166 167 168 | # File 'lib/rack-oauth.rb', line 158 def initialize app, *args @app = app = args.pop @name = args.first || Rack::OAuth.default_instance_name DEFAULT_OPTIONS.each {|name, value| send "#{name}=", value } .each {|name, value| send "#{name}=", value } if raise_validation_exception unless valid? end | 
Class Attribute Details
.default_instance_name ⇒ Object
The name we use for Rack::OAuth instances when a name is not given.
This is ‘default’ by default
| 84 85 86 | # File 'lib/rack-oauth.rb', line 84 def default_instance_name @default_instance_name end | 
.test_mode_enabled ⇒ Object
Set this equal to true to enable ‘test mode’
| 87 88 89 | # File 'lib/rack-oauth.rb', line 87 def test_mode_enabled @test_mode_enabled end | 
Instance Attribute Details
#callback_path ⇒ Object Also known as: callback
the URL that the OAuth provider should callback to after OAuth login is complete
| 122 123 124 | # File 'lib/rack-oauth.rb', line 122 def callback_path ::File.join *[@callback_path.to_s, name_unless_default].compact end | 
#consumer_key ⇒ Object Also known as: key
- required
- 
Your OAuth consumer key 
| 138 139 140 | # File 'lib/rack-oauth.rb', line 138 def consumer_key @consumer_key end | 
#consumer_secret ⇒ Object Also known as: secret
- required
- 
Your OAuth consumer secret 
| 143 144 145 | # File 'lib/rack-oauth.rb', line 143 def consumer_secret @consumer_secret end | 
#consumer_site ⇒ Object Also known as: site
- required
- 
The site you want to request OAuth for, eg. ‘twitter.com’ 
| 148 149 150 | # File 'lib/rack-oauth.rb', line 148 def consumer_site @consumer_site end | 
#login_path ⇒ Object Also known as: login
the URL that should initiate OAuth and redirect to the OAuth provider’s login page
| 114 115 116 | # File 'lib/rack-oauth.rb', line 114 def login_path ::File.join *[@login_path.to_s, name_unless_default].compact end | 
#name ⇒ Object
an arbitrary name for this instance of Rack::OAuth
| 153 154 155 | # File 'lib/rack-oauth.rb', line 153 def name @name.to_s end | 
#rack_session ⇒ Object
the name of the Rack env variable used for the session
| 135 136 137 | # File 'lib/rack-oauth.rb', line 135 def rack_session @rack_session end | 
#redirect_to ⇒ Object Also known as: redirect
the URL that Rack::OAuth should redirect to after the OAuth has been completed (part of your app)
| 130 131 132 | # File 'lib/rack-oauth.rb', line 130 def redirect_to @redirect_to end | 
Class Method Details
.all(env) ⇒ Object
Returns all of the Rack::OAuth instances found in this Rack ‘env’ Hash
| 96 97 98 | # File 'lib/rack-oauth.rb', line 96 def self.all env env['rack.oauth'] end | 
.disable_test_mode ⇒ Object
| 89 | # File 'lib/rack-oauth.rb', line 89 def disable_test_mode() self.test_mode_enabled = false end | 
.enable_test_mode ⇒ Object
| 88 | # File 'lib/rack-oauth.rb', line 88 def enable_test_mode() self.test_mode_enabled = true end | 
.get(env, name = nil) ⇒ Object
Simple helper to get an instance of Rack::OAuth by name found in this Rack ‘env’ Hash
| 101 102 103 104 | # File 'lib/rack-oauth.rb', line 101 def self.get env, name = nil name = Rack::OAuth.default_instance_name if name.nil? all(env)[name.to_s] end | 
.mock_request(method, path, response = nil) ⇒ Object
Set the response that should be returned when a particular method and path are called.
This is used when Rack::OAuth::test_mode? is true
| 272 273 274 275 276 277 278 279 280 281 282 | # File 'lib/rack-oauth.rb', line 272 def self.mock_request method, path, response = nil if method.to_s.start_with?('/') response = path path = method method = :get end @mock_responses ||= {} @mock_responses[path] ||= {} @mock_responses[path][method] = response end | 
.mock_response_for(method, path) ⇒ Object
Returns the mock response, if one has been set via #mock_request, for a method and path.
Raises an exception if the response doesn’t exist because we never want the test environment to actually make real requests!
| 261 262 263 264 265 266 267 | # File 'lib/rack-oauth.rb', line 261 def self.mock_response_for method, path unless @mock_responses and @mock_responses[path] and @mock_responses[path][method] raise "No mock response created for #{ method.inspect } #{ path.inspect }" else return @mock_responses[path][method] end end | 
.test_mode? ⇒ Boolean
| 90 | # File 'lib/rack-oauth.rb', line 90 def test_mode?() test_mode_enabled == true end | 
Instance Method Details
#call(env) ⇒ Object
| 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | # File 'lib/rack-oauth.rb', line 170 def call env # put this instance of Rack::OAuth in the env # so it's accessible from the application env['rack.oauth'] ||= {} env['rack.oauth'][name] = self case env['PATH_INFO'] # find out where to redirect to authorize for this oauth provider # and redirect there. when the authorization is finished, # the provider will redirect back to our application's callback path when login_path do_login(env) # the oauth provider has redirected back to us! we should have a # verifier now that we can use, in combination with out token and # secret, to get an access token for this user when callback_path do_callback(env) else @app.call(env) end end | 
#consumer ⇒ Object
| 288 289 290 | # File 'lib/rack-oauth.rb', line 288 def consumer @consumer ||= ::OAuth::Consumer.new consumer_key, consumer_secret, :site => consumer_site end | 
#do_callback(env) ⇒ Object
| 210 211 212 213 214 215 216 217 218 219 220 221 | # File 'lib/rack-oauth.rb', line 210 def do_callback env # get access token and persist it in the session in a way that we can get it back out later request = ::OAuth::RequestToken.new consumer, session(env)[:token], session(env)[:secret] set_access_token env, request.get_access_token(:oauth_verifier => Rack::Request.new(env).params['oauth_verifier']) # clear out the session variables (won't need these anymore) session(env).delete(:token) session(env).delete(:secret) # we have an access token now ... redirect back to the user's application [ 302, { 'Content-Type' => 'text/html', 'Location' => redirect_to }, [] ] end | 
#do_login(env) ⇒ Object
| 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | # File 'lib/rack-oauth.rb', line 195 def do_login env if Rack::OAuth.test_mode? set_access_token env, OpenStruct.new(:params => { 'I am a' => 'fake token' }) return [ 302, { 'Content-Type' => 'text/html', 'Location' => redirect_to }, [] ] end # get request token and hold onto the token/secret (which we need later to get the access token) request = consumer.get_request_token :oauth_callback => ::File.join("http://#{ env['HTTP_HOST'] }", callback_path) session(env)[:token] = request.token session(env)[:secret] = request.secret # redirect to the oauth provider's authorize url to authorize the user [ 302, { 'Content-Type' => 'text/html', 'Location' => request. }, [] ] end | 
#get_access_token(env) ⇒ Object
See #set_access_token
| 229 230 231 232 | # File 'lib/rack-oauth.rb', line 229 def get_access_token env params = session(env)[:access_token_params] ::OAuth::AccessToken.from_hash consumer, params if params end | 
#get_access_token!(env) ⇒ Object
Same as #get_access_token but it clears the access token info out of the session
| 235 236 237 238 | # File 'lib/rack-oauth.rb', line 235 def get_access_token! env params = session(env).delete(:access_token_params) ::OAuth::AccessToken.from_hash consumer, params if params end | 
#name_unless_default ⇒ Object
Returns the #name of this Rack::OAuth unless the name is ‘default’, in which case it returns nil
| 322 323 324 | # File 'lib/rack-oauth.rb', line 322 def name_unless_default name == Rack::OAuth.default_instance_name ? nil : name end | 
#raise_validation_exception ⇒ Object
| 300 301 302 | # File 'lib/rack-oauth.rb', line 300 def raise_validation_exception raise @errors.join(', ') end | 
#request(token, method, path = nil, *args) ⇒ Object
Usage:
request @token, '/account/verify_credentials.json'
request @token, 'GET', '/account/verify_credentials.json'
request @token, :post, '/statuses/update.json', :status => params[:tweet]
| 246 247 248 249 250 251 252 253 254 255 | # File 'lib/rack-oauth.rb', line 246 def request token, method, path = nil, *args if method.to_s.start_with?('/') path = method method = :get end return Rack::OAuth.mock_response_for(method, path) if Rack::OAuth.test_mode? consumer.request method.to_s.downcase.to_sym, path, token, *args end | 
#session(env) ⇒ Object
Returns a hash of session variables, specific to this instance of Rack::OAuth and the end-user
All user-specific variables are stored in the session.
The variables we currently keep track of are:
- 
token 
- 
secret 
- 
verifier 
With all three of these, we can make arbitrary requests to our OAuth provider for this user.
| 314 315 316 317 318 319 | # File 'lib/rack-oauth.rb', line 314 def session env raise "Rack env['rack.session'] is nil ... has a Rack::Session middleware be enabled? " + "use :rack_session for custom key" if env[rack_session].nil? env[rack_session]['rack.oauth'] ||= {} env[rack_session]['rack.oauth'][name] ||= {} end | 
#set_access_token(env, token) ⇒ Object
Stores the access token in this env’s session in a way that we can get it back out via #get_access_token(env)
| 224 225 226 | # File 'lib/rack-oauth.rb', line 224 def set_access_token env, token session(env)[:access_token_params] = token.params end | 
#valid? ⇒ Boolean
| 292 293 294 295 296 297 298 | # File 'lib/rack-oauth.rb', line 292 def valid? @errors = [] @errors << ":consumer_key option is required" unless consumer_key @errors << ":consumer_secret option is required" unless consumer_secret @errors << ":consumer_site option is required" unless consumer_site @errors.empty? end | 
#verified?(env) ⇒ Boolean
| 284 285 286 | # File 'lib/rack-oauth.rb', line 284 def verified? env [ :token, :secret, :verifier ].all? { |required_session_key| session(env)[required_session_key] } end |