Twitter API - “无效或过期令牌”的原因
Posted
技术标签:
【中文标题】Twitter API - “无效或过期令牌”的原因【英文标题】:Twitter API - Reasons for "invalid or expired token" 【发布时间】:2013-07-12 06:46:23 【问题描述】:可能导致令牌过期的可能原因有哪些(除了让用户取消对应用的授权)?
我的问题是我有一个拥有数千名用户的应用程序,所有 API 通信都运行良好,但对于某些用户,我收到 invalid or expired token
错误,我最初的想法是他们是取消应用程序身份验证的用户但我已经联系了他们中的一些人,他们并没有撤销访问权限。
您知道还有哪些其他问题会导致该错误吗?
【问题讨论】:
最近,twitter 改变了它的 api。现在每小时可以从外部 api 发布 180 条消息。如果用户超过限制,那么 twitter 将取消他们的身份验证以发送任何进一步的消息。如果超过限制,请检查您的申请。 谢谢@krishnasahoo 我知道API 1.1 版中在速率限制方面所做的更改。但是当超过速率限制时,你会得到一个“速率限制”错误,而不是我上面描述的错误 感谢您的详细回复,我已经熟悉您上面提到的内容,我认为这不是问题,因为如果我不遵守其中一个问题,那么任何 API 调用都不会通过,正如我提到的,它只发生在我的一小部分用户身上。目前我的猜测是,更改其 Twitter 用户名的用户会发生这种情况,也许这样做时,用户会自动从所有应用程序中取消身份验证。 【参考方案1】:在使用访问令牌时调用GET account/verify_credentials,随时检查访问令牌的完整性。
它被提及并且通过研究我了解到:
如果用户明确拒绝您的访问令牌,您的访问令牌将无效 应用程序,或者如果 Twitter 管理员暂停您的 应用。如果您的申请被暂停,将会有关于 您的申请页面说它已被暂停。
为什么我的 twitter oauth 访问令牌无效/过期?
查看此帖子:invalid / expired access tokens。
谷歌群组中有一篇帖子说:
您没有第二次机会,这是设计使然。 OAuth 请求 有一个独特的签名;一旦提交了特定的请求,它 不能再次提交。 如果他们正确输入了密码,一切都很好,你会得到一个访问令牌。 如果他们输入错误的密码,你会得到 401 Unauthorized - 这是 预期的。 但如果他们再次尝试输入密码,即使是正确的密码 显示为未经授权。
查看此link 以获取上述参考。
twitter 员工对同一问题的一些建议:
我想此时我会建议两件事:1.)转到 您的应用程序设置并使用“重置密钥”选项卡重置您的 消费者密钥和秘密,然后在应用程序中更新这些值并 验证您是否仍然看到相同的行为。 2.) 尝试通过 oauth_callback 在您的 request_token 调用中。老实说我不这么认为 会有所作为,但我想尝试尽可能严格 在这里。
也检查这个discussion说:
您需要使用从返回的 oauth_token 和 oauth_token_secret oauth/access_token 调用,而不是应用设置中的调用 在 dev.twitter.com 中
【讨论】:
感谢您的详细回复,我已经熟悉您上面提到的内容,我认为这不是问题,因为如果我不遵守其中一个问题,那么 API 调用都不会通过,正如我提到的,它只发生在我的一小部分用户身上。目前我的猜测是,更改其 Twitter 用户名的用户会发生这种情况,也许这样做时,用户会自动从所有应用程序中取消身份验证。 请确认用户是否更改了帐户主要信息。如果 twitter 应用程序无法信任某些内容,它将拒绝令牌。请阅读 Twitter API 常见问题解答dev.twitter.com/docs/faq。对于故障排除,您应该阅读故障排除 OAuth 1.0A - 链接 - dev.twitter.com/discussions/204 好吧,我使用了 user.accessToken/Secret .. 效果很好,现在它返回 undefined ,但是 App AccessToken/Secret 仍然可以正常工作。【参考方案2】:我遇到了同样的错误,然后我更改了(access_token) to (access_token_key)
,它对我有用。
我希望它会对某人有所帮助。
【讨论】:
绝对!它节省了大量时间。【参考方案3】:除了其他人制作的 cmets 之外,有时当令牌不是问题时,twitter api 会返回“无效令牌”错误。当我构建一个无法正确解析的请求字符串时,我注意到它最多。例如,一旦我在传递具有不可 URI 编码的符号的屏幕名称时遇到该错误。当我传入这样的空值(光标为空)时,我也得到了它:
https://api.twitter.com/1/followers.json?cursor=&screen_name=whatevah
您能否向我们提供返回此错误的调用的详细信息?
【讨论】:
【参考方案4】:您是否确认这些代币一次性有效?在我使用的 OAuth 系统中,令牌的安全存储和检索方式存在错误,导致一小部分令牌损坏。如果您可以确认这些令牌过去有效,那么这是一个很好的第一步。
当您从存储中检索令牌时,它们是否保持不变?他们是否有可能因为你管理他们的方式而被破坏?
设置一些日志记录以跟踪令牌何时工作和失败。令牌失败一次后是否会再次开始工作?如果您在 30 天内未使用令牌,它会过期吗?有了详细的日志,您就可以开始识别过期的令牌并查找正在使用的模式以指出可能导致它们过期的原因。
一定要探索其他可能性。用户如何在 Twitter 中撤销令牌?很容易不小心这样做吗?对于令牌失败的用户,他们是否还有其他已停止运行的授权应用程序?
【讨论】:
【参考方案5】:首先好问题冉。
我想问你,你经历过 Twitter 开发者吗??
由于 Twitter 提供了两对令牌和库,因此有时使用哪个令牌会变得模棱两可。其中一个是密钥。
您需要选择那些以您的 Twitter ID 开头后跟连字符的令牌。
现在您的问题是您的一些用户会发生此错误。因此,这是应用程序本身在选择令牌时发现模棱两可的答案。
虽然我可能并不完全正确,但我建议您至少尝试一次此解决方案。
【讨论】:
【参考方案6】:这些用户可能没有被撤销访问权限。但根据我的经验,访问令牌也可能在用户(在测试用例中:我)更改他/她的密码后过期。
当用户这样做时,您不能再在该用户的范围内使用流 API 的 REST API。请调整您的应用程序以处理这种情况。撤销用户的会话,因此当他回到您的应用程序时,他/她可以再次重定向到 Twitter 以启动新的 OAuth 访问令牌流程。或者给他/她发一封电子邮件,请求重新连接。 Vimeo/Windows/... 是一些使用电子邮件处理过期令牌的人。
玩得开心!
【讨论】:
【参考方案7】:My God's answer 是正确的,但我将分享my answer from another question,解释它如何成为您计算机的时钟:
如果您的 OAuth 流程前一天正常工作,第二天失败,请检查您计算机的时钟。我正在运行一个 Vagrant 盒子,它不知何故将其时间设置为前一天,这导致 Twitter API 返回 "code":89,"message":"Invalid or expired token."。这也可能显示为 401 时间戳越界。您可以使用此命令在 Ubuntu 中更新您的时钟:
sudo ntpdate time.nist.gov
Alternative method 如果ntpdate
在您的系统上不可用:
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"
【讨论】:
旅行到不同的时区后,我在我的开发系统上使用 Twitter oauth 的所有帐户都遇到了这个问题。在 Mac 上:只需将系统设置中的 ntp 服务器切换到其他选项之一似乎就可以解决问题。【参考方案8】:如果您的访问令牌=738629462149844993-FcWHjfcucCLGEosyGGQ38qI******iC,那么不要忘记在您的 USERID 后面加上连字符 (-)。
【讨论】:
【参考方案9】:这可能对你有帮助。我遇到了同样的问题。
请找到下面这段代码sn-p
$code = $tmhOAuth->user_request(array(
'method' => 'POST',
'url' => $tmhOAuth->url('oauth/access_token', ''),
'params' => array(
'oauth_verifier' => trim($params['oauth_verifier']),
)
));
if ($code == 200)
$oauth_creds = $tmhOAuth->extract_params($tmhOAuth->response['response']);
// echo '<pre>';print_r($oauth_creds);exit;
$tmhOAuth->reconfigure(array_merge($tmhOAuth->config, array(
'token' => $oauth_creds['oauth_token'],
'secret' => $oauth_creds['oauth_token_secret'],
)));
$code = $tmhOAuth->user_request(array(
'url' => $tmhOAuth->url('1.1/account/verify_credentials')
));
【讨论】:
当您使用的令牌过期或无效时会发生此错误。验证您用于访问令牌和访问令牌机密的字符串是否有效。您可能无意中使令牌过期并需要重新生成它们。 为了做你描述的事情,我需要将用户重新发送到 twitter 并重新验证,这是我希望避免的事情......【参考方案10】:错误invalid or expired token
可能与未付款有关。
无需付费就只能创建开发环境(沙盒)。
正如我已经回答here:
Counts 仅适用于付费高级帐户,并且需要付费才能访问高级帐户。
Use this link to Apply for access.
【讨论】:
【参考方案11】:尝试重新生成密钥并正确保存。
对我来说,发生这种情况是因为在重新生成其中一个密钥后我没有更新其他密钥。因此再次删除并重新生成了所有 4 个密钥(CONSUMER_KEY、CONSUMER_SECRET、ACCESS_KEY、ACCESS_SECRET)。并尝试再次执行它,这次它成功了。
【讨论】:
以上是关于Twitter API - “无效或过期令牌”的原因的主要内容,如果未能解决你的问题,请参考以下文章
Twitter REST API 与 Twitter Fabric - Twitter 核心
如何通过 Twitter API https://api.twitter.com/1.1/direct_messages/events/new.json 发送新的直接消息?