繁体   English   中英

无法使用亚伯拉罕的 TwitterOAuth for PHP 获取令牌; 返回 HTTP 500

[英]Unable to obtain token using Abraham's TwitterOAuth for PHP; HTTP 500 returned

我正在尝试将@abrahamTwitterOAuth 0.5.3 库用于 PHP,但是当我发出请求以请求3 条腿授权的令牌时,我收到了 HTTP 500 作为响应。

这是我在 PHP 中设置代码的方式:

<?php

/* Start session and load library. */
session_start();

require_once('config.php');

require_once('twitteroauth/autoload.php');
use Abraham\TwitterOAuth\TwitterOAuth;

/* Build TwitterOAuth object with client credentials. */
$connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET);

/* Get temporary credentials. */
// Error occurs on the following line, unable to dump $request_token 
$request_token = $connection->oauth('oauth/request_token', array('oauth_callback' => OAUTH_CALLBACK));

//print_r($request_token); // <-- Never reached!!

我知道这个问题不在 Twitter API 中,因为我已经验证我可以通过开发控制台访问我的 Twitter 帐户。

此外,通过遵循库提供的授权流程示例,我在某种程度上验证了 TwiterOAuth 库是否正常工作。 该示例还可以访问我的 Twitter 帐户。

我只是无法弄清楚发生了什么,因为我无法正确授权我的 PHP 应用程序访问我的 Twitter 帐户。

我究竟做错了什么?

事实证明,从未获得响应。 结果,尝试处理响应,当没有响应时会导致服务器端出现错误。

Twitter OAuth 依赖的 PHP 函数之一是 curl。 我已经测试过curl_init存在:

print function_exists('curl_init') ? 'curl_init is enabled' : 'curl_init is disabled';

我错误地认为curl_exec也已启用。 (为什么要启用curl_init ,而只禁用curl_exec ?)

这个假设是不正确的,因为我的网络托管服务提供商“出于安全考虑”禁用了curl_exec而我不知道这一点。 此外,我对使用 Twitter API 的调用在过去一直有效,因此这是新行为。

我花了一段时间才回来测试curl_exec 我确认我正在接收一个有效的 TwitterOauth 对象,并最终进入 TwitterOauth 类和请求函数。

我没有收到 curl 错误,但是curl_exec的响应curl_exec为空(不是预期的 TRUE 或 FALSE )。 我认为这是不寻常的,起初以为 curl 缺少配置选项。

然而,事实并非如此。

因此,如果您遇到此库的问题(过去对我来说非常curl_exec ),则可能是您的托管服务提供商禁用了curl_exec

您可以通过以下 PHP 代码测试此场景:

print function_exists('curl_exec') ? 'curl_exec is enabled' : 'curl_exec is disabled';

我的问题以另一种方式解决了。 在检查(根据 jhenderson2099 的答案)我的主机是否启用了 curl_exec 之后(确实如此)。 我发现我的问题是由 src/TwitterOauth.php(TwitterOauth 类)中的两行引起的:

$bundlePath = CaBundle::getSystemCaRootBundlePath(); <-- Comment this line
$options = [
        // CURLOPT_VERBOSE => true,
        CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
        CURLOPT_HEADER => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => $this->timeout,
        CURLOPT_USERAGENT => $this->userAgent,
        $this->curlCaOpt($bundlePath) => $bundlePath,<-- Comment this line
    ];

这样您的代码将如下所示:

//$bundlePath = CaBundle::getSystemCaRootBundlePath();
        $options = [
            // CURLOPT_VERBOSE => true,
            CURLOPT_CONNECTTIMEOUT => $this->connectionTimeout,
            CURLOPT_HEADER => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_TIMEOUT => $this->timeout,
            CURLOPT_USERAGENT => $this->userAgent,
            //$this->curlCaOpt($bundlePath) => $bundlePath,
        ];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM