Dependency đọc token trong header và trả mã trạng thái
Dependency của FastAPI tách phần xác thực ra khỏi hàm xử lý: thay vì mỗi endpoint tự đọc
Tiến độ của tôi ở bài này
Điểm và code bạn nộp được lưu vào tài khoản sau khi chấm bài.
Đang tải điểm của bạn…
Kiến thức và chủ đề
Kiến thức tiên quyết: python-basics, python-dictionaries.
Nội dung đề bài
Mô tả bài toán
Dependency của FastAPI tách phần xác thực ra khỏi hàm xử lý: thay vì mỗi endpoint tự đọc header, ta viết một hàm lấy token bằng Header(...), tra bảng vai trò và để FastAPI tự gọi nó trước khi chạy phần thân endpoint. Nhờ vậy quy tắc xác thực chỉ tồn tại ở một chỗ.
Yêu cầu
- Khai báo ứng dụng app với endpoint GET /profile dùng dependency current_role.
- Dependency đọc header X-Token, cắt khoảng trắng hai đầu rồi tra bảng
{"tok-admin": "admin", "tok-viewer": "viewer", "tok-editor": "editor"}. Sau khi cắt, phép tra vẫn phân biệt chữ hoa chữ thường. Nếu không có trong bảng thì trả lỗi 401 với phần thân {"detail": "invalid token"}.
- Endpoint trả về {"role": role, "can_edit": role == "admin"}.
- Viết hàm profile_for_token(token) dùng TestClient gọi GET /profile với header
X-Token: token, lấy phần thân JSON, thêm khoá "status" bằng mã trạng thái HTTP rồi trả về dict đó.
Quy ước nộp bài
Nộp app, dependency current_role và hàm profile_for_token trong solution.py. Hệ thống gọi hàm trực tiếp theo tên đối số và so dict trả về với kết quả soạn tay; không đọc dữ liệu từ stdin và không in ra stdout.
Input
- token: chuỗi token; có thể rỗng, sai chữ hoa chữ thường, hoặc có khoảng trắng thừa ở
hai đầu.
Output
Khi token hợp lệ: {"role": ..., "can_edit": ..., "status": 200}. Khi token không hợp lệ: {"detail": "invalid token", "status": 401}.
Ràng buộc
- Cắt khoảng trắng trước khi tra bảng, nhưng vẫn phân biệt chữ hoa chữ thường:
"TOK-ADMIN" là không hợp lệ.
- Token không có trong bảng trả mã 401, không phải 403 hay 422.
- Phải đọc mã trạng thái thật từ phản hồi, không giả định luôn là 200.
- Chỉ trả về dict; không trả về đối tượng phản hồi của Starlette.
Ví dụ 1
Input
profile_for_token(token="tok-admin")
Output
{"role": "admin", "can_edit": true, "status": 200}
Ví dụ 2
Input
profile_for_token(token="tok-viewer")
Output
{"role": "viewer", "can_edit": false, "status": 200}
Giải thích
profile_for_token("tok-admin") trả về {"role": "admin", "can_edit": True, "status": 200}. profile_for_token("tok-nope") trả về {"detail": "invalid token", "status": 401}.
Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.
Góp ý & báo lỗi bài tập
Đề bài chưa rõ, test có vấn đề hay bạn có ý tưởng giúp bài tốt hơn? Gửi cho đội ngũ AI Empire nhé — mỗi góp ý đều được đọc.
