как использовать jwt.sign() в node.js

#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. это вопрос о том, как избежать изменения токена с тем же секретным ключом и той же полезной нагрузкой