我正在努力将OAuth添加到RESTful API中。令人惊讶的是,使用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
消息是正确的,但肯定这个should是HTTP 401。
我在这里做错了什么,或OAuthProvider
只是将任何失败视为内部服务器错误?
提前感谢您的帮助。
答案 0 :(得分:1)
OAuth草案以简单的方式描述了400和401标题的使用。
http://oauth.net/core/1.0a/#http_codes
http://tools.ietf.org/html/rfc5849处的实际OAuth协议因此而言:
如果请求验证失败,服务器应该回复 适当的HTTP响应状态代码。服务器可以包括
有关请求在回复中被拒绝的详细信息 体。服务器应该在备用时返回400(错误请求)状态代码 接收不支持参数的请求,不支持的
签名方法,缺少参数或重复的协议
参数。服务器应该返回401(未授权)状态
接收具有无效客户端凭据的请求时的代码 无效或过期令牌,无效签名或无效或已使用 的随机数强>
在http://tools.ietf.org/html/rfc2119
中定义的“SHOULD”一词
- 应该这个词,或形容词“推荐”,意思是那里 可能存在有效理由在特定情况下忽略一个 特殊项目,但必须理解完整含义 在选择不同的课程之前仔细权衡。
醇>
虽然我不有明确的答案,但我认为作者无偿使用500代码而不考虑“完整含义”,除非图书馆遇到实际情况每次有“过时”请求时出错。但它似乎完全有效。
答案 1 :(得分:1)
如果在catch中添加$ provider-> reportProblem()会发生什么?
problem reporting extension通过OAuthProvider::reportProblem()
公开了{{3}}如果您没有看到预期的行为,您可以提供pkg版本吗?我会提交一个错误并尽快修复。