isTokenValid 方法用於驗證Token的有效性。它首先提取Token中的用戶名,然後檢查用戶名是否與 UserDetails 中的用戶名一致,同時確認Token是否過期。
public boolean isTokenValid(String token, UserDetails userDetails) {
final String username = extractClaims(token, Claims::getSubject);
return username.equals(userDetails.getUsername()) && !isTokenExpired(token);
}
這個私有方法用於檢查Token是否已經過期,通過比較當前日期和Token的過期日期。
private boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
extractExpiration 方法通過 extractClaims 提取Token的過期日期。
private java.util.Date extractExpiration(String token) {
return extractClaims(token, Claims::getExpiration);
}
這個私有方法實際上執行了JWT的解析,通過使用密鑰來解碼Token並提取其中的聲明。
private Claims extractClaims(String token) {
return Jwts
.parserBuilder()
.setSigningKey(getSignInKey())
.build()
.parseClaimsJws(token)
.getBody();
}
getSignInKey 方法用來獲取JWT簽名和解碼所需的密鑰。這個密鑰是通過Base64編碼的字符串轉換而來。
private Key getSignInKey() {
byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
return Keys.hmacShaKeyFor(keyBytes);
}
在這篇文章中,我們詳細介紹了 JwtService 類別的實現及其主要功能。此服務負責生成、解析和驗證JWT token,確保在應用中安全地處理認證和授權。通過理解 JwtService 中的各個方法和流程,我們可以更好地掌握JWT的運作機制,並在開發安全的網絡應用中得心應手。