web-dev-qa-db-fra.com

Comment puis-je décoder le jeton JWT dans Android?

J'ai un jwt token comme ça 

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Comment puis-je décoder ceci afin que je puisse obtenir la charge utile comme ceci 

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

J'ai utilisé this library, mais je ne trouve pas le moyen de faire ce que je veux 

11
aroM

vous devez scinder la chaîne: Si vous passez les deux premières sections à travers un décodeur en base 64, vous obtiendrez ce qui suit (mise en forme ajoutée pour plus de clarté):

entête

{
  "alg": "HS256",
  "typ": "JWT"
}

corps

    {
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Exemple de code:

public class JWTUtils {

    public static void decoded(String JWTEncoded) throws Exception {
        try {
            String[] split = JWTEncoded.split("\\.");
            Log.d("JWT_DECODED", "Header: " + getJson(split[0]));
            Log.d("JWT_DECODED", "Body: " + getJson(split[1]));
        } catch (UnsupportedEncodingException e) {
            //Error
        }
    }

    private static String getJson(String strEncoded) throws UnsupportedEncodingException{
        byte[] decodedBytes = Base64.decode(strEncoded, Base64.URL_SAFE);
        return new String(decodedBytes, "UTF-8");
    }
}

Méthode d'appel par exemple 

JWTUtils.decoded("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ");

référence de la bibliothèque: https://github.com/jwtk/jjwt

jwt test: https://jwt.io/

29
Alex Zaraos

J'ai utilisé une bibliothèque tierce nommée JWTDecode.Android https://github.com/auth0/JWTDecode.Android . La documentation est raisonnablement bonne. D'après votre question, le sous-nom, le nom, etc. font partie du corps et sont appelés réclamations. Vous pouvez les obtenir comme ceci en utilisant la bibliothèque ci-dessus: 

  JWT parsedJWT = new JWT(jwtToken);
  Claim subscriptionMetaData = parsedJWT.getClaim("name");
  String parsedValue = subscriptionMetaData.asString();
3
diptia

J'ai utilisé une application Web Java et le code ressemblera à quelque chose comme ci-dessous: -

Jwts.parser().setSigningKey('secret-key').parseClaimsJws(token).getBody()

Il renverra les revendications contenant les valeurs requises.

1
Apollo

Cela fonctionne avec la classe Base64 de Java 8:

public String getDecodedJwt(String jwt)
{
  String result = "";

  String[] parts = jwt.split("[.]");
  try
  {
    int index = 0;
    for(String part: parts)
    {
      if (index >= 2)
        break;

      index++;
      byte[] partAsBytes = part.getBytes("UTF-8");
      String decodedPart = new String(Java.util.Base64.getUrlDecoder().decode(partAsBytes), "UTF-8");

      result += decodedPart;
    }
  }
  catch(Exception e)
  {
    throw new RuntimeException("Couldnt decode jwt", e);
  }

  return result;
}
0
Brad Parks