le1t0-oauth-plugin 0.3.14.001 → 0.4.0.pre4.001

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG +20 -0
  3. data/Gemfile +4 -0
  4. data/README.rdoc +57 -12
  5. data/Rakefile +2 -43
  6. data/UPGRADE.rdoc +21 -0
  7. data/generators/oauth_consumer/templates/consumer_token.rb +6 -0
  8. data/generators/oauth_consumer/templates/controller.rb +4 -0
  9. data/generators/oauth_consumer/templates/migration.rb +1 -1
  10. data/generators/oauth_provider/oauth_provider_generator.rb +6 -0
  11. data/generators/oauth_provider/templates/access_token.rb +2 -2
  12. data/generators/oauth_provider/templates/client_application.rb +8 -6
  13. data/generators/oauth_provider/templates/client_applications.yml +6 -6
  14. data/generators/oauth_provider/templates/clients_controller_spec.rb +130 -193
  15. data/generators/oauth_provider/templates/controller.rb +12 -0
  16. data/generators/oauth_provider/templates/controller_spec.rb +762 -291
  17. data/generators/oauth_provider/templates/controller_spec_helper.rb +49 -63
  18. data/generators/oauth_provider/templates/migration.rb +6 -5
  19. data/generators/oauth_provider/templates/oauth2_authorize.html.erb +16 -0
  20. data/generators/oauth_provider/templates/oauth2_authorize.html.haml +17 -0
  21. data/generators/oauth_provider/templates/oauth2_token.rb +6 -0
  22. data/generators/oauth_provider/templates/oauth2_token_spec.rb +29 -0
  23. data/generators/oauth_provider/templates/oauth2_verifier.rb +28 -0
  24. data/generators/oauth_provider/templates/oauth2_verifier_spec.rb +54 -0
  25. data/generators/oauth_provider/templates/oauth_token.rb +3 -4
  26. data/generators/oauth_provider/templates/request_token.rb +1 -1
  27. data/lib/generators/active_record/oauth_consumer_generator.rb +33 -0
  28. data/lib/generators/active_record/oauth_consumer_templates/consumer_token.rb +11 -0
  29. data/lib/generators/active_record/oauth_consumer_templates/migration.rb +20 -0
  30. data/lib/generators/active_record/oauth_provider_generator.rb +39 -0
  31. data/lib/generators/active_record/oauth_provider_templates/access_token.rb +16 -0
  32. data/lib/generators/active_record/oauth_provider_templates/client_application.rb +57 -0
  33. data/lib/generators/active_record/oauth_provider_templates/migration.rb +47 -0
  34. data/lib/generators/active_record/oauth_provider_templates/oauth2_token.rb +5 -0
  35. data/lib/generators/active_record/oauth_provider_templates/oauth2_verifier.rb +28 -0
  36. data/lib/generators/active_record/oauth_provider_templates/oauth_nonce.rb +13 -0
  37. data/lib/generators/active_record/oauth_provider_templates/oauth_token.rb +30 -0
  38. data/lib/generators/active_record/oauth_provider_templates/request_token.rb +40 -0
  39. data/lib/generators/erb/oauth_consumer_generator.rb +14 -0
  40. data/lib/generators/erb/oauth_consumer_templates/index.html.erb +29 -0
  41. data/lib/generators/erb/oauth_consumer_templates/show.html.erb +7 -0
  42. data/lib/generators/erb/oauth_provider_generator.rb +21 -0
  43. data/lib/generators/erb/oauth_provider_templates/_form.html.erb +17 -0
  44. data/lib/generators/erb/oauth_provider_templates/authorize.html.erb +14 -0
  45. data/lib/generators/erb/oauth_provider_templates/authorize_failure.html.erb +1 -0
  46. data/lib/generators/erb/oauth_provider_templates/authorize_success.html.erb +1 -0
  47. data/lib/generators/erb/oauth_provider_templates/edit.html.erb +7 -0
  48. data/lib/generators/erb/oauth_provider_templates/index.html.erb +43 -0
  49. data/lib/generators/erb/oauth_provider_templates/new.html.erb +5 -0
  50. data/lib/generators/erb/oauth_provider_templates/oauth2_authorize.html.erb +16 -0
  51. data/lib/generators/erb/oauth_provider_templates/show.html.erb +27 -0
  52. data/lib/generators/haml/oauth_consumer_generator.rb +21 -0
  53. data/lib/generators/haml/oauth_consumer_templates/index.html.haml +18 -0
  54. data/lib/generators/haml/oauth_consumer_templates/show.html.haml +8 -0
  55. data/lib/generators/haml/oauth_provider_generator.rb +28 -0
  56. data/lib/generators/haml/oauth_provider_templates/_form.html.haml +21 -0
  57. data/lib/generators/haml/oauth_provider_templates/authorize.html.haml +16 -0
  58. data/lib/generators/haml/oauth_provider_templates/authorize_failure.html.haml +1 -0
  59. data/lib/generators/haml/oauth_provider_templates/authorize_success.html.haml +1 -0
  60. data/lib/generators/haml/oauth_provider_templates/edit.html.haml +4 -0
  61. data/lib/generators/haml/oauth_provider_templates/index.html.haml +39 -0
  62. data/lib/generators/haml/oauth_provider_templates/new.html.haml +5 -0
  63. data/lib/generators/haml/oauth_provider_templates/oauth2_authorize.html.haml +17 -0
  64. data/lib/generators/haml/oauth_provider_templates/show.html.haml +30 -0
  65. data/lib/generators/mongoid/oauth_consumer_generator.rb +15 -0
  66. data/lib/generators/mongoid/oauth_consumer_templates/consumer_token.rb +40 -0
  67. data/lib/generators/mongoid/oauth_provider_generator.rb +21 -0
  68. data/lib/generators/mongoid/oauth_provider_templates/access_token.rb +16 -0
  69. data/lib/generators/mongoid/oauth_provider_templates/client_application.rb +71 -0
  70. data/lib/generators/mongoid/oauth_provider_templates/oauth2_token.rb +5 -0
  71. data/lib/generators/mongoid/oauth_provider_templates/oauth2_verifier.rb +25 -0
  72. data/lib/generators/mongoid/oauth_provider_templates/oauth_nonce.rb +24 -0
  73. data/lib/generators/mongoid/oauth_provider_templates/oauth_token.rb +44 -0
  74. data/lib/generators/mongoid/oauth_provider_templates/request_token.rb +36 -0
  75. data/lib/generators/oauth_consumer/USAGE +11 -0
  76. data/lib/generators/oauth_consumer/oauth_consumer_generator.rb +27 -0
  77. data/lib/generators/oauth_consumer/templates/controller.rb +50 -0
  78. data/lib/generators/oauth_consumer/templates/oauth_config.rb +47 -0
  79. data/lib/generators/oauth_inflections.rb +6 -0
  80. data/lib/generators/oauth_plugin.rb +0 -0
  81. data/lib/generators/oauth_provider/USAGE +18 -0
  82. data/lib/generators/oauth_provider/oauth_provider_generator.rb +47 -0
  83. data/lib/generators/oauth_provider/templates/clients_controller.rb +52 -0
  84. data/lib/generators/oauth_provider/templates/controller.rb +23 -0
  85. data/lib/generators/rspec/oauth_provider_generator.rb +39 -0
  86. data/lib/generators/rspec/templates/client_application_spec.rb +29 -0
  87. data/lib/generators/rspec/templates/client_applications.yml +23 -0
  88. data/lib/generators/rspec/templates/clients_controller_spec.rb +176 -0
  89. data/lib/generators/rspec/templates/controller_spec.rb +838 -0
  90. data/lib/generators/rspec/templates/controller_spec_helper.rb +66 -0
  91. data/lib/generators/rspec/templates/oauth2_token_spec.rb +29 -0
  92. data/lib/generators/rspec/templates/oauth2_verifier_spec.rb +54 -0
  93. data/lib/generators/rspec/templates/oauth_nonce_spec.rb +24 -0
  94. data/lib/generators/rspec/templates/oauth_nonces.yml +13 -0
  95. data/lib/generators/rspec/templates/oauth_token_spec.rb +309 -0
  96. data/lib/generators/rspec/templates/oauth_tokens.yml +17 -0
  97. data/lib/generators/test_unit/oauth_provider_generator.rb +37 -0
  98. data/lib/generators/test_unit/templates/client_application_test.rb +42 -0
  99. data/lib/generators/test_unit/templates/client_applications.yml +23 -0
  100. data/lib/generators/test_unit/templates/clients_controller_test.rb +280 -0
  101. data/lib/generators/test_unit/templates/controller_test.rb +310 -0
  102. data/lib/generators/test_unit/templates/controller_test_helper.rb +115 -0
  103. data/lib/generators/test_unit/templates/oauth_nonce_test.rb +26 -0
  104. data/lib/generators/test_unit/templates/oauth_nonces.yml +13 -0
  105. data/lib/generators/test_unit/templates/oauth_token_test.rb +57 -0
  106. data/lib/generators/test_unit/templates/oauth_tokens.yml +17 -0
  107. data/lib/oauth-plugin.rb +22 -1
  108. data/lib/oauth-plugin/version.rb +5 -0
  109. data/lib/oauth/controllers/application_controller_methods.rb +195 -66
  110. data/lib/oauth/controllers/consumer_controller.rb +18 -6
  111. data/lib/oauth/controllers/provider_controller.rb +153 -43
  112. data/lib/oauth/models/consumers/service_loader.rb +3 -0
  113. data/lib/oauth/models/consumers/services/opentransact_token.rb +15 -0
  114. data/lib/oauth/models/consumers/services/picomoney_token.rb +17 -0
  115. data/lib/oauth/models/consumers/token.rb +29 -5
  116. data/lib/oauth/rack/oauth_filter.rb +50 -0
  117. data/oauth-plugin.gemspec +13 -96
  118. data/rails/init.rb +1 -7
  119. metadata +123 -10
  120. data/VERSION +0 -1
