如何在 HTTP DELETE 请求中传递身份验证详细信息?
Posted
技术标签:
【中文标题】如何在 HTTP DELETE 请求中传递身份验证详细信息?【英文标题】:How to pass authentication details in a HTTP DELETE request? 【发布时间】:2016-12-02 22:46:55 【问题描述】:我正在尝试按照 HTTP 方法语义创建一个 REST API,但我被 DELETE 方法卡住了。
在我的用例中,该服务位于对用户进行身份验证的网关后面。此服务使用 SSO 令牌,然后用于对用户进行身份验证并获取他的详细信息。从这一点开始,我正在尝试调用我的服务,在该服务中我使用要删除的资源的 id 作为路径变量,但是我不知道如何传递用户的 id 进行验证。
我已经阅读了很多关于将主体添加到 DELETE 方法的问题的帖子。我还认为添加自定义标题来识别用户不是正确的方法。在我拥有的选项中,我认为只有 2 个是明智的:
-
以用户 ID 作为正文发出 POST 请求。我不喜欢这个,因为我基本上将 POST 与已识别的资源一起使用,而且我在语义上听起来是错误的。
发出请求,使用户 ID 成为路径变量。它看起来像这样。路径/到/服务/resourceId/resourceId/userId/userId。我的问题是在 POST 和 PUT 请求中,userId 是正文的一部分。 API 看起来不一致,但我想我仍然可以更改其他 2 个,因此用户 ID 也是 url 的一部分。
有什么建议吗?
【问题讨论】:
【参考方案1】:您应该使用 HTTP 标头参数来传递用户令牌。
@DELETE
@Path("/id")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Info deleteInfo(
@HeaderParam("Authorization") String token,
@PathParam("id") Long id)
【讨论】:
当用户已经获得授权时这仍然适用吗?就我而言,我需要 userId 的原因是验证资源是否真正属于他,因为最终应用程序也是存储数据的应用程序。所以我认为在这种情况下它不会是授权,只是验证资源 1 属于用户 1 而不是用户 2。这是否是传递客户端详细信息以验证每个应用程序和方法的方法?在他发出 GET 请求以从应用程序获取所有资源的情况下,像他的 id 这样的客户端信息是否不是有效的路径变量? (如 path/to/app/user/userId ) 身份验证 = 登录名 + 密码(你是谁) 授权 = 权限(你可以做什么) - ***.com/questions/6556522/…。在我的应用程序中,我使用包含用户名和密码的 JSON 正文的 POST 登录,它返回稍后在标头参数中使用的令牌。 你是对的,这是用户的授权。在这种情况下,我会坚持这一点。谢谢【参考方案2】:HTTP 身份验证,也许吧?这就是它的目的,不是吗?请参阅 RFC 7235。
【讨论】:
身份验证在网关级别完成,通信是从网关所在的 DMZ 到我需要 userId 的内部应用程序完成的。老实说,我不是很熟悉内部公司网络中的安全约束,但我想在调用的每个微服务中进行身份验证不会非常高效以上是关于如何在 HTTP DELETE 请求中传递身份验证详细信息?的主要内容,如果未能解决你的问题,请参考以下文章
它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?