Rails oauth-plugin:多个策略导致重复的nonce错误

时间:2011-04-27 22:48:04

标签: ruby-on-rails ruby-on-rails-3 oauth oauth-provider

我有一个控制器动作可能会被客户端命中 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'

0 个答案:

没有答案