我使用以下代码获取持票人令牌:
$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"}]}
我做错了什么?
答案 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相关的事项:
当您最终获得访问令牌时,请确保将其缓存以避免速率限制。我相信你每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/”,它开始工作。希望有人可能在问题中遇到这个问题