在不拋出異常的情況下檢查 JWT 過期時間
一、簡介
JWT(JSON Web Token)基本上是一個 JSON 對象,用於安全地通過網絡傳輸信息。此信息可以被驗證和信任,因為它是經過數字簽名的。
在本教程中,我們將首先了解驗證 JWT 和解碼 JWT 之間的區別。然後,我們將學習如何檢查 JWT 的到期時間而不在 Java 中拋出任何異常。
2. 驗證和解碼 JWT 的區別
在我們開始研究如何檢查 JWT 的到期時間之前,讓我們先了解一些基礎知識。
正如我們所知,緊湊形式的 JWT 是一個 Base64 編碼的字符串,包含三個部分:標頭、有效負載和簽名。任何訪問 JWT 的人都可以輕鬆解碼並查看其內容。因此,要信任令牌,我們必須驗證 JWT 中包含的簽名。
有多種 Java JWT 庫可用於創建和管理 JWT。我們將為我們的代碼示例使用Auth0 JWT Java 庫。它是一個易於使用的庫,用於創建和管理 JWT。
2.1.依賴關係
首先,我們將 Auth0 Java JWT 庫的Maven 依賴項添加到項目的pom.xml
文件中:
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.2.1</version>
</dependency>
接下來,讓我們了解解碼和驗證 JWT 之間的區別。
2.2.解碼 JWT
我們可以通過簡單的 Base64 解碼其各個部分來解碼 JWT。解碼 JWT 會返回解碼後的有效負載,而無需驗證 JWT 簽名是否有效。此操作不建議用於任何不受信任的消息,僅用於查看 JWT 內容。
要解碼 JWT,我們使用JWT.decode(String)
方法。此方法解析 JWT 並返回DecodedJWT
的實例。
DecodedJWT
實例提供了各種方便的方法,我們可以使用它們來獲取 JWT 中包含的數據。如果 JWT 不是有效的 Base64 編碼字符串,該方法將拋出JWTDecodeException
。
讓我們看一下解碼 JWT 的代碼:
try {
DecodedJWT decodedJWT = JWT.decode(jwtString);
return decodedJWT;
} catch (JWTDecodeException e) {
// ...
}
一旦我們獲得了DecodedJWT
實例的實例,我們就可以使用它的各種 getter 方法來獲取解碼數據。
例如,要獲取令牌過期時間,我們使用DecodedJWT.getExpiresAt()
方法。此方法返回包含令牌到期時間的java.util.Date
實例:
Date expiresAt = decodedJWT.getExpiresAt();
接下來我們看一下JWT的驗證操作。
2.3.驗證 JWT
驗證 JWT 可確保包含的簽名有效。可選地,它還會檢查到期時間、無效前時間、發行者、受眾或任何其他聲明(如果 JWT 包含任何聲明)。
為了驗證 JWT,我們使用JWTVerifier.verify(String)
方法。如果簽名有效,驗證操作還會返回一個DecodedJWT
實例。只有當簽名和所有聲明都有效時,它才會返回解碼後的 JWT。如果簽名無效或任何聲明驗證失敗,它會拋出JWTVerificationException
。
讓我們檢查代碼以驗證 JWT:
try {
DecodedJWT decodedJWT = verifier.verify(jwtString);
} catch (JWTVerificationException e) {
// ...
}
從上面的代碼片段可以清楚地看出,如果 JWT 無效,則verify()
方法會拋出異常。由於該方法在驗證後還會對token進行解碼,因此提供了一種更加安全可靠的token解碼方式。另一方面, decode()
方法只是對提供的 JWT 令牌進行解碼。因此,為了驗證令牌的到期時間而不拋出任何異常,我們使用JWT.decode()
方法。
3. 檢查 JWT 過期時間
為了簡單地讀取JWT中包含的數據,我們可以解碼JWT並解析數據。讓我們看一下檢查 JWT 是否已過期的 Java 代碼:
boolean isJWTExpired(DecodedJWT decodedJWT) {
Date expiresAt = decodedJWT.getExpiresAt();
return expiresAt.before(new Date());
}
如前所述,我們使用DecodedJWT.getExpiresAt()
方法來獲取 JWT 的到期時間。然後我們將過期時間與當前時間進行匹配,以檢查令牌是否已過期。
JWT.decode()
方法和JWTVerifier.verify()
方法都返回DecodedJWT
的一個實例。唯一的區別是verify()
方法還會檢查簽名的有效性,如果無效則返回異常。因此,我們必須只對可信消息使用decode()
方法。對於任何不受信任的消息,我們應該始終使用verify()
方法,以確保這些 JWT 中的有效簽名和任何其他聲明。
4。結論
在本文中,我們首先了解了 JWT 解碼和 JWT 驗證操作之間的區別。
然後我們查看瞭如何使用解碼操作來檢查 JWT 的到期時間而不拋出任何異常。
一如既往,所有示例的完整代碼都可以在 GitHub 上找到。