【问题标题】:Unreliable results while obtaining long-lived token获得长寿命令牌时结果不可靠
【发布时间】:2020-05-23 02:04:39
【问题描述】:

我在此处遵循关于访问令牌的 FB 说明:https://developers.facebook.com/docs/facebook-login/access-tokens

他们说要使用 Javascript SDK 从客户端获取短期令牌,我已经这样做了。我每次在测试期间都获得一个有效的短期令牌,没有任何问题。

然后在服务器上,我向如下结构的 URL 发出 cURL 请求:

https://graph.facebook.com/v4.0/oauth/access_token?grant_type=fb_exchange_token&fb_exchange_token=[short-lived-token-here]&client_id=[client-ID-here]&client_secret=[client-secret-here]

这在大约 10% - 30% 的时间内确实有效,并且我得到了成功的响应,例如:

{"access_token":"[LONG-TERM-TOKEN-HERE]","token_type":"bearer"}

但是 70% - 90% 的时间我会收到如下错误:

OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to graph.facebook.com:443 

什么时候有效,什么时候无效,完全是随机的。 这是我的 cURL 代码的样子:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');

$headers = array();
$headers[] = 'Authority: graph.facebook.com';
$headers[] = 'Pragma: no-cache';
$headers[] = 'Cache-Control: no-cache';
$headers[] = 'Upgrade-Insecure-Requests: 1';
$headers[] = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36';
$headers[] = 'Sec-Fetch-User: ?1';
$headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9';
$headers[] = 'Sec-Fetch-Site: none';
$headers[] = 'Sec-Fetch-Mode: navigate';
$headers[] = 'Accept-Encoding: gzip, deflate, br';
$headers[] = 'Accept-Language: en-US,en;q=0.9';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
   echo 'Error:' . curl_error($ch);
}
curl_close($ch);

我使用它是因为当我转到 URL 时,它是在我的浏览器中成功调用的。不过,我也尝试过去掉不必要的标题,结果同样不可预测。

这似乎与请求限制无关,因为我的应用程序配额小于 1%。我还尝试在 cURL 请求之间等待 > 10 秒,这不会影响结果。

奇怪的是,每次我在实际的网络浏览器中执行此请求时,FB 似乎都会给我一个有效的访问代码。此问题仅在使用 cURL 时存在 - 即使我的 PHP cURL 请求与浏览器的 XHR 请求相同。

有没有更好的方法来做到这一点,也许使用 PHP SDK?

我也尝试添加:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch,CURLOPT_SSLVERSION, 6);

编辑:添加CURLOPT_VERBOSE后,我得到以下额外日志:

*   Trying 2a03:2880:f034:112:face:b00c:0:2:443...
* TCP_NODELAY set
* Connected to graph.facebook.com (::1) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /usr/local/etc/openssl/cert.pem
  CApath: /usr/local/etc/openssl@1.1/certs
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to graph.facebook.com:443 
* Closing connection 0
Error:OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to graph.facebook.com:443 

【问题讨论】:

  • 该错误与 SSL 无关,与请求参数或 URL 有关。浏览器和 curl 很可能以不同的方式实现 SSL,并且由于某种原因 PHP 中的 curl 存在问题。
  • 感谢您的提示!知道为什么我有时会得到它而不是其他人。

标签: facebook facebook-graph-api facebook-javascript-sdk facebook-opengraph facebook-php-sdk


【解决方案1】:

这不是一个答案,而是一个解决方法。我用 cURL 尝试了许多不同的配置 - 它们都不可靠。

但是我发现了一种简单的方法可以 100% 工作,那就是使用 file_get_contents()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 2013-10-14
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多