https://github.com/harshitKyal/loginWithGoogle
这是我的github回购链接。我使用护照js登录谷歌。我在google开发者控制台创建了客户端密钥和密钥。在运行代码时,它将我重定向到成功页面,但req.user对象未定义。请指导我完成这个。我从https://github.com/mstade/passport-google-oauth2/tree/master/example
中获取了代码app.get( '/auth/google/callback',
passport.authenticate( 'google', {
successRedirect: '/',
failureRedirect: '/login'
}));
app.get('/', function(req, res){
res.render('index', { user: req.user });
});
此代码将我重定向到索引页面。但在索引页面我写了
<% if (!user) { %>
<h2>Welcome! Please log in.</h2>
<% } else { %>
<h2>Hello, <%= user.displayName %>.</h2>
<% } %>
它应该显示 你好和用户的名字。
但不是那样,它显示欢迎!请登录。
答案 0 :(得分:2)
代码库看起来不错。注意到您正在使用与redis服务器的连接来存储会话信息:
store: new RedisStore({
host: 'localhost',
port: 6379
}),
你开始了吗?要检查您的redis服务器是否正在运行且您的应用程序是否可以连接到它,您可以查看debug output:
export DEBUG=*
//and then run your app
node example/app.js
如果您发现很多错误,例如:
connect:redis Redis returned err { Error: Redis connection to localhost:6379 failed - connect ECONNREFUSED 127.0.0.1:6379
at Object.exports._errnoException (util.js:1020:11)
at exports._exceptionWithHostPort (util.js:1043:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1086:14)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
然后,您的redis连接丢失了。
要解决此问题,您可以:
a)在本地安装并运行redis
b)使用docker image。这需要安装docker。我确实在MAC OS Sierra上尝试过,它与命令配合良好:
docker run --name some-redis -p 6379:6379 -d redis
看起来这是你错过的东西 - 启动redis服务器。如果你设置它 - 一切都应该运作良好。
答案 1 :(得分:1)
如果您在req.user
中除了用户ID以外的任何内容,则表示您在deseralize函数中返回错误信息。
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
您需要更新它以实际从Redis服务器获取数据。
从serializeUser
,您将获得一个需要转换为用户ID的用户对象。如果您的ID存储在user.id
下,那么您的功能将如下所示:
passport.serializeUser(function(user, done) {
done(null, user.id);
});
从deserializeUser
,您将获得需要转换为用户对象的用户ID。如果您将用户存储在MongoDB中(并使用mongoose),并且用户ID位于user.id
下,则您的函数将如下所示:
passport.deserializeUser(function(id, done) {
User.findOne({ id: id }, function(err, user) {
done(err, user);
});
});