4

在我使用谷歌账户成功登录后,在回调请求中,req.user设置为正确的用户并且req.isAuthenticated()为真。伟大的!

但是,任何后续请求都将具有req.user未定义。不管我做什么。

passport-google-auth2passport-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;

我做错什么了吗?

4

2 回答 2

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');
    });
});

由于在重定向之后一切似乎都可以正常工作,因此这可能会解决问题。

于 2015-07-28T01:46:42.570 回答
0

我猜想用户信息没有被保存到数据库中。

如果您转到以下链接并将您的应用程序/站点从批准的连接应用程序/站点列表中删除,那么您是否能够再次登录?

https://myaccount.google.com/security#connectedapps

于 2015-10-14T19:35:27.637 回答