12

Một câu hỏi tương tự được đăng ở đây: What's an appropriate HTTP status code to return by a REST API service for a validation failure?Mã trạng thái HTTP thích hợp là gì nếu người dùng cố gắng đăng nhập bằng tên người dùng/mật khẩu không chính xác, nhưng định dạng đúng?

Câu trả lời trong chủ đề trên khẳng định rằng "Ví dụ nếu URI là phải có một ngày theo tiêu chuẩn ISO-8601 và bạn thấy rằng đó là sai định dạng hoặc đề cập đến tháng 31, sau đó bạn sẽ trả về HTTP 400. Ditto nếu bạn mong đợi XML được định dạng tốt trong một thực thể và nó không phân tích cú pháp. "

Tuy nhiên, điều gì sẽ xảy ra nếu người dùng gửi dữ liệu được định dạng chính xác? Điều này có nghĩa là, người dùng đã gửi một chuỗi ký tự/văn bản thuần túy cho tên người dùng và mật khẩu (hoàn toàn hợp lệ cho ứng dụng của tôi). Vấn đề duy nhất là mật khẩu không khớp với tên người dùng. Trong trường hợp này, 400 sẽ không chính xác vì nó là cú pháp hoàn toàn hợp lệ và được tạo đúng.

401 sẽ không chính xác (như được đề xuất ở đây: Which HTTP status code to say username or password were incorrect?) vì người dùng không cố gắng truy cập bất kỳ trang nào, anh chỉ đơn giản là cố đăng nhập và nhập dữ liệu không khớp.

Nếu bạn nhìn lại bài đăng đầu tiên mà tôi liên kết, câu trả lời thứ hai cho biết 422 là câu trả lời đúng (và có vẻ đúng với tôi), tuy nhiên, tôi đang sử dụng Django Rest Framework và 422 không phải là một phần của mã trạng thái (danh sách các mã trạng thái là một phần của DRF có thể tìm thấy tại đây: http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx)

404 cũng không đúng vì dữ liệu được chấp nhận thành công và không bị từ chối.

Với điều đó đã nói, câu trả lời đúng thực sự cần được sử dụng là gì?

Trả lời

14

Mã HTTP đúng sẽ thực sự là 401. Từ the RFC:

Các 401 (trái phép) mã trạng thái chỉ rằng yêu cầu không được áp dụng vì nó thiếu thông tin đăng nhập xác thực hợp lệ cho tài nguyên đích. Máy chủ tạo ra một phản hồi 401 PHẢI gửi một trường tiêu đề WWW-Authenticate (Phần 4.1) có chứa ít nhất một thử thách áp dụng cho tài nguyên đích.

Nếu yêu cầu bao gồm bằng chứng xác thực, thì phản hồi 401 cho biết rằng ủy quyền đã bị từ chối đối với các thông tin đăng nhập đó. Tác nhân người dùng CÓ THỂ lặp lại yêu cầu với trường tiêu đề Cấp phép mới hoặc được thay thế (Mục 4.2).

+0

bạn nói đúng, 401 là những gì tôi nên sử dụng. Wow, không thể tin rằng tôi đã bỏ lỡ phần thứ hai của lời giải thích. Cảm ơn. Tôi sẽ đánh dấu câu hỏi này là chính xác trong 8 phút khi nó cho phép tôi. – user2719875

+2

Tiêu chuẩn bị damned, tôi nghĩ 418 vẫn là đáp ứng tốt nhất – sjagr

+0

Từ phần bạn đang trích dẫn, phản hồi 401 cho biết yêu cầu ** không được áp dụng **. Do đó, không có lần đăng nhập ** nào được thực hiện, bởi vì ủy quyền là cần thiết ở cấp độ thấp hơn trước tiên. Điều này thường có thể xảy ra khi một số lớp bảo mật được lồng nhau và là một phản hồi hợp lệ để chỉ ra yêu cầu auth với lớp ngoài trước khi cố gắng xác thực với lớp bên trong. – spectras

Các vấn đề liên quan