Я попытался скопировать и вставить ваш токен, ваш открытый ключ и ваш закрытый ключ в отладчик jwt.io.Вот мои выводы:
- Если вы только вставляете токен, токен декодируется правильно, но подпись не может быть проверена (что очевидно).
- Если вы тогдавставьте открытый ключ (которого должно быть достаточно для проверки подписи), подпись все еще не может быть проверена.Это странно ?
- Если затем вставить также закрытый ключ (который не требуется для проверки подписи), подпись будет действительной.
Итак, очевидно, все сводится к вопросу, почему подпись токена может быть проверена, только если предоставлен закрытый ключ ...
Это привело меня к предположению, что каким-то образом закрытый ключ и открытый ключ нене соответствуют друг другу.Поэтому я попытался восстановить (или, лучше сказать, извлечь) открытый ключ из предоставленного вами закрытого ключа и сравнить его с открытым ключом, который вы предложили.Итак, я вставил ваш закрытый ключ в файл с именем privateKey.pem
и выполнил следующую команду:
$ openssl rsa -in privateKey.pem -pubout
Это дало мне следующий открытый ключ:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz0fAg//VfX3XUbzJOfdC
bblOIT0/Yjw/5mHlnb1E25Ddoj6YOiwwAwZ7c/CPQs04QpIB5g0IYePUMwDjYh38
h4Sk+hxyAUu/MBln4RPbnhbZL9fcYrLxSUwzuiJZRhTIoqI/AJLzicGmPuWSkhRt
9ldIDGoJTUjUzoeSiug7MYHR9inzM5+rhcCZL7M9asD4iDbv66rzkDziCiQmzRwT
oP0r4T1gUhBQwvQJC5t2o4RgHJ0pVotCoFBc+4h7lEerOBi3ZHONLgKKGBMRFrGc
qAck9fLV5Z9oTwLxNQLWtj0m7Sx7sLzELeL82YvNCuAV6joqrzTKNQNWk6EkJ5js
LQIDAQAB
-----END PUBLIC KEY-----
К сожалению, этоэто тот же открытый ключ, который вы предоставили, поэтому мы можем отметить эту мысль в нашем списке.
Итак, я начал искать в Интернете и нашел это сообщение в блоге от Auth0где они описывают введение поддержки алгоритмов PS*
, но согласно документации все должно работать как положено.Хм, более странно ?
Итак, следующее, что я попробовал, было зашифровать вещи с помощью отладчика jwt.io, используя декодированные значения вашего токена, с алгоритмом PS256
и предоставленным вами закрытым ключом.Это привело меня к этому знак:
1033 * eyJhbGciOiJQUzI1NiJ9.eyJmb28iOiJiYXIifQ.wzkD7q5lH_qJw_V6DJLk72TDqpzA05KN3XHfEFOeAQgCriodoOLrgQ-p3ifIzK525puiV1hnXQuJ-6TEZRqiO8dqlPWQJbG1mLdTTx7ZwdUKsDjY6CMsmsskU8eVrzfaSDVmGvbjaWKq1_KGvtk4vMT0Z9m_YhUjD_SDVbCaZReEbzxta4APM7dMQ5mRFzD03JTwe05_AqayrfXdTungeBEJcMB0tY_4FjWiKbBZOpyQLebzPJ69VgpQFGvf6fPuKT6_3LTEHPrRNFL05OYpgRvayh3pEAF297aSCQ_SFi9slqDdVKkor-q8UDO-zM7J952uCkr7NkXV0Loq62_gMg 1035 * Если вы вставляете
это лексема в отладчик jwt.io, ииспользуйте
ваш открытый ключ, тогда подпись действительна.Итак, в основном
PS256
, кажется, работает с jwt.io, но по какой-то причине не для вашего токена ...
Это, наконец, приводит меня к мысли, что, возможно, Node.js и jwt.io действительно используют разные способызапустить алгоритм PS256
.Конечно, поскольку это стандарт, оба должны работать одинаково, но, очевидно, они не работают.Я не знаю, кто из них делает это неправильно, или, если хорошо, что оба работают по-разному, так как раньше мне никогда не приходилось иметь дело с PS256
.
Мне очень жаль, что у меня нетлучше ответить здесь, но я думаю, что единственный способ выяснить настоящую причину - это отладить криптографический код Node.js и взглянуть на исходный код jwt.io (который не является общедоступным, посколькуЯ знаю).
С моей точки зрения, то, что вы делаете, правильно, и я предпочел бы предположить, что это ошибка либо в Node.js, либо в jwt.io, либо в обоих ?
PS: После написания этого ответа я обнаружил эту проблему , и я предполагаю, что первоначальный автор - это вы (не так ли?), И ответ там в основном приходит к тому же выводу, чтоэто проблема сайта.Так что, возможно, это действительно лучший ответ, который вы можете получить.