req.session.passport 和 req.user Blank ,并且 req.isAuthenticated 在使用 Passport-facebook 首次成功登录后返回 false

2024-03-22

从 Facebook 初始成功登录并使用 Passport-facebook 1.0.3 和 Express 4.6.1 进行登录重定向回调后,req.session.passport 和 req.user 包含序列化调用期间设置的值(我从策略中获得),但在随后访问网站上的不同路由时,req.session.passport 和 req.user 为空,并且 req.isAuthenticated() 返回 false,因此在从 FB 首次成功登录后,所有其他路由上的 EnsureAuthentication 方法都会失败。 我没有使用集群设置,所以我相信内存存储足以处理这个问题,快速配置看起来很好(我的意思是顺序),这是我的快速配置

configExpressApp.set('views',  './views');
configExpressApp.set('view engine', 'jade');
configExpressApp.use(morgan('dev'));
configExpressApp.use(cookieParser());
configExpressApp.use(bodyParser.urlencoded({
  extended: true,
}));
configExpressApp.use(bodyParser.json());
configExpressApp.use(expressSession({
  secret:'MyExpressSecret', 
  saveUninitialized: true,
  resave: true
}));
configExpressApp.use(passport.initialize());
configExpressApp.use(passport.session());
configExpressApp.use(methodOverride());
configExpressApp.use(express.static('./public'));   

这是初始成功登录和重定向时的 req.session 对象, request.user 包含与 req.session.passport.user 相同的数据

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  passport: 
   { user: 
      { _id: 53ce23e3121421f229a438f8,
        info: false,
        loginType: 'fb',
        fbId: 'MyId',
        name: 'Karthic Rao',
        email: '[email protected] /cdn-cgi/l/email-protection'

        }
     }
} 

这是我之前与策略内以及序列化调用内的 did() 回调关联的信息。成功登录和回调后,我使用 res.redirect 将用户重定向到不同的路由,但来自该路由的请求包含 sessionID (所以我认为这不是会话存储的问题),而是 req.user字段不存在(可能是因为passport.initialize()和passport.session()中间件找不到要验证的请求)并且req.session.passport字段为空,以下是req的console.log中的详细信息目的 。

sessionID: 'I9R1c3PIYgDW5OpWbNT7qb02Hn4lOeAB',
session: 
   { cookie: 
      { path: '/',
        _expires: null,
        originalMaxAge: null,
        httpOnly: true },
     passport: {} },

这是我的反序列化方法

passport.deserializeUser(function(user, done) {
    console.log('deserialize loginType facebook');
    db.collection("users").findOne({
        fbId: user.id
    }, function(err, docs) {
        console.log(docs);
        done(err, docs);
    });
});

这是我的序列化方法

passport.serializeUser(function (user, done) { 
    console.log(user);
    done(null, user);
});

这对我的发展造成了很大的阻碍,我该如何解决这个问题?


好吧,如果您可以在使用策略的地方添加代码(应该在中间件中),这将使我们对问题有一个完整的了解,因为我们需要知道发送到哪个对象serializeUser.

(非常)基本上,当用户尝试进行身份验证时,事情会这样发生:

  • Passport 尝试根据 Facebook 服务器验证您的用户身份
  • 如果成功,则调用回调函数(或 successRedirect) 包含用户详细信息的对象
  • 然后,Passport 拨打电话req.login存储一些信息 会话中的用户
  • Then serializeUser被调用并有效存储数据you会话中指定。

但从你发布的代码来看,我怀疑在你的deserializeUser, user.id是未定义的,因为user存储在会话中的对象使用名为的 ID 字段_id并不是id.

如果你改变

 db.collection("users").findOne({
        fbId: user.id

to

db.collection("users").findOne({
        fbId: user._id
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

req.session.passport 和 req.user Blank ,并且 req.isAuthenticated 在使用 Passport-facebook 首次成功登录后返回 false 的相关文章

随机推荐