RESTful API中的用户权限级别


23

假设我有一家公司对互联网上最可爱的猫进行排名。

我提供的资源/cats/可为用户提供最新,最可爱的可爱猫咪。

如果他们根本没有付款或没有注册,用户可以只获得排名前三的猫。如果付款的话,排名前10的猫是337美元,如果登录的话,排名前100位的猫是1。

简而言之,的消费者/cats/会根据其“用户排名”获得不同数量的猫。我在消费端确实有一个用户标识符,但是在消费端没有明确表示用户级别。我想通知用户他们可以在提出请求时升级其订阅。也就是说,我需要区分3只猫,因为我只提供3只猫3只猫,因为这是用户级别所允许的

区分由于消费者没有足够的特权而限制资源和因为消费者具有足够的特权而对其进行区分的最佳实践是什么?

客户如何知道他们是否可以提高排名?也就是说,他们只有有限的资源,因为他们没有权限。最佳做法是什么?

注意,这是实际情况的粗略简化。另外,为了澄清-感谢阅读。


更新:

我们考虑了以下选项:

  • 仅在客户端上存储一次用户权限对象,仅在执行帐户登录或升级时对其进行查询。
  • null在JSON中传递值表示存在,但实际上什么也没有转移。因此,对于有3只猫的用户来说,这可能是10只猫["Garfield","Sylvester","Puss in Boots",null*7]
  • 传递资源许可对 {cats:["Whiskers","Fluffy","Socks"],authCount:3}

我想在第一时间做到这一点,以可能的最佳方式运送最可爱的猫,我们也希望


4
现在我想看可爱猫咪的照片
凯莉·肯德尔

我不明白 如果您不在任何地方存储“用户级别”,则无法区分。听起来您在服务器上也没有存储任何用户信息,因此您无法使用它存储他们的用户级别。
Jan Doggen

@JanDoggen我确实在服务器上具有用户级别(客户端将标识符传递给服务器)。
本杰明·格伦鲍姆

救命?我没有1337参考?
Marjan Venema

Answers:


18

我会说这取决于您的听众。

无开发

如果您的受众不是开发人员,那么我将采用以下方式:

假设为了示例,您返回了JSON。

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!"
    }
}

或类似的东西。

用户可以知道自己的帐户状态,这对您是很有帮助的,它还允许您放置所需的任何信息,例如市场营销消息。这种方式最重要的一点是,可以让您的用户轻松了解其当前帐户。

开发人员

但是,如果您的受众纯粹是开发人员,那么我会说:采用完全符合HTTP的方式。要存储元数据,请使用HTTP标头。

这是一个例子:

GET /cats HTTP/1.1

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

然后,提供这些标头含义的清晰文档。当大多数开发人员看到这些自定义标头时,他们会直接阅读文档,尤其是在看到限制的情况下。您可以走得更远,并在标题中显示链接。或者,您可以显示指向定价页面的链接。

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

但是话又说回来,许多开发人员都不知道HTTP是如何工作的。

那是你的电话

一个更正确,另一个更易访问。

杂项

其他一些与您的问题有关的杂项:


1
是的,这绝对有道理,尽管作为旁注,我发现HTTP标头中包含的某些auth(ent / orize)信息是一种适当的方法,因为它实际上是元数据。
吉米·霍法

@JimmyHoffa确实是元数据,我的第一个念头是使用HTTP标头。但是,在这种情况下,HTTP标头无法为客户提供足够的可见性以及营销消息所需的粒度。(已编辑答案以添加此详细信息。)
Florian Margaine

@JimmyHoffa怎么样?在这种情况下,402不会执行此操作。你有什么建议?
本杰明·格伦鲍姆

@BenjaminGruenbaum我没有说响应码,我说的是标题。您可以添加元数据所需的所有自定义标头,明智的做法是让所有来自宁静的api的响应仅在标头中具有用户角色UserRole = level1或您希望对其进行调用,以确保消费者始终了解如何呈现他们接收到的任何数据,并且在所有响应中保持一致,其中返回的数据模型将因一个请求而异于另一个请求,因此消费者始终可以以相同的方式检查其角色。
吉米霍法2013年

1
@BenjaminGruenbaum我已经完全重写了答案。
Florian Margaine

4

客户如何知道他们是否可以提高排名?

这取决于客户。通常,您可以将此类信息以超文本消息(也称为HTML)的形式放入REST方法的响应主体中。但是,只有将REST API与HTML客户端一起使用时,这才有意义。

与XML和JSON类似。


编辑:您可能会混淆使用API​​(扩展此首字母缩写词)与帐户类型/用户计划的营销。我不会混淆这一点,因为它总是很麻烦(与这些软件更改相比,业务决策可能需要比软件更改更快的更改,以传达不同的响应,因为这些更改能够及时出现在盘子上)。

而是通过不同的渠道告诉您的用户,例如与新闻通讯,他们的好处是什么。

当注册该服务的人不是针对API进行编程的人时,这种方法特别有效。例如:

乔治(在36岁的小猫中是一个引以为傲的同性恋者)购买了cute-cats-4-me.com的访问权限,并告诉他的16岁配偶(他对脚本系统(包括Linux)非常满意)创建了一个数字标牌应用程序在公寓的墙上显示漂亮的小可爱小猫。

因此,对此编程很有趣的人实际上并不是信息中最直接的收件人。

另外,为响应登录和用户信息方法,请提供所有详细信息。

但是,当用户以编程方式请求养猫时,她应该已经知道为什么只退回三只或更多只猫。但是您不能用代码解决此通信问题。

否则,如果他们的权限不足,请允许他们查询更多,然后退回故障通知。但是,那不是一个用户友好的软件。


1
@Racheet:当女孩们把房子里的钱都告诉男孩们该怎么办时,你有问题吗?
hakre

1
我有一个例子有问题,该例子断言女孩需要男友来为他们编程。
拉切特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.