用户从另一个应用程序进入我的Web路由,其中包含以此格式生成的链接:/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请求中的新会话进行了更新。我的数据不再存在。
答案 0 :(得分:2)
您显然不想要自定义登录策略,因为Steam拥有自己的OpenID策略(https://github.com/liamcurry/passport-steam)。
使用会话可能是您尝试过的方法,我相信您可以对您的'/auth/steam/:id/:token'
路线进行一些调整以使其正常工作。我提供了一个示例,可以将您的passport.authenticate('steam')
调用的顺序与您的其他回调(由于passport.authenticate()重定向您后无法访问)切换,使用express的中间件next()
功能,并包含req.session.save()
,它实际上将会话保存回您正在使用的商店(https://github.com/expressjs/session中的文档)。如果您使用以下内容作为新路线,请在我回到'/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'));
答案 1 :(得分:1)
如果我正确理解您的问题,您需要实施自定义登录策略。这可以通过更改策略来获取策略回调中的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函数,但这样可以更好地控制您尝试实现的函数类型。
答案 2 :(得分:-1)
很多人使用快递session module来完成这项任务。
安装会话后即可完成
req.session.token = req.params.token;
然后在您的其他处理程序中使用req.session.token
您也可以为护照实例分配属性,但这不是一个好主意。