在 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 资源。
如果客户端没有 userId
、username
或 email
或任何其他在您的系统中唯一标识用户的属性,那么,我们可以拥有类似的资源 uri,
GET- /users/current
或
GET- /users/me
但是,在这种情况下,客户端需要启用特定于用户的 TOKEN 或会话,以便服务器可以从活动会话或标头中传递的令牌中找到用户。 请注意,我们应该考虑这是最后一个选项。
【讨论】:
【参考方案3】:所有的都是同样的 RESTful。 REST 不是关于 URI,而是关于使用 RESTful。
REST 是关于客户端导航应用程序状态的。该状态的一部分可能是当前用户是谁。所有的 URL 都可以用来获取这部分应用状态。
【讨论】:
REST 都是关于 URI 以及对象如何与它们相关的 REST 本身,就像在菲尔丁的论文中一样,没有说明 URL 结构以上是关于在 REST 应用程序中为当前登录用户设计 URI的主要内容,如果未能解决你的问题,请参考以下文章
在 django Rest Framework 中获取当前登录用户