Mã trạng thái HTTP thích hợp để trả về bởi dịch vụ API REST cho lỗi xác thực là gì?


394

Tôi hiện đang trả lại trái phép 401 bất cứ khi nào tôi gặp phải lỗi xác thực trong ứng dụng API REST dựa trên Django / Piston của mình . Đã xem qua Sổ đăng ký mã trạng thái HTTP Tôi không tin rằng đây là mã phù hợp cho lỗi xác thực, bạn muốn giới thiệu gì?

  • 400 yêu cầu xấu
  • 401 trái phép
  • 403 Cấm
  • 405 Phương pháp không được phép
  • 406 Không được chấp nhận
  • 412 Điều kiện không thành công
  • Không thể mong đợi
  • Thực thể không thể xử lý 422
  • 424 Phụ thuộc thất bại

Cập nhật : "Lỗi xác thực" ở trên có nghĩa là lỗi xác thực dữ liệu ở cấp ứng dụng, nghĩa là, datetime được chỉ định không chính xác, địa chỉ email không có thật, v.v.


2
Kiểm tra câu trả lời này: stackoverflow.com/a/2657624/221612
Kenny Meyer

3
Fwiw, liên kết của Kenny gợi ý mã 422, như câu trả lời của Jim bây giờ dưới đây . #TheMoreYouKnow #SavingYouAClick
ruffin

Tôi nghĩ rằng 401 là rõ ràng hơn.
phù hợp

Câu trả lời:


298

Nếu "lỗi xác thực" có nghĩa là có một số lỗi máy khách trong yêu cầu, thì hãy sử dụng HTTP 400 (Yêu cầu xấu). Chẳng hạn, nếu URI được cho là có ngày ISO-8601 và bạn thấy rằng nó ở định dạng sai hoặc tham chiếu đến ngày 31 tháng 2, thì 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

(1/2016): Trong năm năm qua , HTTP 422 (Thực thể không thể xử lý) cụ thể hơn của WebDAV đã trở thành một thay thế rất hợp lý cho HTTP 400. Xem ví dụ sử dụng API API . Nhưng xin lưu ý rằng HTTP 422 chưa biến nó thành HTTP 1.1, RFC-7231 .

Các dịch vụ web RESTful của Richardson và Ruby chứa một phụ lục rất hữu ích về thời điểm sử dụng các mã phản hồi HTTP khác nhau. Họ nói:

400 (Yêu cầu xấu Bad)
Tầm quan trọng: Cao.
Đây là trạng thái lỗi phía máy khách chung, được sử dụng khi không có mã lỗi 4xx nào khác phù hợp. Nó thường được sử dụng khi máy khách gửi một đại diện cùng với yêu cầu PUT hoặc POST và đại diện ở định dạng đúng, nhưng nó không có nghĩa gì cả. (trang 38)

và:

401 (mệnh giá trái phép trực tuyến)
Tầm quan trọng: Cao.
Máy khách đã cố gắng hoạt động trên một tài nguyên được bảo vệ mà không cung cấp thông tin xác thực phù hợp. Nó có thể đã cung cấp thông tin sai, hoặc không có gì cả. Thông tin đăng nhập có thể là tên người dùng và mật khẩu, khóa API hoặc mã thông báo xác thực bất cứ điều gì mà dịch vụ đang đề cập đang mong đợi. Một khách hàng thường yêu cầu URI và chấp nhận một chỉ số 401 để họ biết loại thông tin nào cần gửi và ở định dạng nào. [...]


3
Nhưng có lẽ nếu định dạng URI không hợp lệ, 404 có thể phù hợp hơn.
manu

11
Như đã nêu bởi @ReWrite, tôi cũng nghĩ rằng 422 là tốt hơn cho các lỗi xác nhận.
panteo

11
Tôi nói điều này là sai. 400 Yêu cầu xấu được sử dụng khi có yêu cầu sai về mặt cú pháp. Tôi muốn nói rằng ReWrite đã đúng khi đề xuất 422, đó là về nội dung của yêu cầu.
Stijn de Witt

3
@Kenji có, 401 (Ngay khi không được phép): "Nó có thể đã cung cấp thông tin đăng nhập sai ..." có nghĩa là người dùng và / hoặc mật khẩu sai.
razzintown

4
@JimFerrans 400 lỗi là do cú pháp đưa ra không chính xác. 401 lỗi cụ thể là nếu tôi đang cố truy cập một trang mà tôi cần phải đăng nhập để truy cập và tôi hoàn toàn không đăng nhập. 422 lỗi là do cú pháp đúng, nhưng máy chủ đang từ chối dịch vụ. Tên người dùng / mật khẩu sai là cú pháp đúng (không phải lỗi 400) và tôi không cố truy cập vào trang mà tôi cần phải đăng nhập vì tôi đang truy cập vào trang đăng nhập (không phải lỗi 401). Lỗi 401 nên được sử dụng cho một cái gì đó như trang cài đặt mà chỉ người dùng mới có thể truy cập
Zachary Weixelbaum

