Node.js 使用Express将额外数据包含到Passport中间件中
用户正从另一个应用程序访问我的web路由,其链接以以下形式生成:Node.js 使用Express将额外数据包含到Passport中间件中,node.js,express,authentication,passport.js,Node.js,Express,Authentication,Passport.js,用户正从另一个应用程序访问我的web路由,其链接以以下形式生成:/auth/steam/:id/:token,其中此Passport中间件不需要:id和:token。它们只是我想要跟踪的参数 当用户成功进行身份验证时,我希望能够访问从初始web请求到/auth/steam/的这些值。我的路线目前如下所示: this.app.get('/auth/steam/:id/:token', passport.authenticate('steam'), () => { }); this.app
/auth/steam/:id/:token
,其中此Passport中间件不需要:id
和:token
。它们只是我想要跟踪的参数
当用户成功进行身份验证时,我希望能够访问从初始web请求到/auth/steam/
的这些值。我的路线目前如下所示:
this.app.get('/auth/steam/:id/:token', passport.authenticate('steam'), () => {
});
this.app.get('/auth/steam/return', passport.authenticate('steam', { failureRedirect: '/login' }), (req, res) => {
// Would like access to id and token here
res.render('index');
});
是否可以将数据与请求一起保存到返回路线等我注意到要使用值的地方?我本想进行一次治疗,但希望避免这种情况
谢谢
更新:我尝试使用express session
向会话添加数据,如下所示:
this.app.get('/auth/steam/:id/:token', passport.authenticate('steam'), (res, req) => {
req.session.discord_id = req.params.id;
req.session.token = req.params.token;
this.logger.info('Redirecting to Steam');
});
this.app.get('/auth/steam/return', passport.authenticate('steam', { failureRedirect: '/login' }), (req, res) => {
console.log('session', req.session.token);
res.redirect('/');
});
问题是,当返回到/auth/steam/return
时,会话已使用OpenID请求中的新会话进行了更新。我的数据不再存在。许多人使用express来完成此任务
一旦安装了会话,您只需执行以下操作
req.session.token=req.params.token代码>
然后在另一个处理程序中使用req.session.token
您也可以为passport实例分配属性,但这不是一个好主意。如果我正确理解您的问题,您需要实施自定义登录策略。这可以通过更改策略在策略回调中获取req参数来实现:
passport.use('steam',
new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true
},
function(req, email, password, done) {
//Do your authentication here
/**Some Authentication Logic **/
//Get Parameters from the request object...
var id = req.params.id;
var token = req.params.token
var info = {id:id,token:token};
return done(error,user,info);
});
}));
然后您可以访问请求中的info对象。以下是您将使用的函数类型的示例:
function loginUser(req, res, next) {
passport.authenticate('steam', function(err, user, info) {
//custom callback requires you to login
// your custom variables are in the info object
req.login(user, loginErr => {
if (!loginErr) {
return res.status(200).json({
success: true,
err: null,
message: 'Logged in correctly!',
id: info.id,
token: info.token
});
} else
return res.status(401).json({
success: false,
message: 'Unable to login!'
});
});
})(req, res, next);
}
同样,这可以根据您希望实现的功能进行定制。如果使用自定义回调函数,则需要手动调用req.login函数,但这使您能够更好地控制要实现的函数类型。您显然不需要自定义登录策略,因为Steam有自己的OpenID策略()
使用会话可能是您尝试过的方法,我相信您可以对'/auth/steam/:id/:token'
路由进行一些调整,使其工作。我提供了一个示例,该示例使用express的中间件next()
函数,并包含一个req.session.save()
,将您的passport.authenticate('steam')
调用的顺序与您的另一个回调进行切换(因为passport.authenticate()会重定向您,因此永远无法到达),这实际上会将会话保存回您正在使用的存储(中的文档)。当您返回到'/auth/steam/return'
this.app.get('/auth/steam/:id/:token', (req, res, next) => {
req.session.discord_id = req.params.id;
req.session.token = req.params.token;
this.logger.info('Redirecting to Steam');
req.session.save(next);
}, passport.authenticate('steam'));
我将您推荐的内容放在第一个路由中(在向回调添加req和res args之后),然后尝试登录响应处理程序。这些值未定义,看起来整个会话在到达返回处理程序时都被覆盖了。我的意思是。。。如果您正在重定向,是否可以将所述参数与重定向(如果存在)一起传递?(1)会话更新中lambda函数中的参数不应该是(req,res)=>。。。请求是第一个参数,而不是响应?(2) 关于参数的传递。OpenID(按指定)必须通过返回回调传递和发送到auth端点的其他/未知查询参数。如果steam实现了后端兼容,您只需将参数添加到auth-req,它们应该返回返回路由如果您想尝试cookie-base身份验证,希望它能工作!这正是我想要的。非常感谢。效果很好。您能否解释一下为什么要将回调传递给req.session.save()
?如果由于任何原因保存会话失败,它只允许您支持处理错误。从技术上讲,您不需要将“next”作为回调传递,只需在req.session.save()之后调用它,而无需将回调传递给save(),但从技术上讲,您的会话可能无法保存,并且在返回路线之前,您不会知道它。这里有更多关于快速错误处理的信息:我已经厌倦了您的解决方案,但是会话在回调路径中仍然未定义。请提供一个完整的示例和您正在使用的express session
配置,好吗?非常感谢,这对我很有用,因为我可以向info字段添加任何内容,并在passport自定义中间件中使用它