Подзаявка JWT игнорируется во время проверки

Что ж, этот вопрос может быть наивен, поскольку я впервые внедряю JWT в свое приложение узла, и у меня слишком много вопросов по этому поводу.

Во-первых, мне не совсем понятны претензии iss, sub и aud. Из моего базового понимания я понимаю, что iss является эмитентом токена, поэтому я могу предположить, что это название компании приложения. sub является предметом токена или, проще говоря, возможно, идентификатором/именем пользователя. И, наконец, aud предназначен для аудитории или, проще говоря, URL-адрес сервера API / ресурсный сервер. Пожалуйста, дайте мне знать, правильно ли я понял эти термины.

Теперь, с моими ограниченными знаниями, я настроил базовую подпись и проверку JWT. Небольшой фрагмент выглядит следующим образом:

JWT.js

module.exports = {
sign: (payload, options) => {
    let signOptions = {
        issuer: config.JWT_ISSUER,
        subject: options.subject,
        audience: config.JWT_AUDIENCE,
        expiresIn: "24h",
    };

    return jwt.sign(payload, config.JWT_SECRET, signOptions);
},
verify: (token, options) => {
    let verifyOptions = {
        issuer: config.JWT_ISSUER,
        subject: options.subject,
        audience: config.JWT_AUDIENCE,
        expiresIn: "24h",
    };

    try {
        return jwt.verify(token, config.JWT_SECRET, verifyOptions);
    }
    catch (err){
        return false;
    }
},

Теперь токен выдается следующим образом:

// Issue JWT token
let userData = {
    user_name: user.userName,
    client_id: user.clientId
};
const token = jwt.sign({ userData }, { subject: user.userName });

Проверка выполняется следующим образом:

// Verify the token
const authData = jwt.verify(token, { subject: req.body.subject });  

ГЛАВНАЯ ПРОБЛЕМА

Когда я отправляю запрос на конечную точку API для проверки и если я отправляю его без поля темы в теле (токен выдается с подполем), токен проверяется успешно. Но если я отправлю поле темы в теле с правильным/неправильным значением, оно получит успех/запрет соответственно.

  • Почему так происходит?
  • Почему токен не запрещается, если в запросе не передается подполе?
  • Нужно ли мне подтверждать это вручную?

person Ayan    schedule 29.03.2019    source источник


Ответы (1)


Согласно стандарту JWT,

4.1.2. "под" (Тема) Претензия

Утверждение "sub" (субъект) идентифицирует участника, который является субъектом JWT. Утверждения в JWT обычно являются заявлениями о предмете. Субъектное значение ДОЛЖНО быть либо локально уникальным в контексте эмитента, либо глобально уникальным. Обработка этого требования обычно зависит от приложения. Значение «sub» — это чувствительная к регистру строка, содержащая значение StringOrURI. Использование этого утверждения НЕОБЯЗАТЕЛЬНО.

Таким образом, когда у вас его нет, он проходит, но неверное значение приводит к сбою. Пакет jwt соответствует стандарту.

Теперь, если вы планируете сделать его обязательным, вам придется сделать его настраиваемым, но имейте в виду, что вы не сможете использовать стороннюю аутентификацию (если это ваш вариант использования), которые не считают ее обязательной. (не знаю, так ли это в жизни)

person asr9    schedule 29.03.2019
comment
Утверждение подпункта (субъекта) идентифицирует принципала, который является субъектом JWT. Могу ли я предположить, что это конкретный пользователь приложения? Верно ли это предположение? - person Ayan; 29.03.2019
comment
Или вы можете мне подсказать, какие значения подходят для заявлений iss, sub и aud? - person Ayan; 29.03.2019