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,您会发现它完全按照您的预期工作,即使拼写中包含动词。
对于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,您会发现它完全按照您的预期工作,即使拼写中包含动词。