访问护照

时间:2016-01-12 16:49:15

标签: node.js express passport.js

编写一些代码来使用护照对用户进行身份验证,到目前为止使用passport-linkedin-oauth2,passport-google-oauth2,passport-facebook和passport-twitter。

好吧,我使用哪些并不重要,但知道可能有用。 我想要做的是找出一种简单的方法将变量传递给后端代码来做出决策。所以举个例子。目前,该系统仅根据天气或不进行认证工作来做出决定。如果您要注册或登录,并按下谷歌按钮,您将登录。

但是,我希望代码能够确定请求来自注册(在这种情况下,新用户是成功的,现有用户应该发回代码和消息说明"用户已注册& #34)。 与登录相同。在哪里"现有"用户是一个明显的成功,但是,如果你按"登录"而且它是一个新用户,它会给出一条消息,说明"用户未注册",这允许前端提供一个很好的按钮,说明"注册用户"。

我的问题是,将这个传递到后端是一种顺畅的方式。 目前呼叫的两条路线是:

// =====================================
// 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 个答案:

答案 0 :(得分:0)

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

诀窍是使用我已经做过的passReqToCallback : true但是我不知道它做了什么。

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