使用 google-passport-oauth 登录后 req.user 未定义
Posted
技术标签:
【中文标题】使用 google-passport-oauth 登录后 req.user 未定义【英文标题】:req.user is undefined after logging in with google-passport-oauth 【发布时间】:2015-10-18 09:19:22 【问题描述】:我使用谷歌账号登录成功后,在回调请求中,req.user
设置为正确的用户,req.isAuthenticated()
为真。太好了!
但是,任何后续请求都将 req.user
未定义。不管我做什么。
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;
我做错了吗?
【问题讨论】:
【参考方案1】:我希望我可以发表评论而不是直接回答这个问题。
您可以尝试运行它吗?
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');
);
);
由于在重定向之前一切似乎都可以正常工作,因此这可能会解决问题。
【讨论】:
感谢您抽出宝贵的时间.. 但它没有用。我厌倦了没有结果的调整属性 :( 有时 Node 根本没有帮助 :( 很遗憾听到这个消息,否则代码对我来说看起来不错。祝你好运! 我想到了一些可行的方法。由于在重定向之前一切似乎都有效,因此我用另一种可能的解决方案更新了我的答案。 再次感谢@edwinlin1987。但它仍然不起作用。在这个特定的点上req.user
在那里,但它不在未来的请求中。我确信这与我的应用程序无法持久会话或 cookie 有关。如果你知道我该如何检查我会很感激。
req.session.save
不会触发任何异常。【参考方案2】:
我猜用户信息没有被保存到数据库中。
如果您转到以下链接并将您的应用程序/网站从已批准的连接应用程序/网站列表中删除,那么您是否能够再次登录?
https://myaccount.google.com/security#connectedapps
【讨论】:
以上是关于使用 google-passport-oauth 登录后 req.user 未定义的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?