2

oauth クライアント トークン (認証されたユーザーなし) を使用してクライアントによってヒットされる可能性があるコントローラー アクション、またはアクセス トークン (特定のユーザー用) を使用して承認されたクライアントによってヒットされる可能性があるコントローラー アクションがあります。これに対応するために、フィルタの前にちょっといいものを設定したいと思います。私は試した:

oauthenticate :strategies => [:oauth10_request_token, :oauth10_access_token], 
              :interactive => false, 
              :only => [:wonky_action] 

アクセス トークン リクエストでこのアクションを実行しようとすると、OauthNonce を 2 回記憶しようとするため、エラーが発生します。私の 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 を 2 回目に呼び出すときに、すでに覚えているナンスを思い出そうとします。

私が思いつく最善の解決策は、ノンス記憶を残りのリクエスト検証から分離することです。言い換えれば、サーバーは最初に nonce を検証してから、署名の検証 (または verify_request が実行したいその他の処理) を何度でも実行します。

Pelle の application_controller_methods ファイルをフォークせずにこれを行う明確な方法はわかりませんが、あなたの 1 人が提案する明らかな修正が欠けていることを願っています! ご協力いただきありがとうございます!興味がある方のために、私は 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