| 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
| 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'; |
| 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= |
| callback_path | [RW] | |
| consumer_key | [RW] | |
| consumer_secret | [RW] | |
| consumer_site | [RW] |
|
| 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] | |
| rack_session | [RW] | the name of the Rack env variable used for the session |
| redirect_to | [RW] |
|
| session_key | [RW] | the name of the Session key to use to store user account information (if OAuth completed OK) |
# 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
# 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
# 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
# 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
# File lib/rack-oauth.rb, line 100
100: def consumer
101: @consumer ||= ::OAuth::Consumer.new consumer_key, consumer_secret, :site => consumer_site
102: end
# File lib/rack-oauth.rb, line 112
112: def raise_validation_exception
113: raise @errors.join(', ')
114: end
# 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
# 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