使用Express将额外数据包含到Passport中间件中

时间:2017-04-17 03:09:05

标签: 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.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请求中的新会话进行了更新。我的数据不再存在。

3 个答案:

答案 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'

时保存会话的discord_id和令牌属性
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

检索它

您也可以为护照实例分配属性,但这不是一个好主意。