@@ -3,7 +3,6 @@ module Oauth
3
3
  module ConsumerController
4
4
  def self.included(controller)
5
5
  controller.class_eval do
6
- before_filter :login_required
7
6
  before_filter :load_consumer, :except=>:index
8
7
  skip_before_filter :verify_authenticity_token,:only=>:callback
9
8
  end
@@ -13,8 +12,7 @@ module Oauth
13
12
  @consumer_tokens=ConsumerToken.all :conditions=>{:user_id=>current_user.id}
14
13
  # The services the user hasn't already connected to
15
14
  @services=OAUTH_CREDENTIALS.keys-@consumer_tokens.collect{|c| c.class.service_name}
16
- end
17
-
15
+ end
18
16
 
19
17
  # creates request token and redirects on to oauth provider's auth page
20
18
  # If user is already connected it displays a page with an option to disconnect and redo
@@ -31,11 +29,19 @@ module Oauth
31
29
  end
32
30
 
33
31
  def callback
32
+ logger.info "CALLBACK"
34
33
  @request_token_secret=session[params[:oauth_token]]
35
34
  if @request_token_secret
36
- @token=@consumer.create_from_request_token(current_user,params[:oauth_token],@request_token_secret,params[:oauth_verifier])
35
+ @token=@consumer.find_or_create_from_request_token(current_user,params[:oauth_token],@request_token_secret,params[:oauth_verifier])
36
+ session[params[:oauth_token]] = nil
37
37
  if @token
