Comment décoder JWT Token?
je ne comprends pas comment cette bibliothèque fonctionne. Pourriez-vous m'aider s'il vous plaît ?
Voici mon code simple :
public void TestJwtSecurityTokenHandler()
{
var stream =
"eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJJU1MiLCJzY29wZSI6Imh0dHBzOi8vbGFyaW0uZG5zY2UuZG91YW5lL2NpZWxzZXJ2aWNlL3dzIiwiYXVkIjoiaHR0cHM6Ly9kb3VhbmUuZmluYW5jZXMuZ291di5mci9vYXV0aDIvdjEiLCJpYXQiOiJcL0RhdGUoMTQ2ODM2MjU5Mzc4NClcLyJ9";
var handler = new JwtSecurityTokenHandler();
var jsonToken = handler.ReadToken(stream);
}
ceci est une erreur:
la chaîne doit être au format compact JSON, qui est de la forme: Base64UrlEncodedHeader.Base64UrlEndcodedPayload.Facultatif, Base64UrlEncodedSignature".
si vous copiez stream dans jwt.io website, il fonctionne très bien :)
Merci d'avance pour votre aide !
4 réponses
j'ai trouvé la solution, je viens de manquer de mouler le résultat comme suit:
var tokenS = handler.ReadToken(tokenJwtReponse.access_token) as JwtSecurityToken;
Après je peux obtenir des déclarations comme :
var jti = tokenS.Claims.First(claim => claim.Type == "jti").Value;
new JwtSecurityTokenHandler().ReadToken("")
retour SecurityToken
new JwtSecurityTokenHandler().ReadJwtToken("")
retour JwtSecurityToken
Si vous modifiez simplement la méthode que vous utilisez, vous pouvez éviter la fonte dans la réponse ci-dessus
Vous avez besoin de la chaîne secrète qui a été utilisée pour générer un token crypté. Ce code fonctionne pour moi:
protected string GetName(string token)
{
string secret = "this is a string used for encrypt and decrypt token";
var key = Encoding.ASCII.GetBytes(secret);
var handler = new JwtSecurityTokenHandler();
var tokenSecure = handler.ReadToken(token) as SecurityToken;
var validations = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
var claims = handler.ValidateToken(token, validations, out tokenSecure);
return claims.Identity.Name;
}
en utilisant les paquets .net core jwt, les Claims sont disponibles:
[Route("api/[controller]")]
[ApiController]
[Authorize(Policy = "Bearer")]
public class AbstractController: ControllerBase
{
protected string UserId()
{
var principal = HttpContext.User;
if (principal?.Claims != null)
{
foreach (var claim in principal.Claims)
{
log.Debug($"CLAIM TYPE: {claim.Type}; CLAIM VALUE: {claim.Value}");
}
}
return principal?.Claims?.SingleOrDefault(p => p.Type == "username")?.Value;
}
}