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:

  1. import io.jsonwebtoken.*;: Thư viện JWT giúp tạo và xác thực token.
  2. private String SECRET_KEY = "your_secret_key";: Khóa bí mật để ký JWT.
  3. generateToken: Phương thức tạo JWT với tên người dùng và thời gian hết hạn.
  4. extractUsername: Trích xuất tên người dùng từ JWT.
  5. extractClaim: Lấy một giá trị bất kỳ từ JWT dựa trên các claim.
  6. extractAllClaims: Trích xuất tất cả các claim từ JWT.
  7. 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.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Cách POST dữ liệu tới API bằng Java

Bài viết này hướng dẫn cách gửi dữ liệu tới API bằng phương thức POST trong Java, sử dụng thư viện HttpURLConnection và thư viện org.json để xử lý dữ liệu JSON.
Hướng dẫn tạo form upload nhiều hình ảnh bằng Java

Hướng dẫn chi tiết cách tạo form upload nhiều hình ảnh bằng Java sử dụng Spring Boot và thư viện `Commons FileUpload`. Bài viết bao gồm các bước cài đặt và ví dụ minh họa cụ thể.
Cách UPDATE dữ liệu trong database MySQL bằng Java

Hướng dẫn cách sử dụng Prepared Statements trong Java để cập nhật dữ liệu trong một bảng của database MySQL một cách an toàn và hiệu quả.
Cách truyền Authentication Header Token khi POST dữ liệu tới API bằng Java

Hướng dẫn cách truyền token xác thực (Authentication Header Token) khi gửi dữ liệu qua phương thức POST tới API bằng ngôn ngữ lập trình Java. Bài viết cung cấp mã Java mẫu và giải thích chi tiết.
Tạo ứng dụng chat đơn giản sử dụng Socket.IO trong Java

Hướng dẫn chi tiết cách tạo ứng dụng chat đơn giản bằng Java và Socket.IO. Bài viết này sẽ giúp bạn hiểu cách thiết lập server và client để giao tiếp theo thời gian thực.
Cách lấy dữ liệu JSON từ API bằng Java

Hướng dẫn này sẽ chỉ bạn cách sử dụng Java để gửi yêu cầu GET đến API và đọc dữ liệu JSON trả về bằng cách sử dụng HttpURLConnection.
Đọc nội dung Excel bằng Apache POI trong Java

Hướng dẫn chi tiết cách đọc nội dung file Excel trong Java bằng thư viện Apache POI. Bài viết cung cấp đoạn mã mẫu, giải thích chi tiết từng dòng và hướng dẫn cài đặt thư viện cần thiết.
Cách chuyển đổi chuỗi Markdown sang HTML bằng Java

Hướng dẫn chi tiết cách chuyển đổi một chuỗi Markdown sang HTML trong Java bằng cách sử dụng thư viện `commonmark`.
Cách INSERT dữ liệu vào database MySQL bằng Java

Hướng dẫn cách sử dụng Prepared Statements trong Java để chèn dữ liệu vào một bảng trong database MySQL một cách an toàn và hiệu quả.
Cách tự động đăng nhập vào website sử dụng Selenium với Chrome trong Java

Bài viết hướng dẫn cách sử dụng Selenium với Chrome để tự động đăng nhập vào một trang web bằng Java. Giới thiệu cách thao tác với các phần tử trên trang web để thực hiện quá trình đăng nhập.

Đã thêm vào giỏ hàng