0

我正在努力将 OAuth 添加到 RESTful API。令人惊讶的是,使用 PHP 的OAuthOAuthProvider类(来自 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 响应状态码进行响应。服务器可以
在响应
正文中包含有关请求被拒绝的原因的更多详细信息。


接收到带有不支持的参数、不支持的
签名方法、缺少参数或重复协议
参数的请求时,服务器应该返回 400(错误请求)状态码。
当接收到带有无效客户端凭据、
无效或过期令牌、无效签名或无效或已使用 nonce的请求时,服务器应该返回 401(未授权)状态代码。

以及https://www.rfc-editor.org/rfc/rfc2119中定义的“应该”一词

  1. 应该这个词,或形容词“推荐”,意味着在特定情况下可能存在忽略 特定项目的正当理由,但在选择不同的课程之前必须理解并 仔细权衡全部含义。

虽然我没有明确的答案,但我猜作者是在没有考虑“全部含义”的情况下无偿使用 500 代码,除非每次出现“过时”请求时库都会遇到实际错误。但这似乎完全有效。

于 2011-09-14T13:02:12.433 回答
1

如果在 catch 中添加 $provider->reportProblem() 会发生什么?

问题报告扩展通过OAuthProvider::reportProblem()公开

如果您没有看到预期的行为,您可以提供 pkg 版本吗?我会提交一个错误并尽快修复它。

于 2011-09-14T22:22:15.570 回答