我有一个控制器动作可能会被客户端命中 oauth客户端令牌(没有经过身份验证的用户),或者可能被具有访问权限的授权客户端命中 令牌(针对特定用户)。我想在过滤器之前设置好一点以适应 这个。我试过了:
oauthenticate :strategies => [:oauth10_request_token, :oauth10_access_token],
:interactive => false,
:only => [:wonky_action]
如果我尝试使用访问令牌请求来执行此操作,那么它 抱怨,因为它试图记住OauthNonce两次。这里的 我的ClientApplication.verify_request方法是什么样的:
def self.verify_request(request, options = {}, &block)
begin
signature = OAuth::Signature.build(request, options, &block)
nonce = OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
unless nonce
Rails.logger.warn "Oauth request failing because of invalid nonce."
return false
end
value = signature.verify
unless value
Rails.logger.warn "Signature verification failed."
end
value
rescue OAuth::Signature::UnknownSignatureMethod => e
false
end
end
看着这个,这种行为并不令人意外。它贯穿始终
oauth10_request_token方法,并记住nonce没有
问题,但令牌不是请求令牌,因此它失败。然后,它
尝试运行oauth10_access_token,并在调用时运行
第二次verify_request,它试图记住一个nonce
我们已经记得了。
我能想出的最佳解决方案是将Nonce-remembering与其余的请求验证分开。换一种说法, 服务器将首先验证nonce,然后执行签名 验证(或任何其他verify_request想要做的)尽可能多 随心所欲。
我没有看到一个明确的方法来做到这一点,而不是要求Pelle's application_controller_methods文件,但我希望我只是错过了 你们其中一个人会建议的明显修复!谢谢你的帮助! 如果您有兴趣,我会使用带有pelle的oauth-plugin的rails3 和他的呐喊:
gem 'oauth', :git => "http://github.com/pelle/oauth.git", :require => 'oauth/server'
gem "oauth-plugin", :git => 'https://github.com/pelle/oauth-plugin.git', :branch => 'rails3'