Дополнительное утверждение JWT игнорируется во время проверки

#javascript #node.js #authentication #jwt #express-jwt

#javascript #node.js #аутентификация #jwt #express-jwt

Вопрос:

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

Во-первых, мне неясны утверждения iss , sub и aud . Исходя из моего базового понимания, я понимаю, что iss является эмитентом токена, поэтому я могу предположить, что это название компании приложения. sub является предметом токена или, проще говоря, вероятно, идентификатором пользователя / username. И, наконец, 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 для проверки, и если я отправляю его без поля subject в теле (токен выдается с вложенным полем), токен успешно проверяется. Но если я отправляю поле subject в теле с правильным / некорректным значением, оно получает значение success / forbidden соответственно.

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

Ответ №1:

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

4.1.2. «дополнительное» (подлежащее) утверждение

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

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

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

Комментарии:

1. «Подзапрос» (subject) определяет принципала, который является предметом JWT.»- Я могу предположить, что это конкретный пользователь приложения? Верно ли это предположение?

2. Или вы можете подсказать мне, какие значения подходят для утверждений iss, sub и aud?