web-dev-qa-db-ja.com

期限切れのJWTトークンからクレームを解析する方法はありますか?

expiredJWTを解析しようとすると、期限切れの例外が発生します。

JWTの有効期限が切れていてもクレームを読み取るする方法はありますか?.

以下は、JavaでJWTを解析するために使用されます。

Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody();

10
Sivaprakash

JWTオブジェクトはBase64URLでエンコードされています。これは、手動でBase64URLデコードすることで、ヘッダーとペイロードをいつでも読み取ることができることを意味します。この場合、exp属性を単に無視します。

たとえば、次のようにすることができます(Java8組み込みのBase64クラスを使用していますが、 Apache Commons Codec などの任意の外部ライブラリを使用できます)。

Base64.Decoder decoder = Base64.getUrlDecoder();
String src = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImV4cCI6IjEzMDA4MTkzODAifQ.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.2GpoV9q_uguSg0Ku6peI5aZ2qBxO5qOA42zaS25gq_c";
String[] parts = src.split("\\."); // Splitting header, payload and signature
System.out.println("Headers: "+new String(decoder.decode(parts[0]))); // Header
System.out.println("Payload: "+new String(decoder.decode(parts[1]))); // Payload

出力は次のとおりです。

Headers: {"alg":"HS256","typ":"JWT","exp":"1300819380"}
Payload: {"sub":"1234567890","name":"John Doe","admin":true}

exp属性が1300819380に設定されていることにも注意してください。これは、16 january 2016に対応します。

12
user2340612

これを行うためのより良いアプローチがあります。 JWT例外ハンドラオブジェクトが表示された場合(例: ExpiredJwtException、期待オブジェクト自体には次のものが含まれます:-ヘッダー、クレーム、メッセージ

したがって、クレームはこのオブジェクト、つまりe.getClaims().getId()から簡単に抽出できます。ここで、eはExpiredJwtExceptionオブジェクトです。

ExpiredJwtExceptionの構成は次のとおりです。-

public ExpiredJwtException(Header header, Claims claims, String message) {
        super(header, claims, message);
}

例:-

    try{
        // executable code
   }catch(ExpiredJwtException e){
        System.out.println("token expired for id : " + e.getClaims().getId());
    }
22
Gautam Gupta

これは古いかもしれませんが、この問題に直面している人にとっては、Javaの_io.jsonwebtoken_ ExpiredJwtExceptionはすでにクレームを取得しています。これは、e.getClaims()を呼び出すことで取得できます。

1
Omar Ajmi