如何在安卓系统中解码智威汤达令牌?

2022-09-01 04:53:52

我有一个像这样的jwt令牌

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

我该如何解码,以便我可以像这样获得有效载荷

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

我已经使用了这个库,但找不到一种方法来做我想做的事


答案 1

你应该拆分字符串:如果你通过 base 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 测试: https://jwt.io/


答案 2

我使用了一个名为JWTDecode.Android的第三方库 https://github.com/auth0/JWTDecode.Android。文档相当不错。从您的问题来看,子,名称等是正文的一部分,称为声明。您可以使用上面的库像这样获取它们:

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