Facebook访问令牌无效,错误信息为“会话与当前存储的会话不匹配”?

38

最近我在向 Facebook 的某个应用程序用户的新闻动态流发送帖子时遇到了这个错误,其中30-40%的用户会出现这种情况。 我已经拥有访问令牌的离线访问权限,并且之前它们正常工作。

"Error validating access token: Session does not match current stored session.
This may be because the user changed the password since the time the session
was created or may be due to a system error."
7个回答

40

您的访问令牌可能因为各种原因(过期时间已过,用户更改密码,用户取消授权您的应用,用户退出 Facebook 等)而失效。您应该始终设计以应对此情况。

如果您的用户活跃,则可以轻松地从 OAuth 端点获取新的访问令牌,而无需他们进行/查看任何操作。如果不是这样,您应该制定一个计划(例如通过电子邮件),以便您能够让他们返回并获取新的访问令牌。您所描述的情况并不一定不寻常。您可以在此处找到一些代码示例,以帮助处理过期的访问令牌。


3
好的,开头先道歉一下。我是新来的。我已经阅读了常见问题解答,看到了关于“推销自己的产品”的问题(http://stackoverflow.com/faq#promotion),其中提到“您必须在您的回答中披露您的从属关系”。我猜社区不会认为这是“推销自己的产品”吧? - Jeff Bowen
4
@Jeff Bowen 这并没有解答为什么访问令牌会随机停止工作,然后稍后又能正常工作。没有30-40%的用户撤销或更改了密码。我相当确定这是Facebook的一个错误。 - bkaid
OffBySome,访问令牌数量失效的原因还有其他可能,所以30-40%的比例并不一定会引起我的警觉,但是如果您看到访问令牌停止工作然后再次工作,那就像是一个漏洞。请尽可能提供详细信息,在我们的Bug跟踪器中提交它(如果将其标记为“保密”,您可以包括相关的访问令牌,我们可以查看它们)。如果您这样做,请在这里添加一个bug链接给大家。 - Jeff Bowen
@Jeff Bowen,如果一个带有offline_access的访问令牌 a) 我没有取消授权,b) 过期时间是无限的,c) 对于offline_access来说注销是无意义的,并且正如提到的那样,它会随机失败,然后随机工作。这是与某些反欺诈算法相关的吗?一些基于IP的标准? - DhruvPathak
2
链接已损坏,Facebook 的链接处理能力不佳? - sihrc
显示剩余4条评论

3

3

这并没有记录在文档中,但我刚刚测试过了,即使使用过期的访问令牌也可以工作。如果你知道用户ID,并且他们没有撤销你的应用程序的权限,那么它应该也可以处理已经失效的访问令牌。首先,你可以通过调用以下URL来验证你仍然拥有所需的权限:

https://graph.facebook.com/userID/permissions?access_token=appID|appSecret

如果您仍然拥有publish_stream权限,则可以向此URL发出HTTP POST请求:

https://graph.facebook.com/userID/feed ,并使用access_token=appID|appSecret&message=test message作为POST参数。


1
为什么使用 offline_access 权限接收的访问令牌会在同一天内过期?我甚至在同一天都会收到错误,并且这是随机的。 - DhruvPathak
因为你正在处理Facebook。其他人也遇到了这个问题,这里有另一个案例:https://dev59.com/21fUa4cB1Zd3GeqPEhq4 - bkaid
是的,这确实是一个随机问题,而且 Facebook 没有任何相关文档。如果有其他开发人员发现了自己的黑科技或解决方法,我很想了解。 - DhruvPathak
我刚刚尝试了这个,它起作用了。谢谢你提供的信息。 - Jay Taylor

3

关于令牌为何会很快过期,似乎有很多疑问。我认为我可以解答一些问题。以下是我发现导致令牌过期的情况:

显而易见的一种情况是用户更改了密码。这方面您无法做什么。他们需要重新授权您的应用程序。其余的情况涉及页面令牌,它们类似于用户个人资料的令牌,但是它们来自使用有效管理员用户令牌查询/me/accounts的页面。这些似乎更容易过期。

看起来,如果页面的任何管理员更改其密码(不一定是您正在使用其令牌的那个管理员),这都可能导致令牌过期。此外,如果您的系统中有一些带有相同管理员的页面,则经常调用/me/accounts会刷新该用户管理的所有页面的所有令牌。这意味着如果要为已有页面的用户连接新页面,则需要使用/me/accounts提供的新页面令牌更新现有页面令牌。

最后,在我的系统中处理此问题的方式是将管理员用户和令牌存储为页面令牌在我的数据库中的父级。这样,当我需要重新连接页面或添加新页面时,系统可以查找和更新从/me/accounts接收到的任何相关页面令牌。它还允许您在收到过期令牌异常时通过调用/me/accounts自动尝试刷新令牌。

希望这些能对您有所帮助!


2

当用户更改密码时,离线会话令牌会发生变化。如果以前工作的会话突然停止(并且您收到该错误),则用户的密码已更改(可能是由用户更改),您需要重新提示他们授予您离线访问权限并保存您获得的新会话令牌。


那个错误不同。OAuthException,Error validating access token: The session has been invalidated because the user has changed the password 我也遇到过这个问题,但只有很少一部分用户会出现,然而这个错误却出现在大量的用户身上。 - DhruvPathak
1
奇怪:你可能遇到了一个真正的错误。请参见http://bugs.developers.facebook.net/show_bug.cgi?id=17485获取详细信息(假设您还没有看到)。 - Femi
谢谢。看到了。不过我希望有一些解决方法。 - DhruvPathak

1
在我的情况下,我必须生成一个新的页面访问令牌,因为我更改了我的Facebook密码。
您可以通过转到https://developers.facebook.com,单击您的应用程序,在左侧菜单中选择Messenger,然后选择设置,然后滚动到访问令牌,单击生成令牌,复制令牌并将其粘贴到您的配置文件中。

1
我在使用命令行工具访问帖子评论时也遇到了这个问题。在我的情况下,一切都正常工作,直到突然出现以下错误:

远程服务器返回错误:(400)错误请求。

经过诊断,我发现Facebook访问令牌会在一段时间后过期,即使我使用以下offline_access选项创建它:

https://www.facebook.com/dialog/oauth?client_id=[APPID]&redirect_uri=[URL]&scope=user_photos,email,user_birthday,user_online_presence,offline_access

在进行了大量的研究和开发后,我发现应用程序的高级设置中有一个选项可以移除离线访问权限。我的客户已经启用了该选项,这就是我的令牌过期的原因。请查看下面的图片:

Facebook offline access token


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接