Khắc phục lỗi AWS Cognito 'Refresh Token has expired' và ngăn chặn đăng xuất ngẫu nhiên

trung bình☁️ AWS2026-06-05| AWS Cognito User Pools, AWS SDK, AWS Amplify

Error Message

NotAuthorizedException: Refresh Token has expired
#aws#cognito#bảo mật#xác thực#javascript

Bí ẩn về việc phiên làm việc bị mấtNgười dùng của bạn đang duyệt web thì đột nhiên họ bị đẩy về màn hình đăng nhập. Không quan trọng họ đang ở giữa quá trình thanh toán hay đang điền một biểu mẫu phức tạp; phiên làm việc của họ đơn giản là biến mất. Khi bạn kiểm tra log, bạn sẽ tìm thấy thủ phạm: NotAuthorizedException: Refresh Token has expired. Đây không phải là một sự cố sập ứng dụng, mà là một giới hạn cấu hình đã đến hạn.

Điều này xảy ra khi refreshToken—thông tin xác thực dài hạn được dùng để lấy các idTokens 60 phút mới một cách âm thầm—cuối cùng đã hết hạn. Một khi token đó chạm giới hạn (dù là 24 giờ hay 30 ngày), Cognito sẽ từ chối cấp thông tin xác thực mới. Quá trình làm mới chạy ngầm của bạn thất bại và người dùng không còn lựa chọn nào khác ngoài việc đăng nhập lại từ đầu.

Tại sao điều này lại xảy ra?Cognito không bị lỗi; nó đang hoạt động chính xác theo những gì cài đặt App Client quy định. Bạn có thể đang gặp phải một trong ba kịch bản sau:

  • Mặc định hạn chế: App Client của bạn đang sử dụng thời hạn hết hạn ngắn (như mặc định 1 ngày) không phù hợp với hành vi của người dùng.- Sai lệch đơn vị: Bạn dự định đặt thời gian là 30 ngày nhưng vô tình đặt thành 30 giờ.- Trạng thái "Zombified": Frontend của bạn giả định phiên làm việc vẫn hợp lệ cho đến khi lệnh gọi API thất bại, thay vì kiểm tra tình trạng token một cách chủ động.## Cách khắc phục: Kéo dài thời gian phiên làm việcBạn có thể giải quyết vấn đề này ngay lập tức bằng cách điều chỉnh RefreshTokenValidity. Hầu hết các ứng dụng web hiện đại đều hướng tới ít nhất 30 ngày để giữ cho trải nghiệm người dùng không bị gián đoạn.

Tùy chọn 1: AWS Console (Khắc phục thủ công)- Mở Cognito Console và chọn User Pool của bạn.- Chuyển đến tab App integration và cuộn xuống phần App clients.- Nhấp vào client cụ thể mà frontend của bạn sử dụng.- Tìm Token expiration và nhấp vào Edit.- Thay đổi giá trị Refresh token expiration. Cognito cho phép thiết lập từ 60 phút lên đến 3.650 ngày (10 năm).- Lưu thay đổi. Các lần đăng nhập mới từ bây giờ sẽ kế thừa thời hạn dài hơn này.### Tùy chọn 2: AWS CLI (Dành cho DevSecOps)Nếu bạn quản lý nhiều môi trường, đừng thực hiện qua giao diện người dùng. Hãy sử dụng lệnh này để đặt thời hạn 90 ngày cho cách tiếp cận "thiết lập và quên đi":

aws cognito-idp update-user-pool-client \
  --user-pool-id us-east-1_exampleID \
  --client-id your_client_id \
  --refresh-token-validity 90 \
  --token-validity-units "{\"RefreshToken\":\"days\"}"

Tùy chọn 3: Triển khai mã ngăn chặnThay đổi cấu hình chỉ áp dụng cho các phiên làm việc mới. Bạn vẫn cần xử lý các token hiện có đã hết hạn một cách khéo léo. Đừng để ứng dụng của bạn bị lỗi; hãy bắt ngoại lệ và chuyển hướng người dùng một cách chính xác.

import { Auth } from 'aws-amplify';

async function checkSession() {
  try {
    return await Auth.currentSession();
  } catch (err) {
    if (err.code === 'NotAuthorizedException') {
      // Đây là cách chuẩn để xử lý refresh token đã hết hạn
      console.error("Phiên làm việc hết hạn. Đang xóa bộ nhớ đệm cục bộ...");
      await Auth.signOut();
      window.location.href = '/login?reason=expired';
    }
  }
}

Xác minh bản sửa lỗi mà không cần đợi 30 ngàyĐừng đợi cả tháng để xem bản sửa lỗi của bạn có hoạt động hay không. Hãy xác thực nó trong vòng năm phút:

  • Tạo một App Client thử nghiệm tạm thời.- Đặt Refresh Token expiration thành 1 giờ (mức tối thiểu).- Đăng nhập, sau đó điều chỉnh đồng hồ hệ thống theo cách thủ công hoặc chỉ cần đợi 61 phút.- Thực hiện một hành động kích hoạt làm mới token.- Xác minh rằng ứng dụng của bạn bắt được lỗi NotAuthorizedException và chuyển hướng như mong đợi.## Thực hành tốt nhất cho môi trường ProductionBảo mật và trải nghiệm người dùng là một bài toán cân bằng. Đối với các ứng dụng ngân hàng, refresh token 24 giờ là tiêu chuẩn. Đối với dashboard SaaS, 30 đến 90 ngày sẽ phù hợp hơn. Mẹo bảo mật: Trong khi điều chỉnh các token này, bạn có thể cần tạo thông tin xác thực quản trị viên an toàn để thử nghiệm. Tôi sử dụng Trình tạo mật khẩu của ToolCraft. Vì nó chạy cục bộ trong trình duyệt của bạn, các bí mật được tạo không bao giờ chạm tới máy chủ của họ, điều này rất quan trọng khi xử lý các môi trường AWS.

Những điểm chính cần lưu ý- Access so với Refresh: Access token dành cho ủy quyền ngắn hạn (1 giờ). Refresh token dành cho sự liên tục dài hạn.- Đăng xuất chủ động: Luôn sử dụng Auth.signOut() khi refresh token hết hạn để xóa các JWT cũ khỏi LocalStorage.- Giám sát: Theo dõi các chỉ số TokenRefresh trong CloudWatch. Sự gia tăng đột ngột của các lỗi thường chỉ ra một thay đổi cấu hình làm hỏng các phiên người dùng hiện có.

Related Error Notes