Node.js 如何将req参数绑定或传递到Passport.js JWT策略?

Node.js 如何将req参数绑定或传递到Passport.js JWT策略?,node.js,passport.js,Node.js,Passport.js,当用户通过身份验证时,我想在数据库中存储信息。信息来自请求中的客户端。以下代码抛出错误,表示未定义req 控制器: exports.verifySession = async function(req, res, next) { let responses = []; passport.authenticate('jwt', async (error, result) => { if (error) { email.sendError(res, error);

当用户通过身份验证时,我想在数据库中存储信息。信息来自请求中的客户端。以下代码抛出错误,表示未定义req

控制器:

exports.verifySession = async function(req, res, next) {
  let responses = [];
  passport.authenticate('jwt', async (error, result) => {
    if (error) {
      email.sendError(res, error);
    } else if (result === false) {
      responses.push(new CustomResponse(1).get());
      return res.status(422).json({ data: { errors: responses } });
    }
    if (result.SessionToken) {
      return res.status(200).json('valid');
    } else {
      return res.status(401).json();
    }
  })(req, res, next);
};
和passport.js:

passport.use(
  new JWTstrategy(
    {
      // We expect the user to send the token as a query paramater with the name 'token'
      jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),
      // Secret we used to sign our JWT
      secretOrKey: config.jwtkey
    },
    async (token, done) => {
      console.log(req.body);
      try {
        const user = new User();
        user.UserID = token.user.UserID;
        user.SessionToken = token.user.SessionToken;
        user.SessionDate = token.user.SessionDate;
        user.ProviderID = token.user.ProviderID;
        // Verify session token
        await user.verifySessionToken(user, async (error, result) => {
          if (error) {
            return done(error);
          } else if (result.returnValue === 0) {
            return done(null, token.user);
          } else if (result.returnValue !== 0) {
            return done(null, result);
          }
        });
      } catch (error) {
        done(error);
      }
    }
  )
);
您可以使用passport的passReqToCallback功能将请求正文传递给passport

从passport.js官方文档:

JWT认证策略的构造如下:

新JwtStrategyoptions,请验证

选项是一个对象文字 包含用于控制如何从中提取令牌的选项 请求或验证

。。。

passReqToCallback:如果为true,则请求将被传递给verify 回拨。i、 e.验证请求、jwt_有效载荷、完成_回调

您可以尝试以下方法:

passport.use(new JWTstrategy({
    // We expect the user to send the token as a query paramater with the name 'token'
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),

    // Secret we used to sign our JWT
    secretOrKey: config.jwtkey,

    //this will help you to pass request body to passport
    passReqToCallback: true
}, async (req, token,done) => {

    //req becomes the first parameter
    // now you can access req.body here
})
注意:req成为回调函数的第一个参数,而不是令牌,当您使用passport的passReqToCallback时,您可以使用passport的passReqToCallback功能将请求正文传递给passport

从passport.js官方文档:

JWT认证策略的构造如下:

新JwtStrategyoptions,请验证

选项是一个对象文字 包含用于控制如何从中提取令牌的选项 请求或验证

。。。

passReqToCallback:如果为true,则请求将被传递给verify 回拨。i、 e.验证请求、jwt_有效载荷、完成_回调

您可以尝试以下方法:

passport.use(new JWTstrategy({
    // We expect the user to send the token as a query paramater with the name 'token'
    jwtFromRequest: ExtractJWT.fromAuthHeaderAsBearerToken(),

    // Secret we used to sign our JWT
    secretOrKey: config.jwtkey,

    //this will help you to pass request body to passport
    passReqToCallback: true
}, async (req, token,done) => {

    //req becomes the first parameter
    // now you can access req.body here
})
注意:当您使用passport.js文件中是否出现错误?passport.js文件中是否出现错误?使用passport.js文件时,req将成为回调函数的第一个参数,而不是令牌?