REST API 访问控制从访问令牌中提取主题与从路径参数中提取主题

Posted

技术标签:

【中文标题】REST API 访问控制从访问令牌中提取主题与从路径参数中提取主题【英文标题】:REST API access control extract subject from access token vs. from path parameter 【发布时间】:2018-08-11 04:19:22 【问题描述】:

在 OAUTH 中保护 REST API 的一般思路是使用 Authorization Bearer access token> 标头,通常是 JWT,其中包含有关主题的信息,即。 sub: u1 与 u1 是数据库中的 userId。

使用此类访问令牌,客户端应用程序可以访问不同的资源。假设一个用户有很多汽车,有很多船等等......所以,在 RESTful 方式中,/users 返回所有用户,/users/:u1 返回用户 u1 的数据,/users/:u1/cars/:c1 返回汽车的数据c1用户u1/users/:u1/boats/:b1返回用户u1的船b1的数据等

我的问题是关于u1。不应该从 JWT 访问令牌中提取 u1,因为我们知道我们可以信任 JWT?理论上,应用程序可以使用为用户u1 发布的 JWT,但请求访问 /users/:u2 应该被禁止。

可以使/users/:u1 不可用,并强制客户端应用调用/users 并从JWT 中提取sub。但是,调用/users 来返回u1 的数据会破坏RESTful 模式及其好处(即http 缓存)。

什么是正确的方法?

这可能是关于 REST api 问题的authorization 框架。 JWT 只能寻址authentication

【问题讨论】:

我相信很多服务器框架都有 REST 端点的保护属性。例如,Microsoft Web API 将利用 JWT 中的“角色”声明,该声明将显示在 [Authorize] 属性的 Roles 属性中。因此,您可以将特定操作锁定到某个角色。您还可以根据 JWT 中的特定声明和/或声明值创建策略,并将其应用于 [Authorize] 属性。 它并没有解决关于令牌中的主题(无论是策略、角色等)与请求参数中的主题之间的资源所有者的真正“真相来源” 【参考方案1】:

IMO 您的 REST API 应该独立您的授权框架。

虽然在您的情况下用户 u1 无法访问用户 u2 的汽车或船只是有道理的,但这可能不适用于所有用户。

您可以轻松想象管理员用户或其他角色可以访问任何(或特定子集)用户的汽车和船只。

所以,我会这么说

GET /users/:u1/cars/

如果用户有权检索用户 u1 的汽车,则应以 HTTP 200 OK 响应并返回用户 u1 的所有汽车。否则它应该回复HTTP 403 Forbidden

因此,换句话说,使用来自 JWT 令牌的信息来授权操作。不要更改您的 API 设计以从中隐式推断用户上下文。

【讨论】:

以上是关于REST API 访问控制从访问令牌中提取主题与从路径参数中提取主题的主要内容,如果未能解决你的问题,请参考以下文章

Power BI 活动日志 REST API 获取访问令牌

如何使用 REST API 从服务帐户凭据创建访问令牌?

如何在 Django 的单个 API 中获取访问令牌和刷新令牌(rest_framework_jwt)

PHP Slim Framework REST API - 在每条路由之前验证访问令牌?

Yammer REST API:如何获取外部网络的访问令牌?

使用访问令牌时,salesforce rest api 无效会话 id 错误