如果我們試圖解析過期JWT
,則會導致過期異常。是否有解析過期的JWT令牌的聲明的方法?
有沒有辦法通過閱讀索賠即使智威湯遜已過期。
下面是用於在Java解析JWT:
Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody();
如果我們試圖解析過期JWT
,則會導致過期異常。是否有解析過期的JWT令牌的聲明的方法?
有沒有辦法通過閱讀索賠即使智威湯遜已過期。
下面是用於在Java解析JWT:
Jwts.parser().setSigningKey(secret.getBytes()).parseClaimsJws(token).getBody();
JWT對象編碼Base64URL。這意味着您可以通過手動Base64URL解碼來讀取標頭和有效載荷。在這種情況下,您將忽略exp
屬性。
舉例來說,你可以做這樣的(我使用的是內置Base64
類Java8,但你可以使用任何外部庫,如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
。
有一個更好的方法來做到這一點。 如果您看到JWT異常處理程序對象例如ExpiredJwtException,期望對象本身包含以下內容: - 標題,聲明和消息
所以聲明可以很容易地通過此對象提取,即e.getClaims().getId()
其中e是ExpiredJwtException對象。
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());
}