Twitter 1.1 OAuth authenticity_token_error(99)

时间:2014-04-20 13:33:11

标签: php curl twitter-oauth

我使用以下代码获取持票人令牌:

$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 个答案:

答案 0 :(得分:16)

在解决这个问题一段时间之后我发现问题是我正在使用Advanced Rest Client从我已经登录到Twitter的浏览器中调用/ oauth2 / token。退出Twitter并再次进行API调用后,它运行正常。

简短回答:确保在尝试请求持有人令牌时,您还没有登录到Twitter的活动会话。

答案 1 :(得分:5)

我挣扎了一段时间,但我找到的答案似乎都没有帮助。错误的文档也是模糊的"出了问题"。

我的问题是我使用的是我发现的代码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!
);

对我来说,问题是Authorization标头使用的是键值格式,而内容类型标头则没有。这打破了授权标题。

以下是要检查的其他一些与错误99相关的事项:

  1. 验证您的凭据是否正确并进行base64编码(参见上文)
  2. 确保请求使用POST
  3. 确保设置了内容类型(见上文)
  4. 确保您将 grant_type = client_credentials 包含在帖子字段中。
  5. SSL是必需的,请确保正在使用(https://)
  6. 尝试使用verbose logging来帮助调试。它应包括SSL证书信息,授权标头和内容类型标头。这不会显示grant_type字段,只显示标题。
  7. 如果一切看起来还不错但它仍然无法正常工作,那么您可能会受到速率限制。每15分钟重置一次限额。
  8. 当您最终获得访问令牌时,请确保将其缓存以避免速率限制。我相信你每15分钟就会收到450个请求。如果你没有缓存它,将有一半用于获取访问令牌!

答案 2 :(得分:1)

这里已经有一个可以接受的答案,但是以防万一有人漫步到这篇文章并遇到与我相同的问题...

Twitter文档供参考-> OAuth 2.0 docs

误解#1::授权字符串是使用消费者密钥(又称为 API密钥)和消费者机密< / strong>(又名 API密钥)。这些凭据在developer.twitter.com上的UI中的显示不如apps.twitter.com那样明显。尽管如此,还是常见的RIF问题。

误解#2:这实际上不是一个误解,而是对以级联方式对Consumer Key+":"+Consumer Secret的url进行base64编码时的一种实现错误。如果没有以编程方式执行此操作,则请确保在您使用base64编码的级联字符串中检查空格(尤其是在:周围)。

邮递员也有一点点建议,它有一个很棒的实用程序,可以进行剩余调用来检索oauth2.0令牌(以及其他auth令牌),这在尝试使用需要使用api的api时对我很有用oauth1.0令牌

答案 3 :(得分:0)

在与这个问题作斗争后,我终于想出了解决方案。如果在任何地方都存在错误,Twitter实际上并没有发送正确的消息。

当我从curl发送请求时,它可以正常工作但通过代码。我有同样的错误{"errors":[{"label":"authenticity_token_error","code":99,"message":"Unable to verify your credentials"}]}

所以我得到了,问题在于使用Access控制头。设置这些标题对我不起作用

     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来绕过处理程序cors的请求

https://cors-anywhere.herokuapp.com/https://api.twitter.com/oauth2/token

在实际网址之前添加了“https://cors-anywhere.herokuapp.com/”,它开始工作。希望有人可能在问题中遇到这个问题