Xác thực JSON Web Token (JWT) trong Java
Bài viết này sẽ hướng dẫn cách sử dụng JSON Web Token (JWT) để xác thực người dùng trong ứng dụng Java. Cụ thể, ta sẽ sử dụng JWT để bảo mật các API trong một ứng dụng Java với Spring Boot, từ bước tạo và xác thực token đến việc bảo vệ các endpoint.
Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng JSON Web Token (JWT) để thực hiện quá trình xác thực và ủy quyền trong ứng dụng Java. JWT giúp xác thực các yêu cầu đến từ client một cách an toàn và bảo vệ API của bạn khỏi truy cập không hợp lệ. Chúng ta sẽ sử dụng Spring Boot để xây dựng ứng dụng và tích hợp JWT.
Mã Java:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.function.Function;
@Component
public class JwtUtil {
private String SECRET_KEY = "your_secret_key";
// Tạo JWT từ tên người dùng
public String generateToken(UserDetails userDetails) {
return Jwts.builder()
.setSubject(userDetails.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 giờ
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
// Trích xuất tên người dùng từ JWT
public String extractUsername(String token) {
return extractClaim(token, Claims::getSubject);
}
// Trích xuất một claim từ JWT
public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}
// Trích xuất tất cả các claim từ JWT
private Claims extractAllClaims(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
}
// Kiểm tra nếu token đã hết hạn
private Boolean isTokenExpired(String token) {
return extractExpiration(token).before(new Date());
}
// Trích xuất thời gian hết hạn của JWT
public Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}
// Xác thực JWT
public Boolean validateToken(String token, UserDetails userDetails) {
final String username = extractUsername(token);
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
}
}
Giải thích chi tiết từng dòng code:
-
import io.jsonwebtoken.*;
: Thư viện JWT giúp tạo và xác thực token. -
private String SECRET_KEY = "your_secret_key";
: Khóa bí mật để ký JWT. -
generateToken
: Phương thức tạo JWT với tên người dùng và thời gian hết hạn. -
extractUsername
: Trích xuất tên người dùng từ JWT. -
extractClaim
: Lấy một giá trị bất kỳ từ JWT dựa trên các claim. -
extractAllClaims
: Trích xuất tất cả các claim từ JWT. -
validateToken
: Kiểm tra nếu JWT hợp lệ bằng cách so sánh tên người dùng và thời gian hết hạn.
Yêu cầu hệ thống:
- Java 8 trở lên
- Spring Boot
- Thư viện JSON Web Token (
io.jsonwebtoken:jjwt
)
Cách cài đặt các thư viện để chạy được đoạn mã trên:
- Thêm dependency vào file
pom.xml
của Maven:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
Lời khuyên:
- Đảm bảo sử dụng một khóa bí mật đủ mạnh và không chia sẻ với bất kỳ ai.
- Sử dụng HTTPS để bảo vệ JWT khi truyền trên mạng.