Ошибка токена подлинности Twitter 1.1 OAuth (99)
Я использую следующий код для получения токена носителя:
$token = base64_encode($client_id.':'.$client_sec);
$data = array ('grant_type' => 'client_credentials');
$data = http_build_query($data);
$header = array(
'Authorization: Basic '.$token,
'Content-type: application/x-www-form-urlencoded;charset=UTF-8',
'Content-Length: ' . strlen($data)
);
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => 'https://api.twitter.com/oauth2/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POSTFIELDS => $data
);
$ch = curl_init();
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
print_r($result);
exit;
но выводить все время:
{"errors":[{"label":"authenticity_token_error","code":99,"message":"Unable to verify your credentials"}]}
что я делаю не так?
4 ответов
после борьбы с этой проблемой некоторое время я обнаружил, что проблема заключалась в том, что я делал вызов /OAuth2/token, используя расширенный клиент Rest из браузера, с которым я уже вошел в Twitter. После выхода из Twitter и повторного вызова API он работал нормально.
короткий ответ: убедитесь, что у вас еще нет активного сеанса, зарегистрированного в Twitter при попытке запросить токен носителя.
Я некоторое время боролся с этим, и ни один из ответов, которые я нашел, не помог. Документация для ошибки также является расплывчатым "что-то пошло не так".
моя проблема в том, что я использовал mashup кода, который я нашел, и заголовки не были использованы правильно:
$headers = array(
'Authorization' => 'Basic ' . base64_encode($appid . ':' . $secret), // WRONG!!!
'Authorization: Basic ' . base64_encode($appid . ':' . $secret), // Correct!
'Content-Type: application/x-www-form-urlencoded;charset=UTF-8', // Correct!
);
для меня проблема заключалась в том, что заголовок авторизации использовал формат значения ключа, а заголовок типа содержимого-нет. Это сломало заголовок авторизации.
вот некоторые прочие проверки, которые также относятся к ошибке 99:
- проверьте правильность ваших учетных данных и кодировку base64 (см. выше)
- убедитесь, что запрос использует POST
- убедитесь, что тип содержимого набора (см. выше)
- убедитесь, что вы включили grant_type=client_credentials как поле post.
- требуется SSL, убедитесь ,что используется (https://)
- попробовать многословный logging, чтобы помочь отладки. Он должен включать информацию о сертификате SSL, заголовок авторизации и заголовок типа контента. Однако это не покажет поле grant_type, только заголовки.
- если все выглядит нормально, но все равно не будет работать, вы можете получить ограниченную скорость. Ограничения скорости сбрасываются каждые 15 минут.
когда Вы наконец получите маркер доступа, убедитесь, что вы кэшируете его, чтобы избежать ограничения скорости. Я полагаю, вы получаете 450 запросов каждые 15 минут. Половина этого будет потрачена на получение маркера доступа, если вы его не кэшируете!
после борьбы с этой проблемой, я наконец придумал решение. Twitter на самом деле не отправляет правильное сообщение, если ошибка существует в любом месте.
когда я отправляю запрос от curl, он работает нормально, но когда через код. у меня была такая же ошибка {"errors":[{"label":"authenticity_token_error","code":99,"message":"Unable to verify your credentials"}]}
Итак, что я получил, проблема лежала с заголовком управления доступом. установка этих заголовков не работает для меня
xhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
xhttp.setRequestHeader('Access-Control-Allow-Headers', '*');
xhttp.setRequestHeader('Access-Control-Allow-Origin', '*')
xhttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest')
в качестве обходного пути я просто использовал этот url для обхода запроса к обработчику пдбс
https://cors-anywhere.herokuapp.com/https://api.twitter.com/oauth2/token
добавлено"https://cors-anywhere.herokuapp.com/ " перед фактическим url-адресом, и он начал работать. надеюсь, что кто-то может столкнуться с этой проблемой в проблемы
здесь уже есть принятый ответ, но на всякий случай кто-то прогулялся до этого поста и имел ту же проблему, что и я...
Twitter docs для справки -> OAuth 2.0 docs
Заблуждение № 1: строка авторизации генерируется с помощью ключ (он же API-Key) и секрет (он же секретный ключ API). Отображение этих данных в пользовательском интерфейсе на developer.twitter.com менее очевидны, чем apps.twitter.com. Тем не менее общей проблемой РИФ.
Заблуждение № 2: это на самом деле не заблуждение, а ошибка реализации, когда base64 кодирует URL-адрес, объединенный Consumer Key+":"+Consumer Secret
. Если не делать это программно обязательно проверьте наличие пробелов в любом месте (особенно вокруг:) в конкатенированной строке вы base64 кодирование.
просто немного совет, а почтальон имеет замечательную утилиту, которая делает вызов rest для получения oauth2.0 токен (а также другие токены аутентификации) это было полезно для меня при попытке использовать api с тем, что требовало oauth1.0 токен