Các cấp quyền của người dùng trong API RESTful


23

Hãy nói rằng tôi có một công ty xếp những con mèo dễ thương nhất trên internet.

Tôi cung cấp một nguồn tài nguyên/cats/ cung cấp cho người dùng những chú mèo đáng yêu mới nhất, dễ thương nhất.

Người dùng có thể chỉ nhận được 3 con mèo hàng đầu nếu họ chưa trả tiền hoặc đã đăng ký. 10 con mèo hàng đầu nếu chúng trả 336 đô la và được đăng nhập, và 100 con mèo hàng đầu nếu chúng trả 1337 đô la và được đăng nhập. Tôi có 'định danh người dùng' khi đưa ra yêu cầu.

Nói tóm lại, người tiêu dùng /cats/có được số lượng mèo khác nhau dựa trên 'xếp hạng người dùng' của họ . Tôi có một định danh người dùng ở đầu tiêu thụ, nhưng tôi không có đại diện rõ ràng về cấp độ người dùng ở đầu tiêu dùng. Tôi muốn thông báo cho người dùng rằng họ có thể nâng cấp đăng ký của mình khi thực hiện yêu cầu. Đó là, tôi cần phân biệt giữa 3 con mèo vì tôi chỉ cung cấp 3 con mèo3 con mèo vì đó là mức độ người dùng cho phép .

Thực tiễn tốt nhất để phân biệt giới hạn tài nguyên là gì bởi vì người tiêu dùng không có đủ quyền riêng tư và giới hạn nó vì đó là những gì người tiêu dùng có?

Làm thế nào để khách hàng biết nếu họ có thể nâng cấp thứ hạng của họ? Đó là, họ chỉ có một nguồn tài nguyên hạn chế vì họ không có quyền. Thực hành tốt nhất ở đây là gì?

Lưu ý, đây là một đơn giản hóa tổng thể của trường hợp thực tế. Ngoài ra, chỉ cần làm rõ - đọc được đánh giá cao.


Cập nhật:

Dưới đây là các tùy chọn chúng tôi đã xem xét:

  • Lưu trữ các đối tượng quyền người dùng một lần trên máy khách, chỉ truy vấn nó khi đăng nhập hoặc nâng cấp tài khoản được thực hiện.
  • Truyền nullcác giá trị trong JSON cho thấy nó tồn tại, nhưng thực tế không có gì được chuyển. Vì vậy, 10 con mèo cho một người dùng có 3 con mèo có thể là["Garfield","Sylvester","Puss in Boots",null*7]
  • Vượt qua một cặp quyền tài nguyên {cats:["Whiskers","Fluffy","Socks"],authCount:3}

Tôi muốn làm điều này ngay lần đầu tiên để giao những con mèo dễ thương nhất theo cách tốt nhất có thể và chúng tôi và chúng tôi muốn


4
bây giờ tôi muốn xem hình ảnh của những chú mèo dễ thương
Carrie Kendall

Tôi không hiểu Nếu bạn không lưu trữ 'cấp độ người dùng' ở bất cứ đâu, thì bạn không thể phân biệt. Có vẻ như bạn không có bất kỳ thông tin người dùng nào được lưu trữ trên máy chủ, vì vậy bạn không thể lưu trữ cấp độ người dùng của họ với nó.
Jan Doggen

@JanDoggen Tôi có cấp độ người dùng trên máy chủ (máy khách chuyển mã định danh đến máy chủ).
Benjamin Gruenbaum

Cứu giúp? Tôi không nhận được tài liệu tham khảo 1337?
Marjan Venema

Câu trả lời:


18

Tôi muốn nói rằng nó phụ thuộc vào khán giả của bạn.

Không-dev

Nếu đối tượng của bạn không phải là nhà phát triển, tôi sẽ thực hiện theo cách sau:

Giả sử bạn trả lại JSON vì lợi ích của ví dụ.

GET /cats HTTP/1.1

{
    "cats": [
        "Can I haz cheeseburger",
        "If it fits, I sits",
        "It's caturday!"
    ],
    "permissions": {
        "level": "free",
        "information": "You have access to 3 cats. Upgrade to ... to get 10 cats!"
    }
}

Hoặc một cái gì đó tương tự.

Người dùng có thể biết tình trạng tài khoản của mình là gì và cho phép bạn đặt bất kỳ thông tin nào bạn muốn, chẳng hạn như thông điệp tiếp thị. Điểm quan trọng nhất của cách này là cung cấp khả năng hiển thị dễ dàng cho người dùng tài khoản hiện tại của bạn.

Nhà phát triển

Tuy nhiên, nếu đối tượng của bạn hoàn toàn là nhà phát triển, thì tôi sẽ nói: hãy sử dụng cách tuân thủ HTTP đầy đủ. Để lưu trữ siêu dữ liệu, bạn sử dụng các tiêu đề HTTP.

Đây là một ví dụ:

GET /cats HTTP/1.1

X-Account: anonymous
X-Account-Possible-Upgrades: 2
X-Account-Limit: 3

Sau đó, cung cấp một tài liệu rõ ràng về ý nghĩa của các tiêu đề này. Hầu hết các nhà phát triển sẽ đi thẳng vào tài liệu khi họ sẽ thấy các tiêu đề tùy chỉnh này, đặc biệt nếu họ thấy giới hạn. Bạn có thể đi xa hơn và hiển thị các liên kết trong các tiêu đề. Hoặc bạn có thể hiển thị một liên kết đến trang giá.