38
- flash[:notice] = "#{params[:id].humanize} was successfully connected to your account"
38
+ # Log user in
39
+ if logged_in?
40
+ flash[:notice] = "#{params[:id].humanize} was successfully connected to your account"
41
+ else
42
+ self.current_user = @token.user
43
+ flash[:notice] = "You logged in with #{params[:id].humanize}"
44
+ end
39
45
  go_back
40
46
  else
41
47
  flash[:error] = "An error happened, please try connecting again"
@@ -67,8 +73,14 @@ module Oauth
67
73
  def load_consumer
68
74
  consumer_key=params[:id].to_sym
69
75
  throw RecordNotFound unless OAUTH_CREDENTIALS.include?(consumer_key)
76
+ deny_access! unless logged_in? || OAUTH_CREDENTIALS[consumer_key][:allow_login]
70
77
  @consumer="#{consumer_key.to_s.camelcase}Token".constantize
71
- @token=@consumer.find_by_user_id current_user.id
78
+ @token=@consumer.find(:first, :conditions=>{:user_id=>current_user.id.to_s}) if logged_in?
79
+ end
80
+
81
+ # Override this in you controller to deny user or redirect to login screen.
82
+ def deny_access!
83
+ head 401
72
84
  end
73
85
 
74
86
  end
