×

Cách cài đặt JWT để quản lý token xác thực JSON trong Java

Giới thiệu

Trong thời đại công nghệ thông tin hiện đại, bảo mật thông tin là yếu tố không thể thiếu trong các ứng dụng web và dịch vụ API. Một trong những phương pháp phổ biến để quản lý xác thực và phân quyền truy cập là sử dụng JSON Web Token (JWT). Anh em lập trình viên Java đang ngày càng ứng dụng JWT nhiều hơn do tính linh hoạt và dễ dàng tích hợp vào các hệ thống hiện tại. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết cách cài đặt và sử dụng JWT để quản lý token xác thực JSON trong một ứng dụng Java.

JWT là gì?

JWT, viết tắt của JSON Web Token, là một tiêu chuẩn mở (RFC 7519) cho việc truyền tải thông tin giữa các bên dưới dạng một đối tượng JSON an toàn. Nó có thể được sử dụng để xác thực người dùng, phân quyền truy cập và truyền tải thông tin giữa các dịch vụ khác nhau.

Mỗi JWT gồm ba phần:

  1. Header (tiêu đề) - chứa thông tin về loại token và thuật toán mã hóa.
  2. Payload (nội dung) - chứa thông tin mà chúng ta muốn truyền tải. Các thông tin trong payload thường là các claim (khẳng định) như thông tin người dùng, thời gian hết hạn, v.v.
  3. Signature (chữ ký) - để xác thực tính toàn vẹn của token và kiểm tra xem token có được tạo ra bởi một bên đáng tin cậy hay không.

Các bước cài đặt JWT trong Java

Để cài đặt JWT vào ứng dụng Java của bạn, chúng ta cần thực hiện một số bước cơ bản dưới đây.

Cài đặt thư viện JWT

Đầu tiên, chúng ta cần thêm thư viện hỗ trợ JWT vào dự án. Nếu bạn đang sử dụng Maven, bạn có thể thêm đoạn code dưới đây vào tệp pom.xml:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

Nếu bạn đang sử dụng Gradle, thêm đoạn code sau vào tệp build.gradle:

implementation 'io.jsonwebtoken:jjwt:0.9.1'

Tạo Token JWT

Sau khi đã cài đặt thư viện, chúng ta sẽ tạo một hàm để tạo token. Dưới đây là một ví dụ đơn giản để tạo token với thông tin người dùng và thời gian hết hạn.

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    private String secretKey = "mySecretKey"; // Bạn nên thay thế bằng một khóa bí mật an toàn

    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username);
    }

    private String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10 giờ
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }
}

Hàm generateToken nhận vào tên người dùng và tạo ra một token với thời gian hết hạn là 10 giờ.

Xác thực Token JWT

Để xác thực token, chúng ta cần viết một hàm để kiểm tra độ hợp lệ và trích xuất thông tin người dùng từ token. Dưới đây là đoạn mã ví dụ cho việc xác thực token:

public boolean validateToken(String token, String username) {
    final String extractedUsername = extractUsername(token);
    return (extractedUsername.equals(username) && !isTokenExpired(token));
}

private String extractUsername(String token) {
    return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject();
}

private boolean isTokenExpired(String token) {
    return extractExpiration(token).before(new Date());
}

private Date extractExpiration(String token) {
    return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getExpiration();
}

Trong hàm validateToken, chúng ta so sánh tên người dùng và kiểm tra xem token có còn hiệu lực hay không.

Kiểm tra token trong yêu cầu HTTP

Để kiểm tra tính hợp lệ của token trong các yêu cầu HTTP, bạn có thể tạo một bộ lọc mà sẽ kiểm tra token trong tiêu đề yêu cầu. Dưới đây là cách làm:

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.IOException;

public class JwtRequestFilter extends OncePerRequestFilter {

    private JwtUtil jwtUtil;

    public JwtRequestFilter(JwtUtil jwtUtil) {
        this.jwtUtil = jwtUtil;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        final String authorizationHeader = request.getHeader("Authorization");

        String username = null;
        String jwt = null;

        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            jwt = authorizationHeader.substring(7);
            username = jwtUtil.extractUsername(jwt);
        }

        // Nếu đã xác thực người dùng, thì có thể sẽ cần thông tin người dùng vào request
        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            if (jwtUtil.validateToken(jwt, username)) {
                // Thiết lập quyền cho người dùng ở đây
            }
        }
        chain.doFilter(request, response);
    }
}

Kết luận

JWT đã trở thành một công cụ mạnh mẽ trong việc quản lý xác thực và phân quyền truy cập trong các ứng dụng Java. Cài đặt JWT không chỉ giúp bảo mật thông tin mà còn mang lại sự tiện lợi trong việc truyền tải và xác thực thông tin người dùng giữa các dịch vụ. Bài viết này đã hướng dẫn cách cài đặt và sử dụng JWT trong ứng dụng Java một cách chi tiết, từ cài đặt thư viện đến tạo và xác thực token. Nếu bạn còn câu hỏi nào khác hoặc cần thêm thông tin, hãy để lại ý kiến bên dưới để cùng thảo luận!

Comments