Xử lý trường hợp Token hết hạn

Jul 18, 2024

Xử lý Token hết hạn trong hệ thống web

Tổng quan

  • Lưu phiên đăng nhập của người dùng thông qua Cookie.
  • Khi session hết hạn, cần xóa Cookie và chuyển hướng về trang login.
  • Sơ đồ hệ thống: client (Next.js) -> server (Next.js) -> server backend.
  • Cần thống nhất với backend về lỗi khi Token hết hạn (sử dụng mã lỗi 401).

Các trường hợp gọi API

  1. Client Component gọi đến Server Backend.
    • Gọi đến API login từ client component đến server backend.
    • Server trả về lỗi 401, xử lý logout client.
  2. Server Component gọi đến Server Backend.
    • Xử lý token hết hạn bằng cách chuyển hướng đến trang logout.
    • Không thể xóa Cookie từ server, cần sử dụng redirection.

Cấu trúc mã nguồn và các thay đổi

  1. HTTP Interceptor tại Next Client

    • Kiểm tra status 401, gọi API logout nếu lỗi liên quan đến authentication.
    • Sử dụng interceptor để kiểm tra và xử lý logout.
    • Thêm if để chỉ gọi API logout tại client.
    if (status === 401 && typeof window !== 'undefined') {
      // Gọi API logout
    }
    
  2. Trang Logout

    • Tạo một trang logout.tsx.
    • Trang xử lý API logout để xóa Cookie và chuyển hướng về trang login.
    • Kiểm tra session token từ URL và so sánh với Cookie.
    // Kiểm tra Token và gọi API logout
    if (sessionToken === getCookie('sessionToken')) {
      fetch('/api/logout', { method: 'POST', body: '{}' });
    }
    ``
    
    
  3. Redirect tại server component đối với trường hợp token hết hạn

    • Sử dụng redirect từ next/navigation để chuyển hướng đến trang logout.
    if (status === 401) {
      redirect(`/logout?sessionToken=${sessionToken}`);
    }
    
  4. Decode JSON Web Token (JWT)

    • Cài đặt package jsonwebtoken và viết hàm decode cho JWT.
    import jwt from 'jsonwebtoken';
    
    const decoded = jwt.decode(token);
    const { exp } = decoded; // Lấy thời gian hết hạn từ JWT
    
  5. Logout API

    • Xử lý API /api/logout để xóa Cookie và trả về thông báo.
    • Thêm logic force logout (khi client yêu cầu).
    if (force) {
      // Xóa Cookie
      res.setHeader('Set-Cookie', '...');
      res.status(200).json({ message: 'Đã logout' });
    }
    
  6. Cài đặt và sử dụng abort controller

    • Sử dụng abort controller để hủy các request logout bị duplicate.
    const controller = new AbortController();
    const signal = controller.signal;
    
    fetch('/api/logout', { signal });
    controller.abort(); // Hủy request
    

Kết Luận

  • Đã xử lý thành công các trường hợp khi Token hết hạn tại Next Client và Next Server.
  • Sử dụng các kỹ thuật như redirect và abort controller để tối ưu hóa quá trình xử lý logout.