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'