在 REST 应用程序中为当前登录用户设计 URI

Posted

技术标签:

【中文标题】在 REST 应用程序中为当前登录用户设计 URI【英文标题】:Designing URI for current logged in user in REST applications 【发布时间】:2016-07-30 22:38:25 【问题描述】:

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

我找到了以下解决方案:

按用户名

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

例子:

Bitbucket REST API:GET /user/userSlug

有自己的资源

此解决方案为用户提供一种资源,为登录用户提供另一种资源。

例子:

JIRA REST API:GET /myself

GitHub REST API:GET /user

Stack Exchange REST API:GET /me

带符号链接

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

例子:

Confluence REST API: GET /user/current

带过滤器

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

例子:

JIRA REST API: GET /user?username=username

哪一个是最 RESTful 的?有什么好处和坏处?

【问题讨论】:

【参考方案1】:

这取决于你。 从 REST 的角度来看,所有方法都非常好。

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

5.2.1.1 Resources and Resource Identifiers

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

当使用/me/users/me/users/myself/users/current 和类似名称时,您有一个定位器用于经过身份验证的用户,它将始终识别概念 em> 的已验证用户,无论哪个用户已通过验证。

为了更灵活,你也可以支持/users/username

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


* 如果你对 REST 感兴趣,菲尔丁的论文chapter 5 是必读的。

【讨论】:

当 HTTP Get 是接收数据的协议时,将 current 与 Restful 一起使用好吗?有一些 ISP 缓存等?缓存不会影响获取 URL 吗?安全吗?还是我们应该总是发送用户 ID? 请注意,如果开发人员没有仔细检查任何不匹配,同时发送用户名和身份验证标头很容易受到欺骗攻击。【参考方案2】:

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

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

如果客户端有userId,资源应该是这样的,

GET - /users/user-id

如果客户端没有userId,但有username,那么

GET - /users/username

所以,只要 uri 唯一标识用户,我们就可以将上述 uri 模式用作 REST 资源。

如果客户端没有 userIdusernameemail 或任何其他在您的系统中唯一标识用户的属性,那么,我们可以拥有类似的资源 uri,

GET- /users/current

GET- /users/me

但是,在这种情况下,客户端需要启用特定于用户的 TOKEN 或会话,以便服务器可以从活动会话或标头中传递的令牌中找到用户。 请注意,我们应该考虑这是最后一个选项。

【讨论】:

【参考方案3】:

所有的都是同样的 RESTful。 REST 不是关于 URI,而是关于使用 RESTful。

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

【讨论】:

REST 都是关于 URI 以及对象如何与它们相关的 REST 本身,就像在菲尔丁的论文中一样,没有说明 URL 结构

以上是关于在 REST 应用程序中为当前登录用户设计 URI的主要内容,如果未能解决你的问题,请参考以下文章

O365 Outlook REST API,伪装

如何在rest框架中为我的注册视图编写登录视图?

清理 REST 中的 URI

在 django Rest Framework 中获取当前登录用户

在 c# 中为使用 AzureAd 登录的当前用户获取 Jwt 令牌

如何使用 Wordpress Rest Api 获取当前登录用户?