Подтвердить что ты не робот

Как получить доступ к getToken в

В express-jwt docs есть ссылка на возможность использования функции getToken для получения маркера из запроса.

Как вы используете этот вызов в маршруте?

app.use(jwt({
  secret: 'hello world !',
  credentialsRequired: false,
  getToken: function fromHeaderOrQuerystring (req) {
    if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
        return req.headers.authorization.split(' ')[1];
    } else if (req.query && req.query.token) {
      return req.query.token;
    }
    return null;
  }
}));
4b9b3361

Ответ 1

Полезный маленький трюк заключается в том, чтобы добавить unless, который делает каждый URL, кроме указанных, если не требуется токен.

Это означает, что вам не нужно создавать app.get для каждого отдельного пути в вашем api, который вы хотите защитить (если вам не нужны разные секреты для каждого, что я не знаю, почему вы это сделали).

var jwt = require('jsonwebtoken');
var expressJWT = require('express-jwt');

app.use(
  expressJWT({
    secret: 'hello world !',
    getToken: function fromHeaderOrQueryString (req) {
        if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer')
            return req.headers.authorization.split(' ')[1];
        else if (req.query && req.query.token)
            return req.query.token;

        return null;
    }
  }).unless({ path: ['/login'] }));

// Test paths
app.get('/login', function (req, res) {
   res.send("Attempting to login.");
});

app.get('/otherurl', function (req, res) {
    res.send('Cannot get here.');
});

Или вы просто указываете его для одного пути:

app.get('/protected',
   expressJWT({
     secret: 'hello world !',
     getToken: function fromHeaderOrQueryString (req) {
        if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer')
            return req.headers.authorization.split(' ')[1];
        else if (req.query && req.query.token)
            return req.query.token;

        return null;
      }
 }));

Обратите внимание на изменение от get и use в конфигурации.

Для каждого пути, который вы передаете через express-jwt, функция getToken запускается, если это указано в вашей конфигурации.

Что приятное в добавлении unless заключается в том, что теперь вы минимизировали объем работы, который вам нужно выполнить, чтобы получить токен от пользователя для каждого пути.

Обратитесь к index.js express-jwt, в котором рассказывается больше о том, как работает getToken:

  • Если вы укажете опцию как функцию, значение токена - это возвращаемое значение функции
    • Это означает, что вы можете предоставить настраиваемую логику для обработки ваших токенов и может быть полезным местом для вызова verify.
  • В противном случае он запускает стандартную логику для извлечения маркера из заголовка авторизации с форматом "[Участник авторизации] [токен]" (я обозначаю скобки, чтобы показать, где он разбивает строку).

Ответ 2

Так же:

app.get('/protected',
  jwt({
    secret: 'hello world !',
    credentialsRequired: false,
    getToken: function fromHeaderOrQuerystring(req) {
      if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {
        return req.headers.authorization.split(' ')[1];
      } else if (req.query && req.query.token) {
        return req.query.token;
      }
      return null;
    }
  })
);

Просто добавьте поле getToken в объект, который вы передаете промежуточному программному обеспечению jwt. Это комбинация примера в вопросе и первый пример в документации.