#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?