如何在 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 请求中传递身份验证详细信息?的主要内容,如果未能解决你的问题,请参考以下文章

它是不是需要在任何具有基本身份验证的请求中传递用户名:密码组合?

如何在Angular2的DELETE请求中传递参数

如何在 Swift 中发出 HTTP 请求 + 基本身份验证

对 HTTP 请求进行身份验证和签名

WCF如何传递令牌进行身份验证?

如何在ember.js http请求中使用会话身份验证?