要求的事情.使用google-passport-oauth登录后,用户未定义

req.user is undefined after logging in with google-passport-oauth

本文关键字:登录 用户 未定义 google-passport-oauth 使用      更新时间:2023-09-26

我使用Google账号成功登录后,在回调请求中,req.user被设置为正确的用户,req.isAuthenticated()为true。太棒了!

然而,任何后续请求都将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;

我做错了什么吗?

我希望我能评论一下而不是直接回答这个问题。

你能试着运行这个吗?

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 connectedapps