python-274Đọc toàn bộ đề miễn phí

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

PythonCơ bản15 phút

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ủ đề

fastapidependency-injectionheadersentry-ramp

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}.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

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.

Nhóm Zalo