@@ -5,16 +5,16 @@ module OAuth
5
5
  def self.included(controller)
6
6
  controller.class_eval do
7
7
  before_filter :login_required, :only => [:authorize,:revoke]
8
- before_filter :login_or_oauth_required, :only => [:test_request]
9
- before_filter :oauth_required, :only => [:invalidate,:capabilities]
10
- before_filter :verify_oauth_consumer_signature, :only => [:request_token]
11
- before_filter :verify_oauth_request_token, :only => [:access_token]
8
+ oauthenticate :only => [:test_request]
9
+ oauthenticate :strategies => :token, :interactive => false, :only => [:invalidate,:capabilities]
10
+ oauthenticate :strategies => :two_legged, :interactive => false, :only => [:request_token]
11
+ oauthenticate :strategies => :oauth10_request_token, :interactive => false, :only => [:access_token]
12
12
  skip_before_filter :verify_authenticity_token, :only=>[:request_token, :access_token, :invalidate, :test_request]
13
13
  end
14
14
  end
15
15
 
16
16
  def request_token
17
- @token = current_client_application.create_request_token
17
+ @token = current_client_application.create_request_token params
18
18
  if @token
19
19
  render :text => @token.to_query
20
20
  else
@@ -31,49 +31,29 @@ module OAuth
31
31
  end
32
32
  end
33
33
 
34
+ def token
35
+ @client_application = ClientApplication.find_by_key params[:client_id]
36
+ if @client_application.secret != params[:client_secret]
37
+ oauth2_error "invalid_client"
38
+ return
39
+ end
40
+ if ["authorization_code","password","none"].include?(params[:grant_type])
41
+ send "oauth2_token_#{params[:grant_type].underscore}"
42
+ else
43
+ oauth2_error "unsupported_grant_type"
44
+ end
45
+ end
46
+
34
47
  def test_request
35
48
  render :text => params.collect{|k,v|"#{k}=#{v}"}.join("&")
36
49
  end
37
50
 
38
51
  def authorize
39
- @token = ::RequestToken.find_by_token params[:oauth_token]
40
- unless @token
41
- render :action=>"authorize_failure"
42
- return
43
- end
44
-
45
- unless @token.invalidated?
46
- if request.post?
47
- if user_authorizes_token?
48
- @token.authorize!(current_user)
49
- if @token.oauth10?
50
- @redirect_url = URI.parse(params[:oauth_callback] || @token.client_application.callback_url)
51
- else
52
- @redirect_url = URI.parse(@token.oob? ? @token.client_application.callback_url : @token.callback_url)
53
- end
54
-
55
- unless @redirect_url.to_s.blank?
56
- if @token.oauth10?
57
- @redirect_url.query = @redirect_url.query.blank? ?
58
- "oauth_token=#{@token.token}" :
59
- @redirect_url.query + "&oauth_token=#{@token.token}"
60
- redirect_to @redirect_url.to_s
61
- else
62
- @redirect_url.query = @redirect_url.query.blank? ?
63
- "oauth_token=#{@token.token}&oauth_verifier=#{@token.verifier}" :
64
- @redirect_url.query + "&oauth_token=#{@token.token}&oauth_verifier=#{@token.verifier}"
65
- redirect_to @redirect_url.to_s
66
- end
67
- else
68
- render :action => "authorize_success"
69
- end
70
- else
71
- @token.invalidate!
72
- render :action => "authorize_failure"
73
- end
74
- end
75
- else
76
- render :action => "authorize_failure"
52
+ if params[:oauth_token]
53
+ @token = ::RequestToken.find_by_token params[:oauth_token]
54
+ oauth1_authorize
55
+ elsif ["code","token"].include?(params[:response_type]) # pick flow
56
+ send "oauth2_authorize_#{params[:response_type]}"
77
57
  end
