使用 google-passport-oauth 登录后 req.user 未定义

Posted

技术标签:

【中文标题】使用 google-passport-oauth 登录后 req.user 未定义【英文标题】:req.user is undefined after logging in with google-passport-oauth 【发布时间】:2015-10-18 09:19:22 【问题描述】:

我使用谷歌账号登录成功后,在回调请求中,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;

我做错了吗?

【问题讨论】:

【参考方案1】:

我希望我可以发表评论而不是直接回答这个问题。

您可以尝试运行它吗?

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

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

【讨论】:

感谢您抽出宝贵的时间.. 但它没有用。我厌倦了没有结果的调整属性 :( 有时 Node 根本没有帮助 :( 很遗憾听到这个消息,否则代码对我来说看起来不错。祝你好运! 我想到了一些可行的方法。由于在重定向之前一切似乎都有效,因此我用另一种可能的解决方案更新了我的答案。 再次感谢@edwinlin1987。但它仍然不起作用。在这个特定的点上req.user 在那里,但它不在未来的请求中。我确信这与我的应用程序无法持久会话或 cookie 有关。如果你知道我该如何检查我会很感激。 req.session.save 不会触发任何异常。【参考方案2】:

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

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

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

【讨论】:

以上是关于使用 google-passport-oauth 登录后 req.user 未定义的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”