X-Account-Doc: http://your/doc

Nhưng một lần nữa, nhiều nhà phát triển không biết HTTP hoạt động như thế nào.

Vậy đó là cuộc gọi của bạn

Một cái đúng hơn, cái kia dễ tiếp cận hơn.

Linh tinh

Một số thứ linh tinh khác liên quan đến câu hỏi của bạn:


1
Vâng, điều này có ý nghĩa tuyệt đối, mặc dù như một lưu ý phụ tôi thấy một số thông tin xác thực (ent / orize) có trong các tiêu đề HTTP là một cách tiếp cận phù hợp vì nó là siêu dữ liệu hiệu quả.
Jimmy Hoffa

@JimmyHoffa Đây thực sự là siêu dữ liệu và suy nghĩ đầu tiên của tôi là sử dụng các tiêu đề HTTP. Tuy nhiên, trong trường hợp này, các tiêu đề HTTP không cung cấp đủ khả năng hiển thị cho khách hàng và mức độ chi tiết cần thiết cho các thông điệp tiếp thị. (Đã chỉnh sửa câu trả lời để thêm chi tiết này.)
Florian Margaine

@JimmyHoffa thế nào? Một 402 sẽ không làm trong trường hợp này. Bạn có đề nghị gì?
Benjamin Gruenbaum

@BenjaminGruenbaum Tôi không nói mã phản hồi, tôi nói tiêu đề; bạn có thể thêm tất cả các tiêu đề tùy chỉnh mà bạn muốn cho siêu dữ liệu, sẽ là khôn ngoan nếu tất cả các phản hồi từ một api yên tĩnh chỉ có vai trò người dùng trong tiêu đề là UserRole = level1hoặc bất cứ điều gì bạn muốn gọi nó chỉ để đảm bảo người tiêu dùng luôn biết cách trình bày bất kỳ dữ liệu nào họ nhận được và nó nhất quán trên tất cả các phản hồi trong đó các mô hình dữ liệu quay lại sẽ khác nhau từ yêu cầu này sang yêu cầu khác, người tiêu dùng luôn có thể kiểm tra vai trò của họ theo cùng một cách.
Jimmy Hoffa

1
@BenjaminGruenbaum Tôi đã viết lại hoàn toàn câu trả lời.
Florian Margaine

4

Làm thế nào để khách hàng biết nếu họ có thể nâng cấp thứ hạng của họ?

Điều đó phụ thuộc vào khách hàng. Thông thường, bạn có thể đặt thông tin đó dưới dạng thông điệp hyptertext (hay còn gọi là HTML) vào phần phản hồi của phương thức REST. Tuy nhiên, điều đó chỉ có ý nghĩa nếu API REST được sử dụng với máy khách HTML.

Tương tự cho XML và JSON.


Chỉnh sửa: Bạn có thể nhầm lẫn khi sử dụng API (mở rộng từ viết tắt này) với việc tiếp thị các loại tài khoản / kế hoạch người dùng của bạn. Tôi sẽ không trộn lẫn điều này, vì nó luôn trở nên tẻ nhạt (các quyết định kinh doanh có thể yêu cầu thay đổi nhanh hơn so với các thay đổi trong phần mềm để truyền đạt các phản ứng khác nhau do những thay đổi này có thể có được trên đĩa kịp thời).

Thay vào đó hãy nói với người dùng của bạn thông qua một kênh khác, ví dụ như với bản tin về lợi ích của họ.

Điều này đặc biệt hiệu quả khi người đăng ký dịch vụ không phải là người lập trình chống lại API. Ví dụ:

George (một anh chàng đồng tính tự hào ở tuổi 36 yêu mèo con) mua quyền truy cập vào cute-cats-4-me.com và nói với người phối ngẫu 16 tuổi của mình (người rất giỏi với hệ thống máy tính kịch bản bao gồm linux) để tạo ra một ứng dụng bảng hiệu kỹ thuật số hiển thị mèo con cutie nhỏ xinh trên tường trong căn hộ.

Vì vậy, anh chàng đang vui vẻ lập trình điều này thực sự không phải là người nhận thông tin thẳng thắn nhất.

Ngoài ra, để đáp ứng với đăng nhập và phương thức thông tin người dùng, hãy cung cấp tất cả các thông tin chi tiết.

Nhưng khi người dùng yêu cầu mèo lập trình, cô ấy nên biết lý do tại sao cô ấy chỉ nhận được ba con mèo trở lên. Nhưng bạn không giải quyết vấn đề giao tiếp này bằng mã.

Mặt khác, cho phép họ truy vấn nhiều hơn và sau đó gửi lại thông báo lỗi nếu quyền của họ không đủ. Nhưng một lần nữa, đó không phải là một phần mềm thân thiện với người dùng.


1
@Racheet: Bạn có gặp vấn đề gì khi các cô gái có tiền trong nhà và nói với các chàng trai phải làm gì không?
hakre

1
Tôi có một vấn đề với một ví dụ khẳng định rằng các cô gái cần bạn trai để lập trình cho họ.
Racheet
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.