PHP OAuthProvider返回HTTP 500

时间:2011-09-14 08:57:12

标签: php oauth oauth-provider

我正在努力将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只是将任何失败视为内部服务器错误?

提前感谢您的帮助。

2 个答案:

答案 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”一词
  
      
  1. 应该这个词,或形容词“推荐”,意思是那里   可能存在有效理由在特定情况下忽略一个   特殊项目,但必须理解完整含义   在选择不同的课程之前仔细权衡。
  2.   

虽然我有明确的答案,但我认为作者无偿使用500代码而不考虑“完整含义”,除非图书馆遇到实际情况每次有“过时”请求时出错。但它似乎完全有效。

答案 1 :(得分:1)

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

problem reporting extension通过OAuthProvider::reportProblem()

公开了{{3}}

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