【问题标题】:OAuth fails on one hostOAuth 在一台主机上失败
【发布时间】:2014-08-19 18:05:43
【问题描述】:

这是我的代码:

$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。现在,Zend 1.10 和 1.11 的“siteUrl”配置选项似乎相同,所以不可能是这样,对吧?

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

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

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

【问题讨论】:

  • 我在 Linux 主机上将 Debian 更新为 Wheezy,将 PHP 更新为 5.4.4,将 Zend 更新为 1.11,但仍然出现相同的错误消息。

标签: php linux macos zend-framework oauth


【解决方案1】:

404 表示未找到,因此服务器无法为 URL 提供文档,与身份验证没有任何关系... 身份验证失败应该是 403。如果您在启用身份验证的情况下仅获得 404,则404 可能在重定向...您应该尝试使用 Charles 代理或类似的代理来调试请求。

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

【讨论】:

  • 我只是不确定在使用 zend 时如何调试请求...我能看到它发出的请求是什么吗?
【解决方案2】:

我在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')
                );
        }
    }

希望对你有帮助。

【讨论】:

  • 感谢您的挖掘。我添加了这个:“requestScheme”=> Zend_Oauth::REQUEST_SCHEME_QUERYSTRING 并且还尝试了“requestScheme”=> Zend_Oauth::REQUEST_SCHEME_HEADER,但它没有任何区别......这在我的 Mac 和我的 Linux 机器之间有什么不同?
  • 所以,呃,看看那个函数,似乎它所做的就是改变它。这是为什么?我的意思是,如果我将首选设置为查询字符串,它将失败。如果我将其设置为 header,这会将其更改为 postbody,如果我将其设置为 postbody,则会将其更改为 querystring... 到底是什么?
  • 我更改了此代码以打印出值,果然 - 值来自 Header -> Body -> Fail。这太奇怪了。
  • 在我的 Mac 上添加 smae 故障排除代码不会打印任何内容 - 即该功能没有运行。那为什么会这样呢?嗯
  • 好吧,再排查一下,好像是发现远程服务器在请求上报了500的状态码后才运行这个功能的。但是当我从我的 Mac 请求它时它不会。但为什么呢?
猜你喜欢
  • 2019-11-20
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多