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

Posted

技术标签:

【中文标题】REST API 资源是不是应该根据查询参数进行授权?【英文标题】:Should a REST API resource do authorization based on query parameters?REST API 资源是否应该根据查询参数进行授权? 【发布时间】:2021-09-11 23:40:49 【问题描述】:

对于列出资源的 RESTful API,我有一个方法如下:

GET - /cars

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

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

但是,由于我正在使用的系统的技术限制,此查询参数只能提供给具有一定权限的用户,具体取决于他们的角色。

如果有这样的 API 资源基于请求有效负载(而不仅仅是资源)进行授权,那么它是 RESTful 吗?

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

【问题讨论】:

关于 REST 的原始论文和 RFC 7231 都没有说明必须如何进行授权。回答标题中的问题:绝对可以。实际上,filter 也是一个名词 ;) 【参考方案1】:

如果有这样的 API 资源基于请求有效负载(而不仅仅是资源)进行授权,那么它是 RESTful 吗?

短版:是的,当然。

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

加长版:

GET /cars?make=Toyota

对于这个请求,request-target,我们从中计算 effective request uri,包括查询部分。换句话说,/cars/cars?make=Toyota 标识不同的资源。

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

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


另一种选择似乎是支持 make 查询参数的单独资源 GET - /cars/filter。

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

我不知道如何命名这个资源,因为 filter 是动词,而不是名词。

不用担心 - REST 不关心您为资源标识符使用的拼写约定。

https://www.merriam-webster.com/dictionary/post

如果您尝试单击该链接,您会发现它的工作方式与您预期的完全一样,即使拼写包含动词。

【讨论】:

以上是关于REST API 资源是不是应该根据查询参数进行授权?的主要内容,如果未能解决你的问题,请参考以下文章

多个字段解析器使用不同的查询参数解析相同的 REST API

通过 HTTPS 发送时,rest api 查询参数是不是安全?

REST API 基于ACCESS TOKEN

在 Rest API 中批量更新

django rest framework接口怎么传参进行数据查询?

您将如何使用 Spring Boot 处理仅具有可选查询参数的 REST API?