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

tim*_*ham 4 security rest authorization restful-authentication restful-architecture

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

有了这样的访问令牌,客户端应用程序就可以访问不同的资源。假设一个用户有很多车,有很多船,等等......所以,以RESTful方式,/users返回所有用户,/users/:u1返回用户u1的数据,返回用户/users/:u1/cars/:c1汽车的数据,返回用户船的数据等。c1u1/users/:u1/boats/:b1b1u1

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

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

正确的做法是什么?

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

Mvd*_*vdD 6

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

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

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

所以,我想说的是

GET /users/:u1/cars/
Run Code Online (Sandbox Code Playgroud)

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

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