78
58
  end
79
59
 
@@ -108,9 +88,139 @@ module OAuth
108
88
 
109
89
  protected
110
90
 
91
+ def oauth1_authorize
92
+ unless @token
93
+ render :action=>"authorize_failure"
94
+ return
95
+ end
96
+
97
+ unless @token.invalidated?
98
+ if request.post?
99
+ if user_authorizes_token?
100
+ @token.authorize!(current_user)
101
+ @redirect_url = URI.parse(@token.oob? ? @token.client_application.callback_url : @token.callback_url)
102
+
103
+ unless @redirect_url.to_s.blank?
104
+ @redirect_url.query = @redirect_url.query.blank? ?
105
+ "oauth_token=#{@token.token}&oauth_verifier=#{@token.verifier}" :
106
+ @redirect_url.query + "&oauth_token=#{@token.token}&oauth_verifier=#{@token.verifier}"
107
+ redirect_to @redirect_url.to_s
108
+ else
109
+ render :action => "authorize_success"
110
+ end
111
+ else
112
+ @token.invalidate!
113
+ render :action => "authorize_failure"
114
+ end
115
+ end
116
+ else
117
+ render :action => "authorize_failure"
118
+ end
119
+ end
120
+
121
+ def oauth2_authorize_code
122
+ @client_application = ClientApplication.find_by_key params[:client_id]
123
+ if request.post?
124
+ @redirect_url = URI.parse(params[:redirect_url] || @client_application.callback_url)
125
+ if user_authorizes_token?
126
+ @verification_code = Oauth2Verifier.create :client_application=>@client_application, :user=>current_user, :callback_url=>@redirect_url.to_s
127
+
128
+ unless @redirect_url.to_s.blank?
129
+ @redirect_url.query = @redirect_url.query.blank? ?
130
+ "code=#{@verification_code.code}" :
131
+ @redirect_url.query + "&code=#{@verification_code.code}"
132
+ redirect_to @redirect_url.to_s
133
+ else
134
+ render :action => "authorize_success"
135
+ end
136
+ else
137
+ unless @redirect_url.to_s.blank?
138
+ @redirect_url.query = @redirect_url.query.blank? ?
139
+ "error=user_denied" :
140
+ @redirect_url.query + "&error=user_denied"
141
+ redirect_to @redirect_url.to_s
142
+ else
143
+ render :action => "authorize_failure"
144
+ end
145
+ end
146
+ else
147
+ render :action => "oauth2_authorize"
148
+ end
149
+ end
150
+
151
+ def oauth2_authorize_token
152
+ @client_application = ClientApplication.find_by_key params[:client_id]
153
+ if request.post?
154
+ @redirect_url = URI.parse(params[:redirect_url] || @client_application.callback_url)
155
+ if user_authorizes_token?
156
+ @token = Oauth2Token.create :client_application=>@client_application, :user=>current_user, :scope=>params[:scope]
157
+ unless @redirect_url.to_s.blank?
158
+ @redirect_url.query = @redirect_url.query.blank? ?
159
+ "access_token=#{@token.token}" :
160
+ @redirect_url.query + "&access_token=#{@token.token}"
161
+ redirect_to @redirect_url.to_s
162
+ else
163
+ render :action => "authorize_success"
164
+ end
165
+ else
166
+ unless @redirect_url.to_s.blank?
167
+ @redirect_url.query = @redirect_url.query.blank? ?
168
+ "error=user_denied" :
169
+ @redirect_url.query + "&error=user_denied"
170
+ redirect_to @redirect_url.to_s
171
+ else
172
+ render :action => "authorize_failure"
173
+ end
174
+ end
175
+ else
176
+ render :action => "oauth2_authorize"
177
+ end
178
+ end
179
+
180
+ # http://tools.ietf.org/html/draft-ietf-oauth-v2-08#section-4.1.1
181
+ def oauth2_token_authorization_code
182
+ @verification_code = @client_application.oauth2_verifiers.find_by_token params[:code]
183
+ unless @verification_code
184
+ oauth2_error
185
+ return
186
+ end
187
+ if @verification_code.redirect_url != params[:redirect_url]
188
+ oauth2_error
189
+ return
190
+ end
191
+ @token = @verification_code.exchange!
192
+ render :json=>@token
193
+ end
194
+
195
+ # http://tools.ietf.org/html/draft-ietf-oauth-v2-08#section-4.1.2
196
+ def oauth2_token_password
197
+ @user = authenticate_user( params[:username], params[:password])
198
+ unless @user
199
+ oauth2_error
200
+ return
201
+ end
202
+ @token = Oauth2Token.create :client_application=>@client_application, :user=>@user, :scope=>params[:scope]
203
+ render :json=>@token
204
+ end
205
+
206
+ # should authenticate and return a user if valid password. Override in your own controller
207
+ def authenticate_user(username,password)
208
+ User.authenticate(username,password)
209
+ end
210
+
211
+ # autonomous authorization which creates a token for client_applications user
212
+ def oauth2_token_none
213
+ @token = Oauth2Token.create :client_application=>@client_application, :user=>@client_application.user, :scope=>params[:scope]
214
+ render :json=>@token
215
+ end
216
+
111
217
  # Override this to match your authorization page form
