使用护照js登录谷歌

时间:2018-02-27 06:07:31

标签: node.js passport.js google-login google-developers-console passport-google-oauth2

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

它应该显示 你好和用户的名字。

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

2 个答案:

答案 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);
  });
});