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
NotAuthorizedExceptionvà 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.

