我最近在发布到facebook newsfeed stream时遇到此错误 应用用户, 我确实拥有访问令牌的离线访问权限,并且他们有效 以前很好。 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."
答案 0 :(得分:34)
您的访问令牌可能会因variety of reasons无效(过期时间,用户更改密码,用户取消您的应用程序,用户退出Facebook等)。您应该始终考虑这种情况。
如果您的用户处于有效状态,则来自OAuth端点的easy to get是一个新的访问令牌,而无需他们执行/查看任何内容。如果没有,您应该制定计划(例如通过电子邮件发送)以了解如何让他们返回,这样您就可以获得新的访问令牌。您描述的场景不一定是不寻常的。您可以找到一些代码示例here,以获取有关如何处理过期访问令牌的帮助。
答案 1 :(得分:2)
从Facebook正式查看博文:How-To: Handle expired access tokens
答案 2 :(得分:2)
这是没有记录的,但我只是测试了它,它适用于过期的访问令牌。如果您知道他们的用户ID,并且他们没有撤销您的应用程序的权限,则应该使用已经失效的访问令牌。首先,您可以使用以下网址验证您是否仍具有所需的权限:
https://graph.facebook.com/userID/permissions?access_token=appID|appSecret
如果您仍拥有publish_stream权限,则可以向此网址发出HTTP POST:
https://graph.facebook.com/userID/feed
帖子参数为access_token=appID|appSecret&message=test message
答案 3 :(得分:1)
只要用户更改密码,就会更改脱机会话令牌。如果以前工作的会话突然停止(并且您收到该错误),则用户的密码已更改(可能由用户更改),您需要重新提示他们授予您离线访问权限并保存您获得的新会话令牌
答案 4 :(得分:1)
似乎有很多关于为什么你的令牌会如此迅速地过期的问题。我想我可以对此有所了解。以下是我发现的一些导致此问题的情景:
有明显的一个;用户更改了密码。你无能为力。他们需要重新授权您的应用。其余的这些方案处理页面令牌,这类似于用户配置文件的令牌,除了它们来自使用页面的有效管理员的用户令牌查询/me/accounts
。这些似乎更频繁地过期。
似乎如果页面的任何管理员更改了他们的密码(不一定是您正在使用的令牌),这可能导致令牌过期。此外,如果您的系统中有一些页面具有相同的管理员,则调用/me/accounts
通常会刷新此用户管理的页面的所有令牌。这意味着,如果您要为具有现有网页的用户关联新网页,则需要使用/me/accounts
提供的新网页更新现有网页代币。
最后,我在系统中处理此问题的方法是将admin用户和令牌存储为我的数据库中页面令牌的父级。这样,当我需要重新连接页面或添加新页面时,系统可以查找和更新从/me/accounts
收到的任何相关页面令牌。它还允许您在收到过期令牌异常时通过调用/me/accounts
自动尝试刷新令牌。
希望其中一些有帮助!
答案 5 :(得分:0)
我在从命令实用程序访问帖子评论时也遇到了这个问题。在我的情况下一切正常,直到我突然得到错误:
远程服务器返回错误:(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
在RND上浪费了大量时间后,我发现应用的高级设置中有一个选项可用于删除offline_access权限。我的客户启用了它,这就是我的令牌到期的原因。请看下面的图片:
答案 6 :(得分:0)
就我而言,我必须生成一个新的页面访问令牌,因为我更改了 Facebook 密码。
您可以转到 https://developers.facebook.com,点击您的应用,查看左侧菜单,选择 Messenger
,然后选择 Settings
,然后滚动至 Access Tokens
,点击 Generate token
,复制令牌并将其粘贴到您的配置文件中。