在各种情况下,Facebook 内部的 AccessToken(用于 Facebook API 中的各种功能和其他情况)可能会失效。例如,如果用户在使用依赖 Facebook 登录的应用程序的会话之间更改了她的密码。还有一些其他情况。
但是,发生的情况是您的应用程序实际上崩溃了,并出现如下错误:data={"error":{"message":"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 Facebook has changed the session for security reasons.", "type":"OAuthException", "code":190, "error_subcode":460}}
.
Passport 的 Facebook 策略使用 AccessToken,只要用户通过 Passport 登录/验证,它就可供应用程序使用。但是,问题是遇到上述错误时该怎么办。Facebook 提供了一个复杂的重新授权流程作为 PHP 中的示例,但一般意义上是您需要使用 Facebook 重新授权您的应用程序。
问题是,即使从您的 Facebook 页面中删除 Facebook 应用程序,并强制依赖 Facebook 登录的应用程序重新授权自己,Passport + Facebook 策略似乎仍在从浏览器的会话存储中获取最后一个现有的 AccessToken。(至少这是我在 Mozilla/Fx 26 中看到的)。我已经多次重新授权我的应用程序,但是在调试并查看 Passport 返回的内容时,我总是返回相同的无效 AccessToken。似乎如果会话存储中存在 AccessToken,Passport 会选择它而不是从 Facebook 获取新的。
那么有没有一种方法 - 在 Passport + Facebook 策略中 - 基本上忽略或覆盖任何存储的 AccessToken 并总是从 Facebook 请求一个新的,如果发生这种错误?完全不清楚如何实现这一点。谢谢您的帮助。
更新:调用策略的示例代码有refreshToken
一个参数;这是做什么的?这个参数有可能的解决方案吗?
passport.use(new FacebookStrategy(
{
...
},
function(accessToken, refreshToken, profile, done)
{