为REST应用程序设计当前已登录用户的URI

120

我需要在我的REST API中添加一个URI,以便检索当前登录的用户。通常我会在带有ID的资源上使用GET,但客户端不知道用户的ID。

我找到了以下解决方案:

  • 按用户名称

    此解决方案使用用户名称而不是用户ID。

    示例:

  • 拥有自己的资源

    此解决方案有一个用于用户的资源和一个额外的用于已登录用户的资源。

    示例:

  • 使用符号链接

    此解决方案具有用户ID的符号链接。

    示例:

  • 使用过滤器

    此解决方案使用用户名称的过滤器。

    示例:

哪一个最符合RESTful?它们各自的优缺点是什么?
3个回答

80

由你决定。 从REST的角度来看,所有方法都是完全合适的。

根据Roy Thomas Fielding的论文*任何可以命名的信息都可以成为资源

5.2.1.1 资源和资源标识符

在REST中,信息的关键抽象是一个资源。任何可以命名的信息都可以成为资源:文档或图片、临时服务(例如“洛杉矶今天的天气”)、其他资源的集合、非虚拟对象(例如人),等等。换句话说,任何可能是作者超文本引用目标的概念都必须符合资源的定义。资源是对实体集合的概念映射,而不是在任何特定时间点上与映射相对应的实体。[...]

当使用/me/users/me/users/myself/users/current及其类似的路径时,您已经有了一个认证用户的定位器,并且它将始终标识出一个认证用户概念,而不管哪个用户被认证。

为了更灵活,您还可以支持/users/{username}

顺便说一句,在Is using magic (me/self) resource identifiers going against REST principles?中也讨论了类似的情况。


* 如果您对REST感兴趣,则必须阅读Fielding论文的第5章


当HTTP Get是协议接收数据时,是否在Restful中使用current好?还有一些ISP缓存等等?缓存会影响Get URL吗?是否安全?或者我们应该始终发送用户ID? - Hassan Faghihi
请注意,同时发送用户名和身份验证头可能会受到欺骗攻击的影响,如果开发人员没有仔细检查任何不匹配的情况。 - Puce
1
如果我有一个与当前用户相关的资源,我应该始终在前面加上/users/me,比如/users/me/resources/:id吗? - bertonc96

5

我认为REST URIs应该唯一标识资源,无论是使用userId/email/ssn或username,哪个属性在您的系统中唯一标识用户。

因此,资源可以是users(复数/users),为了使其成为单数,我们有以下选项:

如果客户端有userId,资源应该类似于:

GET - /users/{user-id}

如果客户端没有userId,但有username,那么:
GET - /users/{username}

只要URI可以唯一标识用户,我们就可以使用上述URI模式作为REST资源。

如果客户端没有“userId”,“username”或“email”或系统中唯一标识用户的任何其他属性,则我们可以将资源URI设为以下内容:

GET- /users/current

或者

GET- /users/me

但是,在这种情况下,客户端需要具有用户特定的TOKEN或启用会话,以便服务器可以通过活动会话或标头中传递的令牌找到用户。 请注意,我们应该将其视为最后的选择。


-9

所有的都是同样RESTful的。REST不是关于URI,而是关于以RESTful方式使用它们。

REST是关于客户端导航应用程序状态的。其中一部分状态可能是当前用户是谁。所有URL都可以用来获取应用程序状态的这一部分。


4
REST的核心在于URI以及对象与它们之间的关联。 - Santiago Martí Olbrich
2
REST本身并不像Fielding的论文中所说的那样,对URL结构做出任何规定。 - Dave Hillier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接