Decodificación de JWT en unity
– UnityAssets3Free
buenas , soy Juan y aqui os traigo
esta nueva pregunta
Tengo un problema que ahora estoy completamente perdido. Tengo un servidor de autenticación que crea y envía JWT a un unity aplicación (android/VR).
El servidor de autenticación crea un token como tal.
private string GenerateJwtToken(User user)
var symmetricKey = Convert.FromBase64String(_tokenSettings.Secret);
var expires = DateTime.Now.AddMinutes(Convert.ToInt32(15));
var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
Subject = new ClaimsIdentity(new[]
new Claim(ClaimTypes.PrimarySid, user.Id.ToString()),
new Claim(ClaimTypes.Name, user.Username),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
new Claim("company", user.Company),
new Claim(ClaimTypes.Role, "api_user"),
new Claim(ClaimTypes.Expiration, $"expires.ToShortDateString() + " " + expires.ToShortTimeString()"),
),
Expires = expires,
SigningCredentials = new SigningCredentials(
new SymmetricSecurityKey(symmetricKey),
SecurityAlgorithms.HmacSha256Signature)
;
var securityToken = tokenHandler.CreateToken(tokenDescriptor);
var token = tokenHandler.WriteToken(securityToken);
return token;
No tengo problemas para descifrar esto y obtener los reclamos en una aplicación de consola. Ahí es donde entra la confusión. Cuando trato de hacer la misma tarea en Unity y crear la aplicación para los auriculares VR, me encuentro con problemas, es decir, esto
"IDX10729: Unable to decode the header 'header' as Base64Url encoded string. jwtEncodedString: 'Token here'."
O unity el servicio de autenticación se ve así
public async Task<string> GetAccessToken(string username, string password)
{
using (var client = new HttpClient())
using (var request = new HttpRequestMessage())
//TODO: Replace this hardcoded URL value here.
request.RequestUri = new Uri("URL Emmited");
request.Method = HttpMethod.Post;
var body = new AuthRequest()
Username = username,
Password = password
;
var content = new StringContent(JsonConvert.SerializeObject(body), encoding: Encoding.UTF8, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
var responseContent = await response.Content.ReadAsStringAsync();
var tokenContent = JsonConvert.DeserializeObject<Response>(responseContent);
var token = tokenContent.Token;
return token;
}
y recuperando los reclamos, probé dos formas diferentes
public string GetUserName(string token)
try
var securityToken = new JwtSecurityToken(token);
return securityToken?.Claims.First(claim => claim.Type == "given_name").Value;
catch (Exception exception)
//log exception here
return string.Empty;
y
public string GetUserName(string token)
try
var handler = new JwtSecurityTokenHandler();
var securityToken = handler.ReadJwtToken(token);
return securityToken?.Claims.First(claim => claim.Type == "given_name").Value;
catch (Exception exception)
//log exception here
return string.Empty;
ReadJwtToken internamente solo crea un nuevo objeto JwtSecurityToken, por lo que supongo que falta algo.
Ambos arrojan el mismo error «No se puede decodificar el encabezado ‘encabezado’ como cadena codificada Base64Url», sin embargo, si lo hago handler.CanReadToken(token);
esto vuelve verdadero, lo que me deja aún más perplejo.
¿Alguien tiene alguna idea de por qué sucede esto y alguna pista sobre cómo solucionarlo?
alguna información adicional; el token que recupero se puede decodificar en JWT.io y en una aplicación de consola, estoy usando los conjuntos dotnet estándar 2.0 para System.IdentityModel, System.IdentityModel.Tokens.JWT, System.IdentityModel.Tokens, System.IdentityModel.Logging y Newtonsoft.Json
nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias
eso es todo,espero que te halla servido