Почему jsonwebtoken выдает ошибку неверной подписи?

Я использую пакет jsonwebtoken (https://github.com/auth0/node-jsonwebtoken ) для обработки JWT в моем проекте. Независимо от того, что я пытаюсь, это дает мне эту ошибку: name: 'JsonWebTokenError', message: 'invalid signature'

Вот где я подписываю JWT:

const addBearerToken = (myUser, cb) => {
  jwt.sign({user: myUser, userId: myUser.id}, 'helloworld', (err, token) => {
    if (err) return (err, null)
    userRepo.update(myUser._id, {authToken: token}, (err, myUser) => {
      if (err) {
        return cb(err, null)
      } else {
        return cb(null, token)
      }
    })
  })
}

И вот где я пытаюсь это проверить:

const checkForJWT = (req, res, next) => {
  let bearerHeader = req.header('Authorization').split(' ')
  let token = bearerHeader[1]
  console.log(token + '  ||  token')
  jwt.verify(token, 'helloworld', (err, decoded) => {
    if (err) {
      console.log(err)
      return (err, null) // this is where the error is thrown
    } else {
    ...
    }
  })
}

Я использую helloworld вместо своего секретного ключа. Я подозреваю, что проблема связана с секретным ключом, но, как я уже сказал, я не уверен, что происходит за кулисами, вызывающими эту ошибку.

Если я использую jwt.decode (токен, 'helloworld'), я получаю обратно всю нужную информацию. Но я получаю сообщение об ошибке, когда использую jwt.verify ().

Любая помощь горячо приветствуется. Дайте мне знать, если вам понадобится дополнительная информация из моего кода.


person Brian    schedule 29.07.2019    source источник
comment
ну, вы добавляете всю свою пользовательскую запись в токен (достаточно плохо), и эта запись даже содержит токен, который вы хранили в своей базе данных раньше (что еще хуже). Предлагаю добавить лишь несколько необходимых утверждений, например идентификатор пользователя и срок действия токена. Вы можете проверить свой токен на jwt.io   -  person jps    schedule 29.07.2019
comment
Хорошо, я проверю jwt.io. Я забыл добавить, что jwt.decode () работает нормально, а jwt.verify () - нет, что мне кажется странным.   -  person Brian    schedule 29.07.2019
comment
Я просто использовал jwt.io, и он проверил подпись. Я также изменил токен выше, чтобы удалить информацию о пользователе.   -  person Brian    schedule 29.07.2019
comment
Результат такой же, как и раньше. отладчик говорит, что работает, но в моей программе я получаю ошибку.   -  person Brian    schedule 29.07.2019
comment
Я не думаю, что jwt.io действительно проверил старый токен. Если вы добавите секрет справа после вставки токена слева, будет вычислена новая подпись, которая будет автоматически проверена. Отредактируйте свой вопрос и добавьте измененный код и текущий токен после ваших последних изменений.   -  person jps    schedule 29.07.2019
comment
Да вы правы; Я ошибался, говоря, что это проверяется. Я опубликую новый код и токен чуть позже. У меня проблемы с удалением всей пользовательской информации, которую я бы предпочел не иметь в SO. Кстати, спасибо за помощь.   -  person Brian    schedule 29.07.2019
comment
пожалуйста. Пожалуйста. никогда не публикуйте настоящие данные, здесь только тестовые данные. Вы можете пометить свое сообщение как требующее вмешательства модератора и объяснить проблему. Думаю, они могут помочь.   -  person jps    schedule 29.07.2019


Ответы (2)


Попробуйте использовать в качестве ключа текст base64. Я тоже столкнулся с этой проблемой, но использование ключа base64 решило мою проблему.

person Devendra Pratap Singh    schedule 28.04.2021
comment
Вы можете подробно объяснить, как именно использовать base64 для решения вопроса / проблемы OP. Я рецензент. StackOverflow запросил проверку, потому что вы новый участник. Ваш ответ ценится и полезен. Этот комментарий поможет вам превратить хороший ответ в отличный. - person Andreas ZUERCHER; 28.04.2021
comment
jwt.verify принимает секретный или открытый ключ в качестве второго аргумента для проверки подписи. Ключ должен быть в формате base64 (заканчиваться на ==). Это решило мою проблему с недействительной подписью - person Devendra Pratap Singh; 29.04.2021
comment
Если вы полностью решили вопрос / проблему своего OP, вам следует написать на него ответ, а затем принять свой ответ, чтобы люди, просматривающие (возможно, через годы), могли легко увидеть вопрос-ответ, не читая все комментарии . - person Andreas ZUERCHER; 29.04.2021
comment
а) непонятно, какая проблема у вас действительно была, и как ее решила кодировка base64, и я сомневаюсь, что это помогло бы OP. б) строка в кодировке base64 может иметь 0, 1 или 2 символа заполнения (=). Распространенное заблуждение, что строка base64 всегда заканчивается на == - person jps; 31.05.2021

У меня тоже была такая же проблема, я решил ее преобразованием токена с помощью метода toString.

await jwt.verify(token.split(" ")[1].toString(),'secret');

person Muhammad Saiful Islam    schedule 23.05.2020