获得长期令牌时不可靠的结果

问题描述 投票:0回答:1

我在这里遵循有关访问令牌的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秒,但这不会影响结果。

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

也许有更好的方法,也许通过PHP SDK?

我也尝试添加:

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

EDIT:添加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/[email protected]/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 
facebook facebook-graph-api facebook-javascript-sdk facebook-opengraph facebook-php-sdk
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.