REST API 访问控制从访问令牌与路径参数中提取主题
REST API access control extract subject from access token vs. from path parameter
在 OAUTH 中保护 REST API 的一般想法是使用授权承载 <access token
> header,通常是 JWT,它具有有关主题的信息,即。 sub: u1
其中u1是数据库中的userId。
有了这样的访问令牌,客户端应用程序可以访问不同的资源。假设一个用户有很多车,有很多船等等......所以,以 RESTful 的方式,/users
returns 所有用户,/users/:u1
return用户u1的s数据,/users/:u1/cars/:c1
returns用户u1
的车数据c1
,/users/:u1/boats/:b1
returns船的数据b1
用户 u1
,等等
我的问题是关于 u1
。 u1
不应该从 JWT 访问令牌中提取出来,因为我们知道我们可以信任 JWT?理论上,应用程序可以使用为用户 u1
颁发的 JWT,但请求访问 /users/:u2
应该被禁止。
可以使 /users/:u1
不可用,并强制客户端应用调用 /users
并从 JWT 中提取 sub
。但是,将 /users
调用到 u1
的 return 数据会破坏 RESTful 模式及其优势(即 http 缓存)。
什么是正确的方法?
这可能是一个关于 REST api 问题的 authorization
框架。 JWT 只能处理 authentication
而已。
IMO 你的 REST API 应该独立于你的授权框架。
虽然在您的情况下用户 u1
无法访问用户 u2
的汽车或船只是有道理的,但这可能不适用于所有用户。
您可以很容易地想象管理员用户或某些其他角色确实有权访问任何(或特定的一部分)用户的汽车和船只。
所以,我会说
GET /users/:u1/cars/
如果用户有权检索用户 u1
的汽车, 应该响应 HTTP 200 OK
和 return 用户 u1
的所有汽车。否则它应该响应 HTTP 403 Forbidden
.
因此,换句话说,使用来自 JWT 令牌的信息来授权操作。不要更改您的 API 设计以从中隐式推断用户上下文。
在 OAUTH 中保护 REST API 的一般想法是使用授权承载 <access token
> header,通常是 JWT,它具有有关主题的信息,即。 sub: u1
其中u1是数据库中的userId。
有了这样的访问令牌,客户端应用程序可以访问不同的资源。假设一个用户有很多车,有很多船等等......所以,以 RESTful 的方式,/users
returns 所有用户,/users/:u1
return用户u1的s数据,/users/:u1/cars/:c1
returns用户u1
的车数据c1
,/users/:u1/boats/:b1
returns船的数据b1
用户 u1
,等等
我的问题是关于 u1
。 u1
不应该从 JWT 访问令牌中提取出来,因为我们知道我们可以信任 JWT?理论上,应用程序可以使用为用户 u1
颁发的 JWT,但请求访问 /users/:u2
应该被禁止。
可以使 /users/:u1
不可用,并强制客户端应用调用 /users
并从 JWT 中提取 sub
。但是,将 /users
调用到 u1
的 return 数据会破坏 RESTful 模式及其优势(即 http 缓存)。
什么是正确的方法?
这可能是一个关于 REST api 问题的 authorization
框架。 JWT 只能处理 authentication
而已。
IMO 你的 REST API 应该独立于你的授权框架。
虽然在您的情况下用户 u1
无法访问用户 u2
的汽车或船只是有道理的,但这可能不适用于所有用户。
您可以很容易地想象管理员用户或某些其他角色确实有权访问任何(或特定的一部分)用户的汽车和船只。
所以,我会说
GET /users/:u1/cars/
如果用户有权检索用户 u1
的汽车, 应该响应 HTTP 200 OK
和 return 用户 u1
的所有汽车。否则它应该响应 HTTP 403 Forbidden
.
因此,换句话说,使用来自 JWT 令牌的信息来授权操作。不要更改您的 API 设计以从中隐式推断用户上下文。