112
218
  def user_authorizes_token?
113
219
  params[:authorize] == '1'
220
+ end
221
+
222
+ def oauth2_error(error="invalid_grant")
223
+ render :json=>{:error=>error}.to_json
114
224
  end
115
225
  end
116
226
  end
@@ -1,3 +1,5 @@
1
+ require 'oauth/controllers/consumer_controller'
2
+
1
3
  # Goes through the entries in your OAUTH_CREDENTIALS and either loads the class required
2
4
  # or subclasses ConsumerToken with the name.
3
5
  #
@@ -8,6 +10,7 @@ if defined? ConsumerToken && defined? OAUTH_CREDENTIALS
8
10
  class_name=value[:class_name]||"#{key.to_s.classify}Token"
9
11
  unless Object.const_defined?(class_name.to_sym)
10
12
  if File.exists?(File.join(File.dirname(__FILE__), "services","#{key.to_s}_token.rb"))
13
+ Rails.logger.info File.join(File.dirname(__FILE__), "services","#{key.to_s}_token")
11
14
  require File.join(File.dirname(__FILE__), "services","#{key.to_s}_token")
12
15
  else
13
16
  begin
@@ -0,0 +1,15 @@
1
+ require 'opentransact'
2
+ class OpenTransactToken < ConsumerToken
3
+
4
+ # def self.server
5
+ # @consumer||=OpenTransact::Server.new credentials
6
+ # end
7
+
8
+ # def self.consumer
9
+ # @consumer||=server.consumer
10
+ # end
11
+
12
+ def client
13
+ @client ||= OpenTransact::Client.new self.class.credentials.merge( {:token=>token, :secret=>secret})
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__),'opentransact_token')
2
+
3
+ class PicomoneyToken < OpenTransactToken
4
+
5
+ def self.credentials
6
+ @credentials||={
7
+ :site=>"https://picomoney.com",
8
+ :consumer_key => super[:key],
9
+ :consumer_secret => super[:secret]
10
+ }.merge(super)
11
+ end
12
+
13
+ def about_user
14
+ client.get("/about_user")
15
+ end
16
+
17
+ end
@@ -7,7 +7,6 @@ module Oauth
7
7
  module Token
8
8
  def self.included(model)
9
9
  model.class_eval do
10
- belongs_to :user
11
10
  validates_presence_of :user, :token, :secret
12
11
  end
13
12
 
@@ -27,17 +26,30 @@ module Oauth
27
26
  end
28
27
 
29
28
  def get_request_token(callback_url)
29
+ Rails.logger.info "OAUTH_CONSUMER #{consumer.inspect}"
30
30
  consumer.get_request_token(:oauth_callback=>callback_url)
31
31
  end
32
32
 
