REST API 资源是否应该根据查询参数进行授权?

Should a REST API resource do authorization based on query parameters?

对于RESTfulAPI列出资源,我有如下方法:

GET - /cars

它 returns 一个汽车列表,可能还有一个分页标记。

我想提供一个查询参数来过滤这些结果,例如make。例如:GET - /cars?make=Toyota.

但是,由于我使用的系统的技术限制,此查询参数只能根据其角色提供给具有特定权限的用户。

是否RESTful 拥有这样的 API 资源,其授权基于请求负载,而不仅仅是资源?

替代方案似乎是支持 make 查询参数的单独资源 GET - /cars/filter。但是,我不确定如何命名此资源,因为 filter 是动词,而不是名词。

Would it be RESTful to have an API resource such as this that bases its authorization on the request payload, and not just the resource?

简短版:是的,当然。

当服务器响应(例如)403 Forbidden 时,服务器拒绝授权 请求。这可能是因为请求不包含与资源匹配的授权元数据,或者可能是出于其他原因。

更长的版本:

GET /cars?make=Toyota

对于此请求,request-target, from which we compute the effective request uri包含查询部分。换句话说,/cars/cars?make=Toyota 标识 不同的 资源。

当然,在我们的资源模型中,Bob 有权访问 /cars 而不是 /cars?make=Toyota(反之亦然)。

在您首选的框架中 实施 这些控件可能会也可能不会直接,但就 API 设计而言,这很好。


An alternative seems to be a separate resource GET - /cars/filter that supports the make query parameter.

这也是一个令人满意的选择。

I'm not sure how to name this resource, since filter is a verb, not a noun.

不用担心 - REST 不关心您对资源标识符使用什么拼写约定。

如果您尝试单击那个 link,您会发现它完全按照您的预期工作,即使拼写中包含动词。