2010-08-23 29 views
5

Tôi đang xây dựng giao thức RESTful cho ứng dụng Dynamic Carpooling, cho luận án Khoa học máy tính của tôi.Mã trạng thái HTTP đúng khi tài nguyên có sẵn nhưng không thể truy cập do các quyền

Trong Nghị định thư, tôi cũng phải chỉ định chính thức mã trạng thái HTTP cho mỗi thao tác. Tôi có vấn đề "liên quan đến quyền riêng tư" này. Giả sử như sau:

GET /api/persons/angela/location

Lấy vị trí hiện tại của người dùng "angela". Rõ ràng là không phải ai cũng có thể nhận được kết quả. Chỉ có bản thân angela và một người lái xe có thể sẽ chọn cô ấy mới có thể biết điều đó.

Tôi không thể quyết định có trả lại 404 không tìm thấy hay cấm 401 ở đây hay không.

Bất kỳ gợi ý? Điều gì sẽ là tốt nhất và tại sao?

+0

404 hoàn toàn không chính xác ở đây vì nó cho biết bản ghi không tồn tại chút nào. – You

Trả lời

15

Theo Wikipedia (và RFC 2616), mã 401 được sử dụng khi trang tồn tại nhưng yêu cầu xác thực; 403 dành cho trang xác thực sẽ không thay đổi bất kỳ thứ gì. (Trong tự nhiên, 403 thường có nghĩa là các điều khoản trên một cái gì đó là sai, trong khi 401 sẽ nhắc người dùng cho một tên người dùng/mật khẩu). 404 là nơi tài liệu không tồn tại.

Trong trường hợp của bạn, có vẻ như 401 là mã thích hợp nhất, vì có một số cách xác thực người dùng DO có quyền truy cập vào trang.

+0

Tốt nhất! Khá toàn bộ các hoạt động giao thức yêu cầu xác thực. Tôi đã có các trường hợp trong đó các tài nguyên có sẵn nhưng không thể được truy xuất vì quyền của người dùng và các trường hợp trong đó tài nguyên không có sẵn bởi vì các tài nguyên trước đây đã bị xóa. Cả hai trường hợp đều thuộc các hoạt động đã được xác thực. Bạn sẽ đi cho 401 trong trường hợp đầu tiên và 404 cho trường hợp thứ hai? Do đó: tài nguyên tồn tại nhưng bạn không thể truy cập tài khoản -> 401 tài nguyên không tồn tại -> 404 – dgraziotin

+0

Có, nếu tài nguyên bị xóa, 404 là thích hợp nếu sau đó cố gắng truy cập. – Phil

+1

Câu trả lời hay, nhưng tôi thích "theo Wikipedia" để nói "theo RFC 2616" http://tools.ietf.org/html/rfc2616#section-10.4.2;) – Day

0

Chắc chắn KHÔNG 404. 404 không tìm thấy.
401 bị từ chối truy cập.
403 bị cấm.

tôi sẽ đi với 401

+1

401 là * không * truy cập từ chối.Đó là "không đăng nhập và yêu cầu đăng nhập". –

+0

@EricStein Theo RFC 2616 (http://tools.ietf.org/html/rfc2616#section-10.4.2), "Nếu yêu cầu đã bao gồm thông tin đăng nhập ủy quyền, thì phản hồi 401 cho biết rằng ủy quyền đã bị từ chối cho những thông tin đăng nhập này. " Vì vậy, 401 trong thực tế truy cập bị từ chối. –

-1

Nếu chứng uỷ quyền được cung cấp trong yêu cầu và người yêu cầu không có quyền truy cập khu vực này thì bạn nên trở lại 403.

Nếu không có thông tin cho phép được cung cấp trong yêu cầu sau đó bạn nên trả lại 401.

+2

Nếu thông tin ủy quyền được cung cấp trong yêu cầu và người yêu cầu không có quyền truy cập tài nguyên này thì bạn nên trả lại 401 không phải là 403. RFC 2616 nói rõ ràng rằng đối với 403, "Ủy quyền sẽ không giúp và yêu cầu KHÔNG được lặp lại "(http://tools.ietf.org/html/rfc2616#section-10.4.4). Vì vậy, nếu có thông tin đăng nhập hợp lệ cho phép truy cập tài nguyên, đừng trả lại 403. – Day

+0

@Day Bạn hoàn toàn chính xác. Câu trả lời của tôi là sai. Hmm, bạn học một cái gì đó mới mỗi ngày. –

+0

Không phải lo lắng. Làm thế nào về việc có một đâm tại spin của tôi tắt câu hỏi http://stackoverflow.com/q/4038981/445073 :) – Day

1

Với tôi tôi sẽ sử dụng 400 yêu cầu không hợp lệ.
Bởi vì đơn đăng ký của tôi sẽ không đi các tài nguyên không thể truy cập được theo chương trình.
Việc lọc quyền của người dùng và ẩn tài nguyên không thể truy cập là trải nghiệm người dùng tốt theo ý kiến ​​của tôi. Nếu máy chủ của tôi có yêu cầu không thể truy cập có nghĩa là một số người đang cố gắng làm điều gì đó.
Đó là lý do tại sao tôi chọn 400 - Yêu cầu không hợp lệ trong các ứng dụng của tôi.

+0

Tôi không đồng ý. phản hồi 400 Yêu cầu không hợp lệ đối với các yêu cầu hợp lệ là API bị hỏng. Yêu cầu 400 có nghĩa là có điều gì đó sai với yêu cầu. Bất kỳ ai sử dụng API của bạn sẽ nghĩ rằng yêu cầu là sai, khi thực tế, yêu cầu là đúng, đây là nghĩa đen là 401 và 403. Nó làm cho mọi thứ dễ dàng hơn để gỡ lỗi. –

+0

Như tôi đã nói người dùng bình thường không bao giờ yêu cầu tài nguyên không thể truy cập. Nếu máy chủ của tôi có yêu cầu không thể truy cập có nghĩa là một số người lén lút đang cố gắng hack tài nguyên không thể truy cập. Ngoài ra tôi sẽ không bao giờ trả lời mã lỗi cho các yêu cầu hợp lệ. – jeefo

+0

Bạn thường không bao giờ nên đưa ra giả định về những gì người dùng bình thường sẽ và sẽ không làm. Xác thực không nhất thiết phải là một phần của yêu cầu. Nếu bạn lo lắng về những người lén lút, giải pháp chính xác không cố ý phá vỡ HTTP (bảo mật bởi sự tối tăm). Giải pháp chính xác là đặt một bức tường lửa trước API của bạn, để những người lén lút thậm chí không thể thăm dò API của bạn ngay từ đầu. –

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