Lew*_*Lew 5 passport-facebook passport.js
在各种情况下,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)
{
Run Code Online (Sandbox Code Playgroud)
我找到了问题的答案,如果其他人遇到同样的问题,我会把它留下来.
Passport在其VerifyCallback功能中将AccessToken传递给应用程序.建议(默认或其他)当然是将此AccessToken保存为用户持久记录的一部分(例如,MongoDB文档).在对Facebook API进行后续调用时会需要它,虽然可以从request.user通过Express中间件传递的对象中安全地检索它,但是拥有自己的本地副本可能是有意义的.
现在,当您通过Passport对用户进行身份验证时,您仍然会提取用户的持久记录以获取其他用户数据.Passport文档具有一个通用函数,称为Users.findOrCreate()此函数的模型/原型,供您实现.这就是问题所在:如果您通过此功能找到一个用户(一个已经存在),您将在整个应用程序中使用该记录.如果该记录还包含AccessToken,并且AccessToken已更改,那么当然您将遇到麻烦:Passport/Facebook正在向您传递新的AccessToken,但您使用的是过时的.
所以简单的解决方法就是:如果你已经实现了一个Users.findOrCreate()函数来持久化用户并依赖它来检索用户的数据集 - 而且该记录也存储了AccessToken - 那么请确保检查当前(旧)AccessToken为一个Passport/Facebook正在通过你VerifyCallback的用户刚认证时; 如果两者不同,请更新用户的持久记录并使用此新令牌.
| 归档时间: |
|
| 查看次数: |
1410 次 |
| 最近记录: |