Passport JWT 策略提取选项

Posted

技术标签:

【中文标题】Passport JWT 策略提取选项【英文标题】:Passport JWT Strategy extracting options 【发布时间】: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);
  
));

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

【问题讨论】:

【参考方案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);
  
));

【讨论】:

以上是关于Passport JWT 策略提取选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用passport-jwt在nodejs中发送/提取JWT令牌?

NestJs Passport jwt 未知策略

Passport & JWT & Google/Facebook 策略 - 如何结合 JWT 和 Google/Facebook 策略?

Passport JWT 策略没有被调用

Passport 策略如何知道在 nestJS 中选择正确的 jwt 策略?

在同一应用程序上使用 Passport Local 和 JWT 策略(在同一条路线上)