使用google-passport-oauthlogin后,req.user未定义

在使用Google帐户成功login后,在callback请求中,将req.user设置为正确的用户,并且req.isAuthenticated()为true。 大!

但是,任何后续请求都会将req.user定义为undefined。 不pipe我做什么。

这个问题同时出现在passport-google-auth2和passport-google-auth中 。

这是我的index.js样子:

 app.set('views', './src/express/views'); app.set('view engine', 'jsx'); app.engine('jsx', expressReactViews.createEngine({ beautify: true })); app.use(express.static('./dist')); app.use(cookieParser()); app.use(bodyParser.json()); app.use( bodyParser.urlencoded({ extended: true })); app.use(session({ secret: 'keyboard cat', proxy: true, resave: true, saveUninitialized: true, cookie: { secure: true } })); app.use(passport.initialize()); app.use(passport.session()); passport.serializeUser(function(user, done) { // user is passed here correctly done(null, user.id); }); passport.deserializeUser(function(userId, done) { db.connect(function(error, connection) { if(error) { done(error); } else { users.find(connection, userId, function (user) { connection.close(); // user is populated here, don't worry :) done(null, user); }); } }); }); passport.use(googleStrategy); 

这就是googleStrategy外观:

 module.exports = new GoogleStrategy( { clientID: '[FAKE]', clientSecret: '[FAKE]', callbackURL: 'http://localhost:3000/auth/google/callback' }, function(accessToken, refreshToken, profile, done) { db.connect((error, connection) => { if(error) { done(error); } else { users.findOrCreateFromGoogleProfile(connection, profile, (error, user) => { connection.close(); done(error, user); }); } }); } ); 

这是我的auth路由器的样子:

 router.route('/google/callback').get(passport.authenticate('google', { failureRedirect: '/error' }), function(req, res) { // here everything works. req.user is correctly set and req.isAuthenticated() is true res.redirect('/index'); }); router.route('/google').get(passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'] })); module.exports = router; 

我做错了什么?

我希望我可以发表评论,而不是直接回答这个问题。

你可以尝试运行这个呢?

 router.route('/google/callback').get(passport.authenticate('google', { failureRedirect: '/error' }), function(req, res) { // here everything works. req.user is correctly set and req.isAuthenticated() is true req.session.save(function(err) { res.redirect('/index'); }); }); 

由于一切似乎工作,直到redirect后,这可能会解决这个问题。

我会猜测用户信息没有被保存到数据库。

如果您转到以下链接并从已批准的已连接应用程序/站点列表中删除您的应用程序/站点,那么您是否可以再次login?

https://myaccount.google.com/security#connectedapps