【问题标题】:Passport JWT Strategy extracting optionsPassport JWT 策略提取选项
【发布时间】:2019-05-21 16:09:33
【问题描述】:

使用 Passport JWT 策略,我通过 params 向下传递令牌,并像 ExtractJWT.fromUrlQueryParameter('secret_token') 这样提取令牌。

但有时我通过header 传递令牌,我想像ExtractJWT.fromHeader('secret_token') 这样提取它。

我如何检查它是如何被传递下来并使用正确的动态提取方法

这是我的代码:

passport.use(new JWTstrategy({
  secretOrKey: process.env.AUTH_SECRET,
  jwtFromRequest: ExtractJWT.fromUrlQueryParameter('secret_token')

}, async (token, done) => {
  try {
    //Pass the user details to the next middleware
    return done(null, token.user);
  } catch (error) {
    done(error);
  }
}));

谢谢!我在这很久了....

【问题讨论】:

    标签: node.js authentication jwt passport.js passport-local


    【解决方案1】:

    使用ExtractJwt.fromExtractors()方法

    var jwtStrategy = new JwtStrategy({
    // this will try to extract from Query parm, header and Authheader
      jwtFromRequest: ExtractJwt.fromExtractors([ExtractJwt.fromUrlQueryParameter("secret_token"), ExtractJwt.fromHeader("secret_token"), ExtractJwt.fromAuthHeaderAsBearerToken()]),
    //here we have defined all possible extractors in an array
      secretOrKey: process.env.AUTH_SECRET
    }, async (payload, done) => {
      ...
    });
    

    【讨论】:

      【解决方案2】:

      已添加从标头中提取令牌的方法。将其传递为:

      • Authorization: Bearer {token}
      • Content-Type : application/json
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案3】:

      试试这个方法:

      const options = {};
      options.jwtFromRequest = ExtractJWT.fromUrlQueryParameter('secret_token')!=undefined?ExtractJWT.fromUrlQueryParameter('secret_token'):ExtractJWT.fromHeader('secret_token');
      options.secretOrKey = process.env.AUTH_SECRET;
      
      passport.use(new JWTstrategy(options, async (token, done) => {
        try {
          //Pass the user details to the next middleware
          return done(null, token.user);
        } catch (error) {
          done(error);
        }
      }));
      

      【讨论】:

      • 对不起,这不起作用,它只会评估第一个参数。
      【解决方案4】:

      答案:

      这里有一个解决方法...

      它会查找名称为 secret_token query paramsheaders

      var url = require('url');
      
      const options = {};
      options.jwtFromRequest = (request) => {
        var token = null;
        var param_name = 'secret_token' //parameter name 
        var parsed_url = url.parse(request.url, true);
      
        if (request.headers[param_name]) {
          token = request.headers[param_name];
        }
        else if (parsed_url.query && Object.prototype.hasOwnProperty.call(parsed_url.query, param_name)) {
          token = parsed_url.query[param_name];
        }
        return token;
      }
      options.secretOrKey = process.env.AUTH_SECRET;
      
      passport.use(new JWTstrategy(options, async (token, done) => {
        try {
          //Pass the user details to the next middleware
          return done(null, token.user);
        } catch (error) {
          done(error);
        }
      }));
      

      【讨论】:

        猜你喜欢
        • 2020-06-09
        • 2018-05-09
        • 2018-03-05
        • 2018-09-14
        • 2021-06-11
        • 1970-01-01
        • 2022-12-24
        • 2020-03-24
        • 2020-10-21
        相关资源
        最近更新 更多