Ненадежные результаты при получении долгоживущего токена - PullRequest
0 голосов
/ 07 февраля 2020

Я следую инструкциям FB по токенам доступа здесь: https://developers.facebook.com/docs/facebook-login/access-tokens

Они говорят, чтобы получить краткосрочный токен от клиента, используя Javascript SDK, который я сделал. Я получаю действительный краткосрочный токен каждый раз во время тестирования без каких-либо проблем.

Затем на сервере я делаю запрос cURL на URL-адрес, структурированный так:

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);

Я использовал это, потому что это то, что было успешно вызвано в моем браузере, когда я go на URL. Однако я также попытался удалить ненужные заголовки и получил столь же непредсказуемые результаты.

Кажется, что это не имеет никакого отношения к пределам запросов, поскольку я нахожусь в <1% от квоты моего приложения. Я также пытался ждать> 10 секунд между запросами cURL, и это не влияет на результаты.

Странно то, что 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 

1 Ответ

0 голосов
/ 07 февраля 2020

Это не столько ответ, сколько обходной путь. Я пробовал много разных конфигураций с cURL - ни одна из них не была надежной.

Однако я нашел один простой метод, который работал бы 100% времени, который должен был использовать file_get_contents().

...