#node.js #jwt
#node.js #jwt
Вопрос:
Я начал изучать jwt в node.js . Но я застрял здесь
const jwt = require('jsonwebtoken');
let token = jwt.sign({name:"Sachin"},"secret" ,{expiresIn: '2000s'});
console.log("generated token", token);
Это возвращает разную часть подписи токена при нескольких вызовах, но полезная нагрузка и секретный ключ одинаковы при каждом вызове. Так как же это происходит?
Также, когда я пытаюсь проверить их с помощью копирования-вставки, также выдается ошибка «недопустимый токен»
jwt.verify(token,"secret",(err,result)=>{
if(err){
console.log(err);
}
console.log("Verified " result);
Что здесь происходит ?
токен 1 генерируется =>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiU2FjaGluIiwiaWF0IjoxNjE0NTQxOTk0fQ.O518KGK_m47Mw2fBBKDdABZUFGxXzYShrMoYQnLJQwM
генерация токена 2 =>
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiU2FjaGluIiwiaWF0IjoxNjE0NTQyMDA4fQ.FwY_XJ0ryAZzuJ1EpaUkqVNTNutkA63t0Vkie468zkM
Комментарии:
1. на дополнительный вопрос, почему проверка не удалась, нельзя ответить на основе предоставленной информации. Я проверил оба жетона на jwt.io и они не могут быть проверены с помощью секретного «секрета». Я предполагаю, что вы много играли, и, вероятно, одно очко сгенерировало их с другим секретом.
Ответ №1:
Это потому, что каждый раз, когда вы генерируете токен, вычисляется новое время истечения срока действия ( exp
) (текущее время 2000 в вашем примере), а время истечения срока действия является частью полезной нагрузки. Каждое изменение в заголовке или полезной нагрузке вызывает изменение подписи, поскольку подпись представляет собой хэш заголовка и полезной нагрузки.
jwt.sign
по умолчанию добавляется a iat
(выдается при утверждении), который имеет тот же эффект, exp
что и (в отношении изменения полезной нагрузки каждый раз, когда вы генерируете токен). Обе временные метки имеют разрешение 1 секунда (формат времени эпохи Unix).
Ваша полезная нагрузка будет выглядеть следующим образом:
{
"name": "Sachin",
"iat": 1614540008
"exp": 1614542008
}
Когда ваша цель состоит в том (ради изучения вещей), чтобы генерировать точно идентичные токены в последовательных вызовах, вы должны избегать всех видов временных меток ( iat
, exp
, nbf
(не раньше)).
Это может быть достигнуто с {noTimestamp:true}
помощью опции в вызове:
jwt.sign(payload, "secret", {noTimestamp:true})
Вы можете проверить сгенерированные токены на https://jwt.io / чтобы увидеть, что внутри.
Комментарии:
1. Я попробовал это, удалив поле {expiresIn: ‘2000s’}, но оно также не работает. Он по-прежнему возвращает разные токены.
2. Я предполагаю, что есть также «iat» (выдается с меткой времени), тот же эффект, что и «exp». Если нет, пожалуйста, покажите свой токен в вопросе, трудно говорить о чем-то, не видя этого.
3. Я пытался использовать поле iat, но оно также не работает
4. что вы имеете в виду под «пытались использовать …»? Токены, которые вы показываете в своем вопросе, содержат IAT, который генерируется автоматически и делает каждый токен другим. Как было сказано ранее, добрался до jwt.io чтобы проверить ваш токен и увидеть разницу.
5. это вопрос о том, как избежать изменения токена с тем же секретным ключом и той же полезной нагрузкой