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'