访问护照中的会话信息
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? (举例)