【问题标题】: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)

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

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

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2017-07-17
      • 1970-01-01
      • 2019-06-23
      • 2013-05-30
      相关资源
      最近更新 更多