Token chưa hết hạn nhưng API vẫn từ chối
Hãy kiểm tra bên nhận trước khi chỉ tập trung vào exp. aud xác định đối tượng nhận và có thể là chuỗi hoặc mảng chuỗi. iss chỉ bên phát hành, còn sub xác định chủ thể. Token dành cho một API khác vẫn có thể bị từ chối dù chưa hết hạn.
Claim là thông tin do token tự khai báo. Đọc được claim không chứng minh nguồn phát hành đáng tin cậy. Ứng dụng hoặc giao thức quyết định trường nào bắt buộc và giá trị nào được chấp nhận.
Ba phần của JWT chứa những gì?
JWT có chữ ký thường dùng dạng header.payload.signature. Hai phần đầu là đối tượng JSON UTF-8 được biểu diễn bằng Base64url. Phần cuối chứa byte chữ ký hoặc MAC, không phải một tài liệu JSON nữa.
Có thể dán token riêng, kèm Bearer hoặc kèm Authorization: Bearer. Không dán toàn bộ yêu cầu HTTP. Hai khối JSON được sao chép riêng; cách viết số gốc, kể cả số nguyên lớn, được giữ nguyên khi hiển thị và sao chép.
Đọc exp theo giây thay vì mili giây
exp là thời điểm hết hạn, nbf là thời điểm sớm nhất được dùng và iat là lúc phát hành. NumericDate tính bằng giây từ epoch Unix. Giá trị 1704067200 tương ứng 00:00 UTC ngày 1/1/2024, không phải timestamp mili giây của JavaScript.
Bảng so sánh dùng đồng hồ thiết bị và không cộng dung sai lệch giờ. exp còn ở tương lai không chứng minh chữ ký đúng hoặc aud phù hợp. iat ở tương lai chỉ là một dấu hiệu cần xem xét; quy tắc từ chối thuộc về ứng dụng.
“Giải mã JWT” ở đây là đọc Base64url
Base64url là cách biểu diễn dữ liệu, không phải mã hóa để giữ bí mật. Vì vậy, nội dung JWT có chữ ký vẫn đọc được mà không cần secret. Khi chấp nhận token, dịch vụ phải xác minh chữ ký bằng khóa tin cậy và thuật toán được cho phép, đồng thời kiểm tra các claim cần thiết. Không lấy riêng alg trong token làm căn cứ tin cậy.
Công cụ không truy cập URL khóa và không sử dụng khóa nhúng. Không hỗ trợ giải mã nội dung được mã hóa bảo mật của JWE năm phần, JWT lồng nhau hoặc b64: false. Giới hạn là 50.000 ký tự và 64 cấp JSON. Khóa trùng lặp bị từ chối để tránh cách hiểu mâu thuẫn.
Thử ba ví dụ
Câu hỏi thường gặp
Đọc JWT có cần secret không?
Không, với JWT ba phần có header và payload là JSON. Chỉ cần khôi phục dữ liệu Base64url. Secret hoặc khóa công khai phục vụ việc xác minh mật mã; công cụ này không thực hiện xác minh.
alg: none có nghĩa là gì?
Token không có chữ ký mật mã. Phần thứ ba rỗng nhưng dấu chấm cuối vẫn phải giữ lại. Việc đọc được token không làm cho các claim trở nên đáng tin cậy.
Token có bị gửi lên máy chủ không?
Công cụ xử lý trong trình duyệt, không gửi đầu vào tới API giải mã, không lưu và không đưa vào URL. Bearer token thật có thể cấp quyền truy cập; nên dùng ví dụ giả lập khi thử tính năng.
Các ví dụ có dùng để đăng nhập được không?
Không. Ví dụ hết hạn có exp là 01:00 UTC ngày 1/1/2024 và chữ ký minh họa. Ví dụ Unicode chứa nhiều ngôn ngữ và nhiều bên nhận, cũng dùng chữ ký minh họa. Ví dụ còn lại dùng alg: none.
Vì sao token bị báo sai định dạng?
Kiểm tra đủ ba phần và bỏ khoảng trắng, dấu ngoặc kép hay padding thừa. Header và payload phải là đối tượng JSON UTF-8. Khóa trùng, mã hóa sai và chữ ký rỗng không khớp alg đều bị từ chối. Nếu có năm phần, token có thể là JWE.
