编写一些代码来使用passport对用户进行身份验证,到目前为止使用passport-linkedin-oauth2、passport-google-oauth2、passport-facebook和passport-twitter。
好吧,我使用哪种方法并不重要,但知道这一点可能会很有用。我想要做的是找出一种简单的方法来将变量传递给后端代码进行决策。举个例子。目前,该系统仅根据身份验证是否有效来进行判断。如果您去注册或登录,并按下谷歌按钮,您将登录。
但是,我希望代码能够确定请求来自注册(在这种情况下,新用户是成功的,现有用户应该发回一个代码和消息,声明“用户已经注册”)。登录也是如此。“现有的”用户是一个明显的成功,然而,如果你按下“登录”并且它是一个新的用户,它将返回一条消息,声明“用户未注册”,这允许前端呈现一个漂亮的按钮,声明“注册用户”。
我的问题是,怎样才能顺利地将其传递到后端。当前呼叫的两个路由是:
// =====================================
// 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 end of passport上找到
// =========================================================================
// 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)但是,该值在此阶段尚未定义。这可能是因为它是回调。
不确定是否保留会话存储。不过,我现在的问题是。我如何以直接的方式实现这一点,最好是独立于我使用的护照类型?
发布于 2016-01-13 01:13:09
好吧,搜索更好的搜索词确实起到了作用。Using PassportJS, how does one pass additional form fields to the local authentication strategy?
诀窍是使用passReqToCallback : true,我已经这样做了,但不太清楚它是做什么的。
如果您将req.session.foo设置为说"hello“,那么它将在会话中持续存在。然后,当打开"passReqToCallback“时,它会将请求作为第一个输入传递给函数(上面代码中的请求)。此时,您现在可以阅读request.session.foo了。
https://stackoverflow.com/questions/34749316
复制相似问题