Как я могу декодировать токен 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;
}
Ответ 5
Если в проекте уже используется AWSCognito SDK, можно использовать класс CognitoJWTParser
. Он имеет статические методы getHeader()
, getPayload()
, getSignature()
.
https://github.com/aws-amplify/aws-sdk-android/blob/master/aws-android-sdk-cognitoidentityprovider/src/main/java/com/amazonaws/mobileconnectors/cognitoidentityprovider/util/CognitoJWTParser.java