проверить подпись токена JWT c #
У меня возникли проблемы с проверкой подписи полученного токена JWT. Маркер подписан HS256. Код, в котором я пытаюсь создать подпись для подтверждения полученной подписи:
JwtSecurityToken token = tokenHandler.ReadJwtToken(tokenString);
byte[] keyBytes = Encoding.UTF8.GetBytes("secret");
HMACSHA256 hmac = new HMACSHA256(keyBytes);
byte[] signatureBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(token.RawHeader + "." + token.RawPayload));
string signature = Convert.ToBase64String(signatureBytes);
Подпись, которую я получаю из полученного токена, например:
pYscLlinuNhO-sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU
Но подпись, которую я получаю от своего алгоритма, в этом случае:
pYscLlinuNhO+sFyEIRRLZP7yrl8GopGJ3I6QSxg2tU=
Так что подписи близкие, но не равные. Я не понимаю, что делаю неправильно при проверке подписи. Буквы и цифры кажутся правильными каждый раз, но специальные символы в основном разные, и в конце подписи всегда стоит знак '='. Может кто знает, что я делаю не так.
Ответы
Три части JWT закодированы в Base64Url :
JWT представлен как последовательность URL-безопасных частей, разделенных символами точки ('.'). Каждая часть содержит значение в кодировке base64url.
Но вы использовали кодировку Base64 . Base64Url использует '-' и '_' вместо '+' и '/', а также опускает заполнение '=' в конце.
Вот пример того, как преобразовать кодировку base64 в кодировку bas64url в C #