【问题标题】:How to remove authorization header in a http 302 response如何在 http 302 响应中删除授权标头
【发布时间】:2016-05-25 20:46:57
【问题描述】:

我正在使用 Java / Jersy Framework(Tomcat) 进行 REST API 开发。一种此类 Web 服务的功能是将 (HTTP 302) 重定向到文件的 S3 签名 URL。我们使用“授权”标头来检查请求的有效性。调用此 Web 服务时,该服务会生成一个带有签名的签名 url 并重定向到签名的 Url。

来自 REST Web 服务的 Java 代码(uri 是签名的 url)

return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).build();

当重定向发生时,授权标头也与签名一起传递。由于亚马逊在签名 URL 中接受授权或签名,但不是两者都接受,因此它会从 Amazon S3 引发如下错误..

只允许一种身份验证机制;仅应指定 X-Amz-Algorithm 查询参数、Signature 查询字符串参数或 Authorization 标头

有没有办法在重定向发生时删除这个正在发送的标头...

我尝试添加一个过滤器,并使用自定义 HttpServletResponseWrapper 实现覆盖 ServletResponse,并在 addHeader 和 setHeader 方法中记录标题名称。它从不为 Authorization 标头调用此方法。

将标头设置为 nulll 或 "" 的修改代码都不起作用..

return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).header("Authorization",null).build();
return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).header("Authorization","").build();

【问题讨论】:

  • 您找到解决方案了吗?我也面临同样的问题:(

标签: java http jersey


【解决方案1】:

基本上,重定向响应没有任何“授权”标头,“授权”标头只是请求的一部分。因此,对于任何 HTTP 客户端来说,重新发送所有标头以重定向它们已发送到原始 URL 的位置是正常的行为。您在这里无能为力。 但大多数 HTTP 客户端只有在重定向位置位于同一域/源上时才会重新发送“授权”标头。在您的情况下,您可以尝试为 S3 URL 创建一个单独的域并重定向到它,并希望客户端 HTTP 客户端在检测到域已更改时会丢弃“授权”标头(这是重新发送“授权”的安全问题" 重定向到新域/源时的标头)。

【讨论】:

  • 谢谢,听起来很有道理。对我来说,“问题”只存在于 wget/curl/postman 客户端中,而 存在于普通的网络浏览器中。
  • 列表中的每一个都可以选择通过参数启用/禁用重新发送 Auth 标头.. 但无论如何,没有一个适合所有解决方案...
  • 哇,我在使用 NodeJS 客户端时遇到了完全相同的问题,同样的 API 设计,而且我们也在使用预签名的 url。但是,Chrome(至少在 MacOS 上)似乎确实重新发送了 Authorization 标头。
  • "但大多数 HTTP 客户端只有在重定向位置位于同一域/源上时才会重新发送“授权”标头。"不是我所看到的 - 我正在使用 Flutter 和 Chrome,即使 S3 url 显然是我的服务的不同域,他们似乎都想重新发送“授权”标头。
猜你喜欢
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
  • 2013-04-26
  • 2013-12-09
  • 2017-01-18
  • 2011-06-01
  • 2020-02-11
相关资源
最近更新 更多