Class Rack::OAuth
In: lib/rack-oauth.rb
Parent: Object

Rack Middleware for integrating OAuth into your application

Note: this requires that a Rack::Session middleware be enabled

Methods

Constants

DEFAULT_OPTIONS = { :login_path => '/oauth_login', :callback_path => '/oauth_callback', :redirect_to => '/oauth_complete', :session_key => 'oauth_user', :rack_session => 'rack.session', :json_parser => lambda {|json_string| require 'json';

External Aliases

login_path -> login
login_path= -> login=
callback_path -> callback
callback_path= -> callback=
redirect_to -> redirect
redirect_to= -> redirect=
consumer_key -> key
consumer_key= -> key=
consumer_secret -> secret
consumer_secret= -> secret=
consumer_site -> site
consumer_site= -> site=

Attributes

callback_path  [RW] 
internal
the URL that the OAuth provider should callback to after OAuth login is complete
consumer_key  [RW] 
required
Your OAuth consumer key
consumer_secret  [RW] 
required
Your OAuth consumer secret
consumer_site  [RW] 
required
The site you want to request OAuth for, eg. ‘twitter.com
json_parser  [RW]  a Proc that accepts a JSON string and returns a Ruby object. Defaults to using the ‘json’ gem, if available.
login_path  [RW] 
internal
the URL that should initiate OAuth and redirect to the OAuth provider‘s login page
rack_session  [RW]  the name of the Rack env variable used for the session
redirect_to  [RW] 
external
the URL that Rack::OAuth should redirect to after the OAuth has been completed (part of your app)
session_key  [RW]  the name of the Session key to use to store user account information (if OAuth completed OK)

Public Class methods

[Source]

    # File lib/rack-oauth.rb, line 63
63:     def initialize app, options = {}
64:       @app = app
65:       
66:       DEFAULT_OPTIONS.each {|name, value| send "#{name}=", value }
67:       options.each         {|name, value| send "#{name}=", value } if options
68: 
69:       raise_validation_exception unless valid?
70:     end

Public Instance methods

[Source]

    # File lib/rack-oauth.rb, line 72
72:     def call env
73:       case env['PATH_INFO']
74:       when login_path;      do_login     env
75:       when callback_path;   do_callback  env
76:       else;                 @app.call    env
77:       end
78:     end

[Source]

    # File lib/rack-oauth.rb, line 87
87:     def do_callback env
88:       request  = ::OAuth::RequestToken.new consumer, session(env)[:oauth_request_token], session(env)[:oauth_request_secret]
89:       access   = request.get_access_token :oauth_verifier => Rack::Request.new(env).params['oauth_verifier']
90:       response = consumer.request :get, '/account/verify_credentials.json', access, :scheme => :query_string
91: 
92:       # put the user information received (json -> ruby) in the session
93:       session(env)[session_key] = json_parser.call response.body if response
94: 
95:       [ 302, {'Location' => redirect_to}, [] ]
96:     end

[Source]

    # File lib/rack-oauth.rb, line 80
80:     def do_login env
81:       request = consumer.get_request_token :oauth_callback => ::File.join("http://#{ env['HTTP_HOST'] }", callback_path)
82:       session(env)[:oauth_request_token]  = request.token
83:       session(env)[:oauth_request_secret] = request.secret
84:       [ 302, {'Location' => request.authorize_url}, [] ]
85:     end

Protected Instance methods

[Source]

     # File lib/rack-oauth.rb, line 100
100:     def consumer
101:       @consumer ||= ::OAuth::Consumer.new consumer_key, consumer_secret, :site => consumer_site
102:     end

[Source]

     # File lib/rack-oauth.rb, line 112
112:     def raise_validation_exception
113:       raise @errors.join(', ')
114:     end

[Source]

     # File lib/rack-oauth.rb, line 116
116:     def session env
117:       raise "Rack env['rack.session'] is nil ... has a Rack::Session middleware be enabled?  " + 
118:             "use :rack_session for custom key" if env[rack_session].nil?      
119:       env[rack_session]
120:     end

[Source]

     # File lib/rack-oauth.rb, line 104
104:     def valid?
105:       @errors = []
106:       @errors << ":consumer_key option is required"    unless consumer_key
107:       @errors << ":consumer_secret option is required" unless consumer_secret
108:       @errors << ":consumer_site option is required"   unless consumer_site
109:       @errors.empty?
110:     end

[Validate]