【发布时间】: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