Rails oauth-plugin:多个策略导致重复的nonce错误
我有一个控制器操作可能被客户端使用oauth客户端令牌(没有经过身份validation的用户)命中,或者可能被具有访问令牌的授权客户端命中(针对特定用户)。 我想在filter之前设置一个漂亮的小点来容纳这个。 我试过了:
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与其余的请求validation分开。 换句话说,服务器将首先validationnonce,然后根据需要进行签名validation(或者任何其他verify_request想要做的事情)。
在没有问过Pelle的application_controller_methods文件的情况下,我没有看到明确的方法,但是我希望我只是错过了你们中的一个人会建议的明显修复! 谢谢你的帮助! 如果你有兴趣,我会使用rails3和pelle的oauth-plugin以及他的oauth分支:
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'