【问题标题】:PHP OAuthProvider Returns HTTP 500PHP OAuthProvider 返回 HTTP 500
【发布时间】:2011-09-15 06:22:15
【问题描述】:

我正在努力将 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

消息是正确的,但这个 should 肯定是 HTTP 401。

我在这里做错了什么,还是OAuthProvider 只是将任何故障视为内部服务器错误?

提前感谢您的帮助。

【问题讨论】:

    标签: php oauth oauth-provider


    【解决方案1】:

    OAuth 草案以简单的方式描述了 400 和 401 标头的使用。

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

    https://www.rfc-editor.org/rfc/rfc5849 的实际 OAuth 协议是这样说的:

    如果请求验证失败,服务器应该用 适当的 HTTP 响应状态代码。服务器可能包括
    关于为什么请求在响应中被拒绝的更多详细信息
    身体。

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

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

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

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

    【讨论】:

    • 谢谢 aitchnyu。你是绝对正确的。我也在文档中看到了 SHOULD,但曾期望/希望 OAuthProvider 实现会非常接近这封信。在将您的答案标记为已接受之前,我会继续看看是否有人对 500 条回复的来源有任何想法。
    • “有任何想法”我自己也很好奇 :-) 我刚从大学毕业,并肩负着自己与 OAuth 提供者角力的任务。
    【解决方案2】:

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

    problem reporting extension 通过OAuthProvider::reportProblem() 暴露

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

    【讨论】:

    • 嗨,约翰。对延迟回复表示歉意。我会试一试,并尽快回复您。
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多