req.user не определен после входа в систему с помощью google-passport-oauth

После успешного входа в систему с помощью учетной записи Google в запросе обратного вызова req.user установлен на нужного пользователя и req.isAuthenticated() правда. Большой!

Тем не менее, любой последующий запрос будет иметь req.user как неопределено. Неважно что я делаю.

Проблема возникает как с passport-google-auth2, так и с passport-google-auth.

Вот так мой index.js похоже:

app.set('views', './src/express/views');
app.set('view engine', 'jsx');
app.engine('jsx', expressReactViews.createEngine({ beautify: true }));

app.use(express.static('./dist'));
app.use(cookieParser());
app.use(bodyParser.json());
app.use( bodyParser.urlencoded({
    extended: true
}));
app.use(session({
    secret: 'keyboard cat',
    proxy: true,
    resave: true,
    saveUninitialized: true,
    cookie: { secure: true }
}));
app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function(user, done) {
    // user is passed here correctly
    done(null, user.id);
});
passport.deserializeUser(function(userId, done) {
    db.connect(function(error, connection) {
        if(error) {
            done(error);
        }
        else {
            users.find(connection, userId, function (user) {
                connection.close();
                // user is populated here, don't worry :)
                done(null, user);
            });
        }
    });
});

passport.use(googleStrategy);

А это как googleStrategy похоже:

module.exports = new GoogleStrategy(
    {
        clientID: '[FAKE]',
        clientSecret: '[FAKE]',
        callbackURL: 'http://localhost:3000/auth/google/callback'
    },
    function(accessToken, refreshToken, profile, done) {
        db.connect((error, connection) => {
            if(error) {
                done(error);
            }
            else {
                users.findOrCreateFromGoogleProfile(connection, profile, (error, user) => {
                    connection.close();
                    done(error, user);
                });
            }
        });
    }
);

Вот так мой auth Маршрутизатор выглядит так:

router.route('/google/callback').get(passport.authenticate('google', {
    failureRedirect: '/error'
}), function(req, res) {
    // here everything works. req.user is correctly set and req.isAuthenticated() is true
    res.redirect('/index');
});

router.route('/google').get(passport.authenticate('google', {
    scope: ['https://www.googleapis.com/auth/userinfo.profile',
    'https://www.googleapis.com/auth/userinfo.email']
}));

module.exports = router;

Я делаю что-то не так?

2 ответа

Решение

Я хотел бы прокомментировать, а не прямо ответить на этот вопрос.

Можете ли вы попробовать запустить это вместо?

router.route('/google/callback').get(passport.authenticate('google', {
    failureRedirect: '/error'
}), function(req, res) {
    // here everything works. req.user is correctly set and req.isAuthenticated() is true

    req.session.save(function(err) {

        res.redirect('/index');
    });
});

Поскольку все работает до перенаправления, это может решить проблему.

Я предполагаю, что информация о пользователе не сохраняется в БД.

Если вы перейдете по следующей ссылке и удалите свое приложение / сайт из списка разрешенных подключенных приложений / сайтов, сможете ли вы снова войти в систему?

https://myaccount.google.com/security

Другие вопросы по тегам