33
- def create_from_request_token(user,token,secret,oauth_verifier)
33
+ def find_or_create_from_request_token(user,token,secret,oauth_verifier)
34
34
  request_token=OAuth::RequestToken.new consumer,token,secret
35
35
  options={}
36
36
  options[:oauth_verifier]=oauth_verifier if oauth_verifier
37
37
  access_token=request_token.get_access_token options
38
- create :user_id=>user.id,:token=>access_token.token,:secret=>access_token.secret
38
+ find_or_create_from_access_token user, access_token
39
39
  end
40
40
 
41
+ def find_or_create_from_access_token(user,access_token)
42
+ if user
43
+ user.consumer_tokens.first(:conditions=>{:type=>self.to_s,:token=>access_token.token}) ||
44
+ user.consumer_tokens.create!(:type=>self.to_s,:token=>access_token.token, :secret=>access_token.secret)
45
+ else
46
+ ConsumerToken.first( :conditions =>{ :token=>access_token.token,:type=>self.to_s}) ||
47
+ create(:type=>self.to_s,:token=>access_token.token, :secret=>access_token.secret)
48
+ end
49
+ end
50
+
51
+ def build_user_from_token
52
+ end
41
53
  protected
42
54
 
43
55
  def credentials
@@ -55,11 +67,23 @@ module Oauth
55
67
  end
56
68
 
57
69
  def simple_client
58
- @simple_client||=SimpleClient.new OAuth::AccessToken.new( self.class.consumer,token,secret)
70
+ @simple_client||=SimpleClient.new client
59
71
  end
60
72
 
73
+ # Override this to return user data from service
74
+ def params_for_user
75
+ {}
76
+ end
77
+
78
+ def create_user
79
+ self.user ||= begin
80
+ User.new params_for_user
81
+ user.save(:validate=>false)
82
+ end
83
+ end
84
+
61
85
  end
62
86
  end
63
87
  end
64
88
  end
65
- end
89
+ end
@@ -0,0 +1,50 @@
1
+ require "rack"
2
+ require "rack/request"
3
+ require "oauth/signature"
4
+ module OAuth
5
+ module Rack
6
+
7
+ # An OAuth 1.0a filter to be used together with the oauth-plugin for rails.T
8
+ # This is still experimental
9
+ #
10
+ # Add it as middleware to your config/application.rb:
11
+ #
12
+ # require 'oauth/rack/oauth_filter'
13
+ # config.middleware.use OAuth::Rack::OAuthFilter
14
+
15
+
16
+
17
+ class OAuthFilter
18
+ def initialize(app)
19
+ @app = app
20
+ end
21
+
22
+ def call(env)
23
+ request = ::Rack::Request.new(env)
24
+ env["oauth_plugin"]=true
25
+ if ClientApplication.verify_request(request) do |request_proxy|
26
+ client_application = ClientApplication.find_by_key(request_proxy.consumer_key)
27
+ env["oauth.client_application_candidate"] = client_application
28
+ # Store this temporarily in client_application object for use in request token generation
29
+ client_application.token_callback_url=request_proxy.oauth_callback if request_proxy.oauth_callback
30
+
31
+ oauth_token = client_application.tokens.first(:conditions=>{:token => request_proxy.token})
32
+ if oauth_token.respond_to?(:provided_oauth_verifier=)
33
+ oauth_token.provided_oauth_verifier=request_proxy.oauth_verifier
34
+ end
35
+ env["oauth.token_candidate"] = oauth_token
36
+ # return the token secret and the consumer secret
37
+ [(oauth_token.nil? ? nil : oauth_token.secret), (client_application.nil? ? nil : client_application.secret)]
38
+ end
39
+ env["oauth.token"] = env["oauth.token_candidate"]
40
+ env["oauth.client_application"] = env["oauth.client_application_candidate"]
41
+ # Rails.logger.info "oauth.token = #{env["oauth.token"].inspect}"
42
+ end
43
+ env["oauth.client_application_candidate"] = nil
44
+ env["oauth.token_candidate"] = nil
45
+ response = @app.call(env)
46
+ end
47
+ end
48
+
49
+ end
50
+ end