这是我的代码:
$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')
);
}
}
希望能有所帮助。