web-dev-qa-db-ja.com

AndroidでJWTトークンをデコードするにはどうすればよいですか?

このような jwt トークンがあります

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

このようなペイロードを取得できるように、どうすればこれをデコードできますか

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

this libraryを使用しましたが、希望することを実行する方法が見つかりません

16
aroM

文字列を分割する必要があります:最初の2つのセクションを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/

40
Alex Zaraos

JWTDecode.Android https://github.com/auth0/JWTDecode.Android という名前のサードパーティライブラリを使用しました。ドキュメントはかなり良いです。あなたの質問から、sub、nameなどは体の一部であり、Claimsと呼ばれています。上記のライブラリを使用して、次のように取得できます。

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

Java Webアプリケーションで使用しました。コードは次のようになります。

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

必要な値を含むクレームを返します。

1
Apollo

これは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;
}
1
Brad Parks

プロジェクトが既に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

0
imdev