OAuth在一台主机上失败


OAuth fails on one host

这是我的代码:

$key = "xxx";
$secret = "xxx";
$url = "https://oauth.withings.com/account";
$config = array(
    "siteUrl" => $url,
    "consumerKey" => $key,
    "consumerSecret" => $secret,
    "requestMethod" => "GET"
);
$consumer = new Zend_Oauth_Consumer($config);
try {
    $token = $consumer->getRequestToken();
} catch (Zend_Oauth_Exception $e){
    print $e;
}

当我在Mac(OSX 10.8,PHP 5.3.13,Zend 1.11.12)上运行它时,它可以正常工作。

但当我在Linux服务器(Debian 6.0.5,PHP 5.3.3,Zend 1.10.6)上运行它时,它失败了。Zend文档非常单薄,但在1.10到1.11之间是否发生了导致相同代码失败的事情?错误消息如下:

"异常'Zend_Oauth_exception',消息为'无法从令牌URL:'中检索有效的令牌响应'"

该错误似乎表明没有发送URL。现在,Zend1.10和1.11的"siteUrl"配置选项似乎是一样的,所以不可能是这样,对吧?

当手动构建URL并在Linux主机上使用CURL时,我得到了正确的响应,所以这不会是网络或阻塞问题。

当将URL更改为"/accounts"(即使其成为不正确的URL)时,它会使用此代码为Mac和Linux返回HTML 404代码。

我在这里不知所措。有人知道如何解决这个问题吗?

404表示未找到,因此服务器不能为URL提供文档,不应该与身份验证有任何关系。。。身份验证失败应为403。如果你只在启用auth的情况下获取404,那么404可能处于重定向状态。。。您应该尝试Charles代理或类似程序来调试请求。

编辑我重读并看到404是故意的。。。我仍然会尝试调试请求

我在Zend_Oauth_Http的代码中发现了异常,似乎响应未通过方案检查,您可能需要显式设置方案。

代码:

 /**
     * Manages the switch from OAuth request scheme to another lower preference
     * scheme during a request cycle.
     *
     * @param  Zend_Http_Response
     * @return void
     * @throws Zend_Oauth_Exception if unable to retrieve valid token response
     */
    protected function _assessRequestAttempt(Zend_Http_Response $response = null)
    {
        switch ($this->_preferredRequestScheme) {
            case Zend_Oauth::REQUEST_SCHEME_HEADER:
                $this->_preferredRequestScheme = Zend_Oauth::REQUEST_SCHEME_POSTBODY;
                break;
            case Zend_Oauth::REQUEST_SCHEME_POSTBODY:
                $this->_preferredRequestScheme = Zend_Oauth::REQUEST_SCHEME_QUERYSTRING;
                break;
            default:
                require_once 'Zend/Oauth/Exception.php';
                throw new Zend_Oauth_Exception(
                    'Could not retrieve a valid Token response from Token URL:'
                    . ($response !== null
                        ? PHP_EOL . $response->getBody()
                        : ' No body - check for headers')
                );
        }
    }

希望能有所帮助。