有没有办法从过期的 JWT 令牌解析声明?

2022-09-02 05:00:24

如果我们尝试解析过期的 ,则会导致过期异常。JWT

有没有办法读取即使JWT已过期的声明

下面用于在java中解析JWT:

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


答案 1

有更好的方法来做到这一点。如果您看到 JWT 异常处理程序对象,例如 ExpiredJwtException,则期望对象本身包含以下内容:- 标头、声明和消息

因此,可以通过此对象轻松提取声明,即 其中 e 是 ExpiredJwtException 对象。e.getClaims().getId()

ExpiredJwtException consturct 如下:-

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

答案 2

JWT 对象采用 Base64URL 编码。这意味着您始终可以通过手动 Base64URL 解码来读取标头和有效负载。在这种情况下,您将简单地忽略属性。exp

例如,你可以这样做(我使用的是Java8内置类,但你可以使用任何外部库,例如Apache Commons编解码器):Base64

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}

另请注意,该属性设置为 ,对应于 。exp130081938016 january 2016