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
エラーを内部サーバーエラーとして扱いますか?
よろしくお願いします。