【问题标题】:Twitter 1.1 OAuth authenticity_token_error(99)Twitter 1.1 OAuthauthentity_token_error(99)
【发布时间】:2018-09-30 06:28:15
【问题描述】:

我使用以下代码获取不记名令牌:

$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"}]}

我做错了什么?

【问题讨论】:

  • 嗯,很可能凭据不正确,因此无法对其进行身份验证?

标签: php curl twitter-oauth


【解决方案1】:

在与这个问题斗争了一段时间后,我发现问题是我正在使用 Advanced Rest Client 从我已经登录到 Twitter 的浏览器中调用 /oauth2/token。退出 Twitter 并再次调用 API 后,它工作正常。

简答:确保在尝试请求不记名令牌时,您尚未将活动会话登录到 Twitter。

【讨论】:

  • 你救了我的命。
  • OMFG.... WHYYYYYYYY?!?!我以为我受到了速率限制之类的。(谢谢!)
【解决方案2】:

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

我的问题是我使用的是我找到的混搭代码,并且标头使用不正确:

$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 标头使用的是键值格式,而 content-type 标头不是。这破坏了授权标头。

还有一些与错误 99 相关的其他检查事项:

  1. 验证您的凭据是否正确且经过 base64 编码(见上文)
  2. 确保请求使用的是 POST
  3. 确保设置了内容类型(见上文)
  4. 确保您将 grant_type=client_credentials 作为帖子字段。
  5. 需要 SSL,确保正在使用 (https://)
  6. 尝试verbose logging 帮助调试。它应该包括 SSL 证书信息、您的授权标头和内容类型标头。不过,这不会显示 grant_type 字段,只显示标题。
  7. 如果一切正常,但仍然无法正常工作,您可能会受到速率限制。速率限制每 15 分钟重置一次。

当您最终获得访问令牌时,请确保将其缓存以避免速率限制。我相信你每 15 分钟就会收到 450 个请求。如果您不缓存访问令牌,其中一半将用于获取访问令牌!

【讨论】:

  • 就个人而言,我在编码密钥+秘密之前缺少“基本”
【解决方案3】:

这里已经有一个公认的答案,但以防万一有人浏览这篇文章并遇到与我相同的问题......

Twitter 文档供参考 -> OAuth 2.0 docs

误解 #1: 授权字符串是使用 consumer key(又名 API-Key)和 consumer secret(又名 API 密钥)。在developer.twitter.com 的 UI 中,这些凭据的显示不如apps.twitter.com 明显。尽管如此,常见的 RIF 问题。

误解 #2: 这并不是真正的误解,而是在 base64 编码连接 Consumer Key+":"+Consumer Secret 的 url 时的实现错误。如果不以编程方式执行此操作一定要检查任何地方的空格(尤其是在 : 周围)你是 base64 编码的连接字符串。

还有一点建议,邮递员有一个很棒的实用程序,它可以让其余的调用检索一个 oauth2.0 令牌(以及其他身份验证令牌),这对我在尝试使用需要的 api 时很有用oauth1.0 令牌

【讨论】:

    【解决方案4】:

    在解决了这个问题之后,我终于想出了解决方案。如果任何地方都存在错误,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 绕过对处理程序 cors 的请求

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 2013-06-10
      • 1970-01-01
      • 2014-08-06
      • 2013-12-07
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多