Варианты извлечения стратегии JWT для паспорта - PullRequest
0 голосов
/ 21 декабря 2018

Используя Passport JWT Strategy , я передаю токен через 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);
  }
}));

Спасибо!Я на это надолго ....

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Ответ:

Я не думаю, что это можно сделать обычным способом, используя ExtractJWT.fromUrlQueryParameter и т. Д.

Вот обходной путь ...

Он ищет query params или headers с именем secret_token.

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);
  }
}));
0 голосов
/ 29 января 2019

Использование 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) => {
  ...
});
0 голосов
/ 21 декабря 2018

попробуйте так:

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);
  }
}));
...