Войти через гугл используя паспорт js

https://github.com/harshitKyal/loginWithGoogle

это моя ссылка на репозиторий github. Я использую паспорт JS для входа в систему с Google. Я создал ключ клиента и секретный ключ на консоли разработчика 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 и имя пользователя.

Но вместо этого отображается Welcome! Пожалуйста, войдите.

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 отсутствует.

Чтобы это исправить, вы можете:

а) установить и запустить Redis локально

б) Используйте изображение докера. Для этого требуется установить докер. Я попробовал это на MAC OS Sierra, он хорошо работает с командой:

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

Похоже, это то, что вы пропустили - запустить сервер Redis. Если вы настроите это - все должно работать хорошо.

Если вы исключаете что-то отличное от идентификатора пользователя в req.user, вы возвращаете плохую информацию в своей функции десерализации.

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

Вам нужно обновить его, чтобы фактически получить данные с сервера Redis.

От serializeUserвы получаете объект пользователя, который вам нужно превратить в идентификатор пользователя. Если ваш идентификатор хранится в user.idтогда ваша функция будет выглядеть так:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

От deserializeUser, вы получаете идентификатор пользователя, который вам нужно превратить в объект пользователя. Если вы храните своих пользователей в MongoDB (и используете mongoose), а идентификатор пользователя находится под user.idВаша функция будет выглядеть так:

passport.deserializeUser(function(id, done) {
  User.findOne({ id: id }, function(err, user) {
    done(err, user);
  });
});