authlogic-connect-x 0.0.4.05x

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.markdown +248 -0
  3. data/Rakefile +75 -0
  4. data/init.rb +1 -0
  5. data/lib/authlogic-connect.rb +27 -0
  6. data/lib/authlogic_connect/access_token.rb +53 -0
  7. data/lib/authlogic_connect/authlogic_connect.rb +46 -0
  8. data/lib/authlogic_connect/callback_filter.rb +19 -0
  9. data/lib/authlogic_connect/common.rb +10 -0
  10. data/lib/authlogic_connect/common/session.rb +30 -0
  11. data/lib/authlogic_connect/common/state.rb +32 -0
  12. data/lib/authlogic_connect/common/user.rb +77 -0
  13. data/lib/authlogic_connect/common/variables.rb +137 -0
  14. data/lib/authlogic_connect/engine.rb +14 -0
  15. data/lib/authlogic_connect/ext.rb +56 -0
  16. data/lib/authlogic_connect/oauth.rb +14 -0
  17. data/lib/authlogic_connect/oauth/helper.rb +20 -0
  18. data/lib/authlogic_connect/oauth/process.rb +75 -0
  19. data/lib/authlogic_connect/oauth/session.rb +62 -0
  20. data/lib/authlogic_connect/oauth/state.rb +60 -0
  21. data/lib/authlogic_connect/oauth/tokens/aol_token.rb +2 -0
  22. data/lib/authlogic_connect/oauth/tokens/facebook_token.rb +11 -0
  23. data/lib/authlogic_connect/oauth/tokens/get_satisfaction_token.rb +9 -0
  24. data/lib/authlogic_connect/oauth/tokens/google_token.rb +41 -0
  25. data/lib/authlogic_connect/oauth/tokens/linked_in_token.rb +19 -0
  26. data/lib/authlogic_connect/oauth/tokens/meetup_token.rb +12 -0
  27. data/lib/authlogic_connect/oauth/tokens/myspace_token.rb +26 -0
  28. data/lib/authlogic_connect/oauth/tokens/netflix_token.rb +10 -0
  29. data/lib/authlogic_connect/oauth/tokens/oauth_token.rb +144 -0
  30. data/lib/authlogic_connect/oauth/tokens/oauth_token.rb~ +140 -0
  31. data/lib/authlogic_connect/oauth/tokens/ohloh_token.rb +9 -0
  32. data/lib/authlogic_connect/oauth/tokens/opensocial_token.rb +0 -0
  33. data/lib/authlogic_connect/oauth/tokens/twitter_token.rb +8 -0
  34. data/lib/authlogic_connect/oauth/tokens/vimeo_token.rb +18 -0
  35. data/lib/authlogic_connect/oauth/tokens/yahoo_token.rb +19 -0
  36. data/lib/authlogic_connect/oauth/user.rb +63 -0
  37. data/lib/authlogic_connect/oauth/variables.rb +64 -0
  38. data/lib/authlogic_connect/openid.rb +11 -0
  39. data/lib/authlogic_connect/openid/process.rb +74 -0
  40. data/lib/authlogic_connect/openid/session.rb +56 -0
  41. data/lib/authlogic_connect/openid/state.rb +48 -0
  42. data/lib/authlogic_connect/openid/tokens/aol_token.rb +0 -0
  43. data/lib/authlogic_connect/openid/tokens/blogger_token.rb +0 -0
  44. data/lib/authlogic_connect/openid/tokens/flickr_token.rb +0 -0
  45. data/lib/authlogic_connect/openid/tokens/my_openid_token.rb +3 -0
  46. data/lib/authlogic_connect/openid/tokens/openid_token.rb +9 -0
  47. data/lib/authlogic_connect/openid/user.rb +38 -0
  48. data/lib/authlogic_connect/openid/variables.rb +19 -0
  49. data/lib/open_id_authentication.rb +127 -0
  50. data/rails/init.rb +19 -0
  51. data/test/controllers/test_users_controller.rb +21 -0
  52. data/test/libs/database.rb +48 -0
  53. data/test/libs/user.rb +7 -0
  54. data/test/libs/user_session.rb +2 -0
  55. data/test/old.rb +53 -0
  56. data/test/test_authlogic_connect.rb +13 -0
  57. data/test/test_helper.rb +153 -0
  58. data/test/test_user.rb +194 -0
  59. metadata +242 -0
