JSON Web Token(JWT)是一種用於身份驗證和授權的開放標準,可以實現無狀態的RESTful API認證。在這篇文章中,我們將介紹如何使用Java JWT庫實現無狀態認證和授權功能。
一、JWT的基礎知識
JWT包含三個部分:頭部、載荷和簽名。頭部指定演算法類型和簽名類型。常用的演算法有:HMAC、RSA和ECDSA。載荷包含一些聲明,例如:發布者、過期時間、主題、受眾等。簽名是由頭部和載荷使用指定的演算法生成的,可以驗證消息是否被篡改。當客戶端向伺服器發送請求時,它應發送JWT作為 Authorization 頭的值。
二、使用Java JWT實現JWT生成和驗證
使用Java JWT庫可以方便地生成和驗證JWT。以下是生成JWT的示例代碼:
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class JWTGenerator { public static String generateToken(String issuer, String subject, long ttlMillis, Map claims) { long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); // 使用隨機數作為JWT的ID String jwtId = UUID.randomUUID().toString(); JwtBuilder builder = Jwts.builder() .setId(jwtId) .setIssuedAt(now) .setSubject(subject) .setIssuer(issuer) .claim("data", claims) .signWith(SignatureAlgorithm.HS256, "secret"); if (ttlMillis >= 0) { long expMillis = nowMillis + ttlMillis; Date exp = new Date(expMillis); builder.setExpiration(exp); } return builder.compact(); } }
使用Java JWT庫驗證JWT非常簡單。下面是一個示例代碼:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; public class JWTVerifier { public static Claims verifyToken(String jwtToken) { Claims claims = Jwts.parser() .setSigningKey("secret") .parseClaimsJws(jwtToken) .getBody(); return claims; } }
三、使用JWT實現無狀態認證和授權功能
通常,使用JWT的有狀態應用程序可以使用JWT來實現無狀態RESTful API認證。以下是一個實現JWT認證和授權的示例代碼:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtException; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Arrays; import java.util.Date; import java.util.List; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; public class JWTFilter { // 在這裡替換成您的密鑰 private static final String SECRET = "mySecretKey"; public void filter(ContainerRequestContext requestContext) throws JwtException { // 從頭部獲取JWT MultivaluedMap headers = requestContext.getHeaders(); List authHeader = headers.get("Authorization"); if (authHeader == null || authHeader.isEmpty()) { throw new JwtException("Missing or invalid authorization header"); } String jwtToken = authHeader.get(0).split(" ")[1]; // 如果token驗證不成功則不會添加security context if (isTokenValid(jwtToken)) { // 獲取JWT中的聲明信息 Claims claims = JWTVerifier.verifyToken(jwtToken); // 獲取JWT中用戶數據 String user = claims.getSubject(); // 添加用戶身份到請求屬性中 requestContext.setProperty("user", user); // 添加角色信息到請求屬性列表 String roles = (String) claims.get("roles"); List roleList = Arrays.asList(roles.split(",")); requestContext.setProperty("roles", roleList); } } private boolean isTokenValid(String jwtToken) { boolean isValid = false; try { Claims claims = Jwts.parser() .setSigningKey(SECRET) .parseClaimsJws(jwtToken) .getBody(); Date now = new Date(); if (now.before(claims.getExpiration())) { isValid = true; } } catch (Exception e) { isValid = false; throw new JwtException("Invalid JWT token"); } return isValid; } }
四、小結
在本文中,我們學習了如何使用Java JWT庫實現無狀態JWT認證和授權功能。我們了解了JWT的基礎知識,並實現了JWT生成和驗證方法。我們還提供了一個示例代碼來說明如何將JWT用於無狀態認證和授權功能。使用JWT可以大大簡化身份驗證和授權的複雜性,同時提高應用程序的安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/311212.html