Как я могу декодировать токен JWT в Android?

У меня есть jwt токен

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Как я могу декодировать это, чтобы получить полезную нагрузку, подобную этой

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

Я использовал эту библиотеку, но не могу найти способ делать то, что хочу

Ответ 1

вы должны разделить строку: Если вы передадите первые два раздела через базовый 64-декодер, вы получите следующее (форматирование добавлено для ясности):

заголовок

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

тело

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

Пример кода:

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");
    }
}

Вызов метода, например

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

Справка библиотеки: https://github.com/jwtk/jjwt

jwt test: https://jwt.io/

Ответ 2

Я использовал стороннюю библиотеку с именем JWTDecode.Android https://github.com/auth0/JWTDecode.Android. Документация достаточно хорошая. Из вашего вопроса, Sub, имя и т.д. Являются частью тела и называются претензиями. Вы можете получить их так, используя приведенную выше библиотеку:

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

Ответ 3

Я использовал в веб-приложении Java, и код будет выглядеть примерно так: -

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

Он вернет претензии, содержащие требуемые значения.

Ответ 4

Это работает с использованием класса Java 8 Base64:

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;
}