@@ -0,0 +1,62 @@
1
+ module AuthlogicConnect::Oauth
2
+ # This module is responsible for adding oauth
3
+ # to the Authlogic::Session::Base class.
4
+ module Session
5
+ def self.included(base)
6
+ base.class_eval do
7
+ include InstanceMethods
8
+ end
9
+ end
10
+
11
+ module InstanceMethods
12
+ include Process
13
+
14
+ def self.included(klass)
15
+ klass.class_eval do
16
+ validate :validate_by_oauth, :if => :authenticating_with_oauth?
17
+ end
18
+ end
19
+
20
+ # Hooks into credentials so that you can pass a user who has already has an oauth access token.
21
+ def credentials=(value)
22
+ super
23
+ values = value.is_a?(Array) ? value : [value]
24
+ hash = values.first.is_a?(Hash) ? values.first.with_indifferent_access : nil
25
+ self.record = hash[:priority_record] if !hash.nil? && hash.key?(:priority_record)
26
+ end
27
+
28
+ def record=(record)
29
+ @record = record
30
+ end
31
+
32
+ private
33
+
34
+ def complete_oauth_transaction
35
+ if @record
36
+ self.attempted_record = record
37
+ else
38
+ # this generated token is always the same for a user!
39
+ # this is searching with User.find ...
40
+ # attempted_record is part of AuthLogic
41
+ hash = oauth_token_and_secret
42
+ token = token_class.find_by_key_or_token(hash[:key], hash[:token], :include => [:user]) # some weird error if I leave out the include)
43
+ if token
44
+ self.attempted_record = token.user
45
+ elsif auto_register?
46
+ self.attempted_record = klass.new
47
+ self.attempted_record.access_tokens << token_class.new(hash)
48
+ self.attempted_record.save
49
+ else
50
+ auth_session[:_key] = hash[:key]
51
+ auth_session[:_token] = hash[:token]
52
+ auth_session[:_secret] = hash[:secret]
53
+ end
54
+ end
55
+
56
+ if !attempted_record
57
+ errors.add(:user, "Could not find user in our database, have you registered with your oauth account?")
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,60 @@
1
+ # all these methods must return true or false
2
+ module AuthlogicConnect::Oauth::State
3
+
4
+ # 1. to call
5
+ # checks that we just passed parameters to it,
6
+ # and that the parameters say 'authentication_method' == 'oauth'
7
+ def oauth_request?
8
+ auth_params? && oauth_provider?
9
+ end
10
+
11
+ # 2. from call
12
+ # checks that the correct session variables are there
13
+ def oauth_response?
14
+ !oauth_response.nil? && !auth_session.nil? && auth_session[:auth_request_class] == self.class.name && auth_session[:auth_method] == "oauth"
15
+ end
16
+
17
+ def oauth_complete?
18
+ oauth_response? || stored_oauth_token_and_secret?
19
+ end
20
+
21
+ # 3. either to or from call
22
+ def using_oauth?
23
+ oauth_request? || oauth_response? || stored_oauth_token_and_secret?
24
+ end
25
+
26
+ def new_oauth_request?
27
+ return false if stored_oauth_token_and_secret?
28
+ return oauth_response.blank?
29
+ end
30
+
31
+ def oauth_provider?
32
+ !oauth_provider.blank?
33
+ end
34
+
35
+ # main method we call on validation
36
+ def authenticating_with_oauth?
37
+ correct_request_class? && using_oauth?
38
+ end
39
+
40
+ def allow_oauth_redirect?
41
+ authenticating_with_oauth? && !oauth_complete?
42
+ end
43
+
44
+ def start_oauth?
45
+ authenticating_with_oauth? && !oauth_complete?
46
+ end
47
+
48
+ def complete_oauth?
49
+ using_oauth? && !new_oauth_request?
50
+ end
51
+
52
+ def validate_password_with_oauth?
53
+ !using_oauth? && require_password?
54
+ end
55
+
56
+ def stored_oauth_token_and_secret?
57
+ !is_auth_session? && auth_params && auth_params.has_key?(:_key) && auth_params.has_key?(:_token) && auth_params.has_key?(:_secret)
58
+ end
59
+
60
+ end
@@ -0,0 +1,2 @@
1
+ # http://dev.aol.com/openauth_gettingstarted
2
+ # https://my.screenname.aol.com/_cqr/login/login.psp?sitedomain=dev.aol.com&authLev=1&lang=en&locale=us&siteState=OrigUrl%3Dhttp%253A%252F%252Fdev.aol.com%252Fkeys
@@ -0,0 +1,11 @@
1
+ # http://www.facebook.com/developers/apps.php
2
+ # http://developers.facebook.com/setup/
3
+ class FacebookToken < OauthToken
4
+
5
+ version 2.0
6
+
7
+ settings "https://graph.facebook.com",
8
+ :authorize_url => "https://graph.facebook.com/oauth/authorize",
9
+ :scope => "email, offline_access"
10
+
11
+ end
@@ -0,0 +1,9 @@
1
+ # http://getsatisfaction.com/developers/oauth
2
+ class GetSatisfactionToken < OauthToken
3
+
4
+ settings "http://getsatisfaction.com",
5
+ :request_token_path => "/api/request_token",
6
+ :authorize_url => "/api/authorize",
7
+ :access_token_path => "/api/access_token"
8
+
9
+ end
@@ -0,0 +1,41 @@
1
+ # http://code.google.com/apis/accounts/docs/OAuth_ref.html
2
+ # http://code.google.com/apis/accounts/docs/OpenID.html#settingup
3
+ # http://code.google.com/apis/accounts/docs/OAuth.html
4
+ # http://code.google.com/apis/accounts/docs/RegistrationForWebAppsAuto.html
5
+ # http://www.manu-j.com/blog/add-google-oauth-ruby-on-rails-sites/214/
6
+ # http://googlecodesamples.com/oauth_playground/
7
+ # Scopes:
8
+ # Analytics https://www.google.com/analytics/feeds/
9
+ # Google Base http://www.google.com/base/feeds/
10
+ # Book Search http://www.google.com/books/feeds/
11
+ # Blogger http://www.blogger.com/feeds/
12
+ # Calendar http://www.google.com/calendar/feeds/
13
+ # Contacts http://www.google.com/m8/feeds/
14
+ # Documents List http://docs.google.com/feeds/
15
+ # Finance http://finance.google.com/finance/feeds/
16
+ # GMail https://mail.google.com/mail/feed/atom
17
+ # Health https://www.google.com/health/feeds/
18
+ # H9 https://www.google.com/h9/feeds/
19
+ # Maps http://maps.google.com/maps/feeds/
20
+ # OpenSocial http://www-opensocial.googleusercontent.com/api/people/
21
+ # orkut http://www.orkut.com/social/rest
22
+ # Picasa Web http://picasaweb.google.com/data/
23
+ # Sidewiki http://www.google.com/sidewiki/feeds/
24
+ # Sites http://sites.google.com/feeds/
25
+ # Spreadsheets http://spreadsheets.google.com/feeds/
26
+ # Webmaster Tools http://www.google.com/webmasters/tools/feeds/
27
+ # YouTube http://gdata.youtube.com
28
+ class GoogleToken < OauthToken
29
+
30
+ settings "https://www.google.com",
31
+ :request_token_path => "/accounts/OAuthGetRequestToken",
32
+ :authorize_path => "/accounts/OAuthAuthorizeToken",
33
+ :access_token_path => "/accounts/OAuthGetAccessToken",
34
+ :scope => "https://www.googleapis.com/auth/userinfo#email"
35
+
36
+ key do |access_token|
37
+ body = JSON.parse(access_token.get("https://www.googleapis.com/userinfo/email?alt=json").body)
38
+ email = body["data"]["email"]
39
+ end
40
+
41
+ end
@@ -0,0 +1,19 @@
1
+ # http://developer.linkedin.com/docs/DOC-1008
2
+ # https://www.linkedin.com/secure/developer
3
+ # http://github.com/pengwynn/linkedin/tree/master/lib/linked_in/
4
+ class LinkedInToken < OauthToken
5
+
6
+ key do |access_token|
7
+ body = access_token.get("https://api.linkedin.com/v1/people/~:(id)").body
8
+ id = body.gsub("<id>([^><]+)</id>", "\\1") # so we don't need to also import nokogiri
9
+ id
10
+ end
11
+
12
+ settings "https://api.linkedin.com",
13
+ :request_token_path => "/uas/oauth/requestToken",
14
+ :access_token_path => "/uas/oauth/accessToken",
15
+ :authorize_path => "/uas/oauth/authorize",
16
+ :http_method => "get",
17
+ :scheme => :query_string
18
+
19
+ end
@@ -0,0 +1,12 @@
1
+ # http://www.meetup.com/meetup_api/docs/#oauth
2
+ # protected resources: http://api.meetup.com
3
+ class MeetupToken < OauthToken
4
+
5
+ key :user_id
6
+
7
+ settings "http://www.meetup.com/"
8
+ :request_token_path => "/oauth/request",
9
+ :authorize_path => "/authorize",
10
+ :access_token_path => "/oauth/access"
11
+
12
+ end
@@ -0,0 +1,26 @@
1
+ # http://wiki.developer.myspace.com/index.php?title=Category:MySpaceID
2
+ # http://developerwiki.myspace.com/index.php?title=OAuth_REST_API_Usage_-_Authentication_Process
3
+ # http://developerwiki.myspace.com/index.php?title=How_to_Set_Up_a_New_Application_for_OpenID
4
+ # http://developer.myspace.com/Modules/Apps/Pages/ApplyDevSandbox.aspx
5
+ # after you've signed up:
6
+ # http://developer.myspace.com/modules/apps/pages/createappaccount.aspx
7
+ # "Create a MySpaceID App"
8
+ # http://developer.myspace.com/modules/apps/pages/editapp.aspx?appid=188312&mode=create
9
+ # http://developer.myspace.com/Modules/APIs/Pages/OAuthTool.aspx
10
+ # http://developer.myspace.com/Community/forums/p/3626/15947.aspx
11
+ class MyspaceToken < OauthToken
12
+
13
+ # http://wiki.developer.myspace.com/index.php?title=Portable_Contacts_REST_Resources
14
+ key do |access_token|
15
+ body = JSON.parse(access_token.get("/v2/people/@me/@self?format=json").body)
16
+ id = body["entry"]["id"]
17
+ end
18
+
19
+ settings "http://api.myspace.com",
20
+ :request_token_path => "/request_token",
21
+ :authorize_path => "/authorize",
22
+ :access_token_path => "/access_token",
23
+ :http_method => "get",
24
+ :scheme => :query_string
25
+
26
+ end
@@ -0,0 +1,10 @@
1
+ class NetflixToken < OauthToken
2
+
3
+ key :user_id
4
+
5
+ settings "http://api.netflix.com",
6
+ :request_token_path => "/oauth/request_token",
7
+ :access_token_path => "/oauth/access_token",
8
+ :authorize_path => "/oauth/login"
9
+
10
+ end
@@ -0,0 +1,144 @@
1
+ class OauthToken < AccessToken
2
+
3
+ def client
4
+ unless @client
5
+ if oauth_version == 1.0
6
+ @client = OAuth::AccessToken.new(self.consumer, self.token, self.secret)
7
+ else
8
+ @client = OAuth2::AccessToken.new(self.consumer, self.token)
9
+ end
10
+ end
11
+
12
+ @client
13
+ end
14
+
15
+ def oauth_version
16
+ self.class.oauth_version
17
+ end
18
+
19
+ def get(path, options = {})
20
+ client.get(path, options)
21
+ end
22
+
23
+ def post(path, body='', headers ={})
24
+ client.post(path, body, headers)
25
+ end
26
+
27
+ class << self
28
+
29
+ # oauth version, 1.0 or 2.0
30
+ def version(value)
31
+ @oauth_version = value
32
+ end
33
+
34
+ def oauth_version
35
+ @oauth_version ||= 1.0
36
+ end
37
+
38
+ # unique key that we will use from the AccessToken response
39
+ # to identify the user by.
40
+ # in Twitter, its "user_id". Twitter has "screen_name", but that's
41
+ # more subject to change than user_id. Pick whatever is least likely to change
42
+ def key(value = nil, &block)
43
+ if block_given?
44
+ @oauth_key = block
45
+ else
46
+ @oauth_key = value.is_a?(Symbol) ? value : value.to_sym
47
+ end
48
+ end
49
+
50
+ def oauth_key
51
+ @oauth_key
52
+ end
53
+
54
+ def consumer
55
+ unless @consumer
56
+ if oauth_version == 1.0
57
+ @consumer = OAuth::Consumer.new(credentials[:key], credentials[:secret], config.merge(credentials[:options] || {}))
58
+ else
59
+ @consumer = OAuth2::Client.new(credentials[:key], credentials[:secret], config.merge(credentials[:options] || {}))
60
+ end
61
+ end
62
+
63
+ @consumer
64
+ end
65
+
66
+ # if we're lucky we can find it by the token.
67
+ def find_by_key_or_token(key, token, options = {})
68
+ result = self.find_by_key(key, options) unless key.nil?
69
+ unless result
70
+ if !token.blank? && self.respond_to?(:find_by_token)
71
+ result = self.find_by_token(token, options)
72
+ end
73
+ end
74
+ result
75
+ end
76
+
77
+ # this is a wrapper around oauth 1 and 2.
78
+ # it looks obscure, but from the api point of view
79
+ # you won't have to worry about it's implementation.
80
+ # in oauth 1.0, key = oauth_token, secret = oauth_secret
81
+ # in oauth 2.0, key = code, secret = access_token
82
+ def get_token_and_secret(options = {})
83
+ oauth_verifier = options[:oauth_verifier]
84
+ redirect_uri = options[:redirect_uri]
85
+ token = options[:token]
86
+ secret = options[:secret]
87
+
88
+ if oauth_version == 1.0
89
+ access = request_token(token, secret).get_access_token(:oauth_verifier => oauth_verifier)
90
+ result = {:token => access.token, :secret => access.secret, :key => nil}
91
+ if self.oauth_key
92
+ if oauth_key.is_a?(Proc)
93
+ result[:key] = oauth_key.call(access)
94
+ else
95
+ result[:key] = access.params[self.oauth_key] || access.params[self.oauth_key.to_s] # try both
96
+ end
97
+ else
98
+ puts "Access Token: #{access.inspect}"
99
+ raise "please set an oauth key for #{service_name.to_s}"
100
+ end
101
+ else
102
+ access = consumer.web_server.get_access_token(secret, :redirect_uri => redirect_uri)
103
+ result = {:token => access.token, :secret => secret, :key => nil}
104
+ end
105
+
106
+ result
107
+ end
108
+
109
+ # this is a cleaner method so we can access the authorize_url
110
+ # from oauth 1 or 2
111
+ def authorize_url(callback_url, &block)
112
+ if oauth_version == 1.0
113
+ request = get_request_token(callback_url)
114
+ yield request if block_given?
115
+ return request.authorize_url
116
+ else
117
+ options = {:redirect_uri => callback_url}
118
+
119
+ unless consumer.nil? || consumer.options.empty? || consumer.options[:scope].nil?
120
+ options[:scope] = consumer.options[:scope]
121
+ else
122
+ options[:scope] = self.config[:scope] unless self.config[:scope].blank?
123
+ end
124
+ return consumer.web_server.authorize_url(options)
125
+ end
126
+ end
127
+
128
+ def request_token(token, secret)
129
+ OAuth::RequestToken.new(consumer, token, secret)
130
+ end
131
+
132
+ # if you pass a hash as the second parameter to consumer.get_request_token,
133
+ # ruby oauth will think this is a form and all sorts of bad things happen
134
+ def get_request_token(callback_url)
135
+ options = {:scope => config[:scope]} if config[:scope]
136
+ consumer.get_request_token({:oauth_callback => callback_url}, options)
137
+ end
138
+
139
+ def get_access_token(oauth_verifier)
140
+ request_token.get_access_token(:oauth_verifier => oauth_verifier)
141
+ end
142
+ end
143
+
144
+ end
@@ -0,0 +1,140 @@
1
+ class OauthToken < AccessToken
2
+
3
+ def client
4
+ unless @client
5
+ if oauth_version == 1.0
6
+ @client = OAuth::AccessToken.new(self.consumer, self.token, self.secret)
7
+ else
8
+ @client = OAuth2::AccessToken.new(self.consumer, self.token)
9
+ end
10
+ end
11
+
12
+ @client
13
+ end
14
+
15
+ def oauth_version
16
+ self.class.oauth_version
17
+ end
18
+
19
+ def get(path, options = {})
20
+ client.get(path, options)
21
+ end
22
+
23
+ class << self
24
+
25
+ # oauth version, 1.0 or 2.0
26
+ def version(value)
27
+ @oauth_version = value
28
+ end
29
+
30
+ def oauth_version
31
+ @oauth_version ||= 1.0
32
+ end
33
+
34
+ # unique key that we will use from the AccessToken response
35
+ # to identify the user by.
36
+ # in Twitter, its "user_id". Twitter has "screen_name", but that's
37
+ # more subject to change than user_id. Pick whatever is least likely to change
38
+ def key(value = nil, &block)
39
+ if block_given?
40
+ @oauth_key = block
41
+ else
42
+ @oauth_key = value.is_a?(Symbol) ? value : value.to_sym
43
+ end
44
+ end
45
+
46
+ def oauth_key
47
+ @oauth_key
48
+ end
49
+
50
+ def consumer
51
+ unless @consumer
52
+ if oauth_version == 1.0
53
+ @consumer = OAuth::Consumer.new(credentials[:key], credentials[:secret], config.merge(credentials[:options] || {}))
54
+ else
55
+ @consumer = OAuth2::Client.new(credentials[:key], credentials[:secret], config.merge(credentials[:options] || {}))
56
+ end
57
+ end
58
+
59
+ @consumer
60
+ end
61
+
62
+ # if we're lucky we can find it by the token.
63
+ def find_by_key_or_token(key, token, options = {})
64
+ result = self.find_by_key(key, options) unless key.nil?
65
+ unless result
66
+ if !token.blank? && self.respond_to?(:find_by_token)
67
+ result = self.find_by_token(token, options)
68
+ end
69
+ end
70
+ result
71
+ end
72
+
73
+ # this is a wrapper around oauth 1 and 2.
74
+ # it looks obscure, but from the api point of view
75
+ # you won't have to worry about it's implementation.
76
+ # in oauth 1.0, key = oauth_token, secret = oauth_secret
77
+ # in oauth 2.0, key = code, secret = access_token
78
+ def get_token_and_secret(options = {})
79
+ oauth_verifier = options[:oauth_verifier]
80
+ redirect_uri = options[:redirect_uri]
81
+ token = options[:token]
82
+ secret = options[:secret]
83
+
84
+ if oauth_version == 1.0
85
+ access = request_token(token, secret).get_access_token(:oauth_verifier => oauth_verifier)
86
+ result = {:token => access.token, :secret => access.secret, :key => nil}
87
+ if self.oauth_key
88
+ if oauth_key.is_a?(Proc)
89
+ result[:key] = oauth_key.call(access)
90
+ else
91
+ result[:key] = access.params[self.oauth_key] || access.params[self.oauth_key.to_s] # try both
92
+ end
93
+ else
94
+ puts "Access Token: #{access.inspect}"
95
+ raise "please set an oauth key for #{service_name.to_s}"
96
+ end
97
+ else
98
+ access = consumer.web_server.get_access_token(secret, :redirect_uri => redirect_uri)
99
+ result = {:token => access.token, :secret => secret, :key => nil}
100
+ end
101
+
102
+ result
103
+ end
104
+
105
+ # this is a cleaner method so we can access the authorize_url
106
+ # from oauth 1 or 2
107
+ def authorize_url(callback_url, &block)
108
+ if oauth_version == 1.0
109
+ request = get_request_token(callback_url)
110
+ yield request if block_given?
111
+ return request.authorize_url
112
+ else
113
+ options = {:redirect_uri => callback_url}
114
+
115
+ unless consumer.nil? || consumer.options.empty? || consumer.options[:scope].nil?
116
+ options[:scope] = consumer.options[:scope]
117
+ else
118
+ options[:scope] = self.config[:scope] unless self.config[:scope].blank?
119
+ end
120
+ return consumer.web_server.authorize_url(options)
121
+ end
122
+ end
123
+
124
+ def request_token(token, secret)
125
+ OAuth::RequestToken.new(consumer, token, secret)
126
+ end
127
+
128
+ # if you pass a hash as the second parameter to consumer.get_request_token,
129
+ # ruby oauth will think this is a form and all sorts of bad things happen
130
+ def get_request_token(callback_url)
131
+ options = {:scope => config[:scope]} if config[:scope]
132
+ consumer.get_request_token({:oauth_callback => callback_url}, options)
133
+ end
134
+
135
+ def get_access_token(oauth_verifier)
136
+ request_token.get_access_token(:oauth_verifier => oauth_verifier)
137
+ end
138
+ end
139
+
140
+ end