Phân biệt 401 vs 403
GET · /api/practice/level3/admin-only · Khó
Mô tả bài tập
Đây là lỗi rất nhiều tester hay nhầm: 401 Unauthorized nghĩa là hệ thống KHÔNG BIẾT bạn là ai (thiếu/sai/hết hạn token), còn 403 Forbidden nghĩa là hệ thống ĐÃ BIẾT bạn là ai nhưng bạn không có quyền thực hiện hành động đó. Endpoint /admin-only chỉ cho phép tài khoản có role 'admin' truy cập. Đăng nhập bằng POST /jwt/login (dùng lại endpoint ở bài Bearer Token/JWT) với 1 trong 2 tài khoản demo: 'tester' / 'Test@123' (role user) hoặc 'admin' / 'Admin@123' (role admin), rồi dùng accessToken nhận được để gọi GET /admin-only.
Mục tiêu học được
- Phân biệt rõ ràng ý nghĩa của 401 (chưa xác thực) và 403 (đã xác thực, không đủ quyền)
- Hiểu vì sao trả nhầm 401 thay vì 403 (hoặc ngược lại) có thể làm lộ thông tin hoặc gây khó hiểu cho client
- Test đủ 3 tình huống: không gửi token, gửi token của user thường, và gửi token của admin
💡 Bài này hoàn thành khi bạn đã gọi đủ 3 tình huống: không có token (401), token của user thường (403), và token của admin (200).
Lệnh curl
# 1. Không gửi token -> mong đợi 401
curl -i "http://testing-api.systemhub.uk/api/practice/level3/admin-only" \
-H "X-Practice-Token: YOUR_TOKEN"
# 2. Đăng nhập bằng tài khoản user thường rồi gọi lại -> mong đợi 403
curl -s -X POST "http://testing-api.systemhub.uk/api/practice/level3/jwt/login" \
-H "Content-Type: application/json" -d '{"username": "tester", "password": "Test@123"}'
curl -i "http://testing-api.systemhub.uk/api/practice/level3/admin-only" \
-H "X-Practice-Token: YOUR_TOKEN" -H "Authorization: Bearer <accessToken của tester>"
# 3. Đăng nhập bằng tài khoản admin rồi gọi lại -> mong đợi 200
curl -s -X POST "http://testing-api.systemhub.uk/api/practice/level3/jwt/login" \
-H "Content-Type: application/json" -d '{"username": "admin", "password": "Admin@123"}'
curl -i "http://testing-api.systemhub.uk/api/practice/level3/admin-only" \
-H "X-Practice-Token: YOUR_TOKEN" -H "Authorization: Bearer <accessToken của admin>"
Các bước làm trên Postman
- GET http://testing-api.systemhub.uk/api/practice/level3/admin-only mà KHÔNG có header Authorization, kiểm tra status 401
- POST http://testing-api.systemhub.uk/api/practice/level3/jwt/login với username=tester, password=Test@123, copy accessToken
- GET lại /admin-only với Authorization: Bearer <accessToken của tester>, kiểm tra status 403
- POST /jwt/login lần nữa với username=admin, password=Admin@123, copy accessToken mới
- GET lại /admin-only với accessToken của admin, kiểm tra status 200
Đăng nhập để lệnh curl ở trên tự động điền sẵn Practice Token thật của bạn.
🧪 Thử nghiệm trực tiếp
Gọi API ngay tại đây. Nếu bạn đã đăng nhập, tiến độ sẽ được ghi nhận tự động khi gọi đúng như kỳ vọng của bài.
Kết quả
Status: