访问护照中的会话信息

Posted

技术标签:

【中文标题】访问护照中的会话信息【英文标题】:Accessing session information in passport 【发布时间】:2016-04-17 09:38:39 【问题描述】:

编写一些代码来使用护照验证用户,目前使用的是 passport-linkedin-oauth2、passport-google-oauth2、passport-facebook 和 passport-twitter。

好的,我使用哪些并不重要,但了解一下可能会有用。 我想做的是找出一种简单的方法将变量传递给后端代码以做出决定。举个例子。目前,系统仅根据天气做出决定,认证是否有效。如果您去注册或登录,然后按 google 按钮,您将登录。

但是,我希望代码能够确定请求来自注册(在这种情况下,新用户成功,现有用户应发回代码和消息,说明“用户已注册”)。 与登录相同。 “现有”用户显然是成功的,但是,如果您按“登录”并且它是新用户,它将返回一条消息,说明“用户未注册”,这允许前端显示一个漂亮的按钮,说明“注册”用户”。

我的问题是,将它传递到后端的平滑方法是什么。 目前调用的两条路由是:

// =====================================
// Google ROUTES =====================
// =====================================
// route for google authentication and login
router.get('/at/google', passport.authenticate('google',  scope : 'email' ));

// handle the callback after Google has authenticated the user
router.get('/cb/google',
    passport.authenticate('google', 
        successRedirect : '/',
        failureRedirect : '/login',
        failureFlash: true //This is where we send the failed logins
    ));

完美运行,但它们确实调用了同一个对象,因为我真的很懒,想要一个对象来处理所有事情。

我厌倦了在上一页(注册页面)设置会话值:

router.get('/login', function(req, res) 
    req.session.passportOpType = "login";
    res.render('login.ejs',  title: 'Betchanow - Social betting as it should be' , loginUrl: cfgWebPage.loginUrl, trackingID: cfgWebPage.googleTracking.trackingID, message: req.flash('loginMessage') );
);

router.get('/signup', function(req, res) 
    req.session.passportOpType = "signup";
    res.render('signup.ejs',  title: 'Betchanow - Social betting as it should be' , loginUrl: cfgWebPage.loginUrl, trackingID: cfgWebPage.googleTracking.trackingID, message: req.flash('signupMessage') );
);

然后在护照的谷歌端拿起它

// =========================================================================
// GOOGLE ==================================================================
// =========================================================================
passport.use(new GoogleStrategy(

        clientID        : configAuth.googleAuth.clientID,
        clientSecret    : configAuth.googleAuth.clientSecret,
        callbackURL     : configAuth.googleAuth.callbackURL,
        passReqToCallback   : true

    ,
    function(request, accessToken, refreshToken, profile, done) 

        // make the code asynchronous
        // User.findOne won't fire until we have all our data back from Google
        process.nextTick(function(req) 
            console.log("This is a " + req.session.authtype)

但是,此阶段的值未定义。 这可能是因为它的回调。

不确定是否保留会话存储。我现在的问题是。如何以直接的方式完成此任务,最好独立于我使用的护照类型?

【问题讨论】:

【参考方案1】:

好的,搜索更好的搜索词就可以了。 Using PassportJS, how does one pass additional form fields to the local authentication strategy?

诀窍是使用passReqToCallback : true,我已经这样做了,但不太清楚它做了什么。

如果您将 req.session.foo 设置为说“你好”,那么它将在会话中持续存在。 然后当打开“passReqToCallback”时,它会将req作为第一个输入传递给函数(上面代码中的请求)。那时您现在可以阅读 请求.session.foo。

【讨论】:

以上是关于访问护照中的会话信息的主要内容,如果未能解决你的问题,请参考以下文章

快速护照会话不起作用

会话创建和会话销毁事件中的 Spring 安全访问用户详细信息

使用护照 + JWT 或会话保护 GraphQL API? (举例)

Nodejs中的护照OAuth2Strategy是不是对访问令牌发出自动POST请求

Apollo express 没有快速护照会话

不在护照快递服务器上保存会话