98

Từ RFC 4918 (và cũng được ghi nhận tại http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml ):

Mã trạng thái 422 (Thực thể không thể xử lý) có nghĩa là máy chủ hiểu loại nội dung của thực thể yêu cầu (do đó mã trạng thái 415 (Loại phương tiện không được hỗ trợ) là không phù hợp) và cú pháp của thực thể yêu cầu là chính xác (do đó là 400 (Yêu cầu sai ) mã trạng thái không phù hợp) nhưng không thể xử lý các hướng dẫn có trong đó. Ví dụ, điều kiện lỗi này có thể xảy ra nếu một thân yêu cầu XML chứa các hướng dẫn XML được định dạng đúng (nghĩa là đúng về mặt cú pháp), nhưng sai về mặt ngữ nghĩa, về mặt ngữ nghĩa.


6
Tôi muốn giới thiệu 422 - Thực thể không thể xử lý cho các lỗi xác thực trên 400 - Yêu cầu không hợp lệ
java_geek


19

Đây là:

rfc2616 # phần-10.4.1 - 400 Yêu cầu xấu

Máy chủ không thể hiểu được yêu cầu do cú pháp không đúng . Khách hàng KHÔNG NÊN lặp lại yêu cầu mà không sửa đổi.

rfc7231 # phần-6.5.1 - 6.5.1. 400 yêu cầu xấu

Mã trạng thái 400 (Yêu cầu xấu) chỉ ra rằng máy chủ không thể hoặc sẽ không xử lý yêu cầu do lỗi được coi là lỗi máy khách (ví dụ: cú pháp yêu cầu không đúng định dạng, đóng khung thông báo yêu cầu không hợp lệ hoặc định tuyến yêu cầu lừa đảo) .

Đề cập đến các trường hợp không đúng định dạng (không đúng định dạng)!

rfc4918 - 11.2. Thực thể không thể xử lý 422

Mã trạng thái 422 (Thực thể không thể xử lý) có nghĩa là máy chủ
hiểu loại nội dung của thực thể yêu cầu (do đó mã trạng thái 415 (Loại phương tiện không được hỗ trợ) là không phù hợp) và cú pháp của thực thể yêu cầu là chính xác (do đó là 400 (Yêu cầu sai ) mã trạng thái không phù hợp) nhưng không thể xử lý các hướng dẫn có trong đó. Ví dụ, điều kiện lỗi này có thể xảy ra nếu một thân yêu cầu XML chứa các hướng dẫn XML được định dạng đúng (nghĩa là đúng về mặt cú pháp), nhưng sai về mặt ngữ nghĩa, về mặt ngữ nghĩa .

Phần kết luận

Nguyên tắc chung: [_] 00 bao gồm các trường hợp chung nhất và các trường hợp không được quy định trong mã được chỉ định.

422 phù hợp với lỗi xác thực đối tượng tốt nhất (chính xác là khuyến nghị của tôi :)
Đối với lỗi ngữ nghĩa - Hãy nghĩ về một cái gì đó như xác thực "Tên người dùng này đã tồn tại".

400 được sử dụng không chính xác để xác nhận đối tượng


9

Tôi có thể nói về mặt kỹ thuật, đó có thể không phải là lỗi HTTP, vì tài nguyên (có lẽ được chỉ định hợp lệ), người dùng đã được xác thực và không có lỗi vận hành (tuy nhiên, thông số kỹ thuật bao gồm một số mã dành riêng như 404 Thanh toán bắt buộc ' Nói một cách nghiêm túc liên quan đến HTTP, mặc dù có thể nên có điều đó ở cấp độ giao thức để bất kỳ thiết bị nào cũng có thể nhận ra điều kiện).

Nếu thực sự đúng như vậy, tôi sẽ thêm trường trạng thái vào phản hồi với lỗi ứng dụng, như

<status> <code> 4 </ code> <message> Phạm vi ngày không hợp lệ </ message> </ status>


1

Có thêm một chút thông tin về ngữ nghĩa của các lỗi này trong RFC 2616 , tài liệu HTTP 1.1.

Cá nhân, tôi có thể sẽ sử dụng 400 Bad Request, nhưng đây chỉ là ý kiến ​​cá nhân của tôi mà không có bất kỳ sự hỗ trợ thực tế nào.


0

Chính xác thì bạn có ý gì khi "thất bại xác nhận"? Bạn đang xác nhận cái gì? Bạn đang đề cập đến một cái gì đó như lỗi cú pháp (ví dụ XML không đúng định dạng)?

Nếu đó là trường hợp, tôi muốn nói 400 Yêu cầu xấu có lẽ là điều đúng, nhưng không biết bạn đang "xác nhận" điều gì, thì không thể nói được.


Điều gì xảy ra nếu chúng ta đang cố gắng xác nhận một số quy tắc hoặc quy tắc kinh doanh.
Metalhead
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.