Войти через гугл используя паспорт 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);
});
});