0

RESTful API に OAuth を追加する作業を行っています。驚いたことに、PHP のOAuthおよびOAuthProviderクラス (pecl/oauth から) を使用して、署名などに問題はありませんでした。

問題が発生しているのは、不正なタイムスタンプなどのエラーが発生した場合です。次のようにプロバイダーを設定しています。

public function authenticate(){
    try {
        $provider = new OAuthProvider();
        $provider->consumerHandler(array($this,'handleConsumer'));
        $provider->timestampNonceHandler(array($this,'handleTimestampNonce'));
        $provider->tokenHandler(array($this,'handleToken'));
        $provider->isRequestTokenEndpoint(FALSE);
        $provider->checkOAuthRequest();
    } catch (Exception $e) {
        // Do nothing.
    }
}

すべてのハンドラー関数が を返すOAUTH_OKと、要求は期待どおりに処理できます。タイムスタンプが悪い場合に何が起こるかを確認するために、timestampNonceHandler を次のように記述しました。

public function handleTimestampNonce($provider){
    return OAUTH_BAD_TIMESTAMP;
}

これを実行して、正しく署名されたリクエストを渡すと (確かにそうです)、レスポンスは HTTP 500 です。

[headers_recv] => HTTP/1.1 500 Internal Server Error
Date: Wed, 14 Sep 2011 08:47:59 GMT
Server: Apache/2.2.17 (Unix) mod_ssl/2.2.17 OpenSSL/0.9.8r DAV/2 PHP/5.3.4
X-Powered-By: PHP/5.3.4
Content-Length: 648
Connection: close
Content-Type: 0
[body_recv] => Invalid nonce/timestamp combination

メッセージは正しいですが、確かにこれはHTTP 401 である必要があります

ここで何か間違ったことをしていますか、それともOAuthProviderエラーを内部サーバーエラーとして扱いますか?

よろしくお願いします。

4

2 に答える 2

1

OAuthのドラフトでは、400ヘッダーと401ヘッダーの使用について簡単に説明しています。

http://oauth.net/core/1.0a/#http_codes

https://www.rfc-editor.org/rfc/rfc5849の実際のOAuthプロトコルは、次のように話します。

リクエストが検証に失敗した場合、サーバーは適切なHTTP応答ステータスコードで応答する必要があります。 サーバーは、応答本文
に要求が拒否された理由に関する詳細を含めることができます(MAY )。


サーバーは、サポートされていないパラメーター、サポートされていない
署名メソッド、欠落しているパラメーター、または重複したプロトコルパラメーターを含む要求を受信したときに、400(Bad Request)ステータスコードを返す必要があり
ます。
サーバーは、無効なクライアントクレデンシャル、
無効または期限切れのトークン、無効な署名、または無効または使用済みの ナンスを含むリクエストを受信したときに、401(未承認)ステータスコードを返す必要があります。

そして、https://www.rfc-editor.org/rfc/rfc2119で定義されている「SHOULD」という単語

  1. SHOULDこの単語、または形容詞「RECOMMENDED」は、特定の状況で特定の項目を無視する正当な理由が存在する可能性があることを意味しますが、別のコースを選択する前に、完全な意味を理解し、 慎重に検討する必要があります。

明確な答えはありませんが、「古い」リクエストがあるたびにライブラリが実際のエラーに遭遇しない限り、作成者は「完全な影響」を考慮せずに500コードを無償で使用していると思います。しかし、それは完全に有効なようです。

于 2011-09-14T13:02:12.433 に答える
1

$provider->reportProblem() をキャッチ内に追加するとどうなりますか?

問題報告拡張機能OAuthProvider::reportProblem()を介して公開されます

期待される動作が見られない場合は、pkg のバージョンを提供できますか? バグを報告し、できるだけ早く修正します。

于 2011-09-14T22:22:15.570 に答える