Я пишу клиентское приложение с Blazor, которое имеет доступ к JWT. Я хотел бы знать простой способ чтения содержимого полезной нагрузки токена без добавления дополнительной зависимости, потому что мне не нужна другая информация и не нужно проверять токен. Я думаю, что анализ содержимого полезной нагрузки должен быть достаточно простым, чтобы просто написать его в методе.
JwtTokenContent ReadJwtTokenContent(string token)
{
var content = token.Split('.')[1];
// Exception here, it's not a valid base64 string
var jsonPayload = Encoding.UTF8.GetString(
Convert.FromBase64String(content));
Console.WriteLine(jsonPayload);
return JsonSerializer.Deserialize<JwtTokenContent>(jsonPayload);
}
Как я могу декодировать полезную нагрузку? Кажется, что это не просто строка base64.
Введенная строка не является допустимой строкой Base-64, так как содержит не базовый 64-символ, более двух символов заполнения или недопустимый символ . характер среди символов заполнения
Это пример JWT маркер:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6IjUyYjg3ZTUwLTViYmMtNDE0Ny1iOTMwLWY2ZGI0ZTUyNDEwYiIsIlVzZXJuYW1lIjoiZGF0dm1Ab3V0bG9vay5jb20iLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo0NDMyMi8ifQ.4wKxDCwQ6onvNA_atndSitGjufR-tXutWq-tRNhqKz c
1014
(содержание eyJJZCI6IjUyYjg3ZTUwLTViYmMtNDE0Ny1iOTMwLWY2ZGI0ZTUyNDEwYiIsIlVzZXJuYW1lIjoiZGF0dm1Ab3V0bG9vay5jb20iLCJpc3MiOiJodHRwczovL2xvY2FsaG9zdDo0NDMyMi8ifQ
)
Спасибо Кальтену, вот решение для моего случая:
JwtTokenContent ReadJwtTokenContent(string token)
{
var content = token.Split('.')[1];
Console.WriteLine(content);
var jsonPayload = Encoding.UTF8.GetString(
this.Decode(content));
Console.WriteLine(jsonPayload);
return JsonSerializer.Deserialize<JwtTokenContent>(jsonPayload);
}
byte[] Decode(string input)
{
var output = input;
output = output.Replace('-', '+'); // 62nd char of encoding
output = output.Replace('_', '/'); // 63rd char of encoding
switch (output.Length % 4) // Pad with trailing '='s
{
case 0: break; // No pad chars in this case
case 2: output += "=="; break; // Two pad chars
case 3: output += "="; break; // One pad char
default: throw new System.ArgumentOutOfRangeException("input", "Illegal base64url string!");
}
var converted = Convert.FromBase64String(output); // Standard base64 decoder
return converted;
}