2

我有一个控制器操作,客户端可能会使用 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没有问题,但是token不是请求token,所以失败了。然后,它尝试运行 oauth10_access_token,当它第二次调用 verify_request 时,它会尝试记住一个我们已经记住的 nonce。

我能想出的最佳解决方案是将 Nonce-remembering 与请求验证的其余部分分开。换句话说,服务器将首先验证随机数,然后根据需要进行多次签名验证(或其他任何 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'
4

0 回答 0