1

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>
<% } %>

它应该显示 Hello 和用户名。

但不是那样,而是显示欢迎!请登录。

4

2 回答 2

2

如果您在 中除用户 ID 以外的任何内容除外req.user,则您在反序列化函数中返回错误信息。

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);
  });
});
于 2018-03-12T17:34:42.530 回答
2

代码库看起来不错。注意到您正在使用与 redis 服务器的连接来存储会话信息:

store:  new RedisStore({
    host: 'localhost',
    port: 6379
}),

你开始了吗?要检查您的 redis 服务器是否正在运行并且您的应用程序是否可以连接到它,您可以查看调试输出

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。我确实在 MAC OS Sierra 上尝试过,它适用于命令:

docker run --name some-redis -p 6379:6379 -d redis

看起来这是您错过的事情 - 启动 redis 服务器。如果你设置它 - 一切都应该运作良好。

于 2018-03-12T02:50:44.810 回答