如何删除 http 302 响应中的授权标头

Ela*_*ngo 8 java http jersey

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

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

return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).build();
Run Code Online (Sandbox Code Playgroud)

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

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

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

我尝试添加一个过滤器,它使用自定义 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();
Run Code Online (Sandbox Code Playgroud)

Bab*_*abl 9

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

  • 哇,我在 NodeJS 客户端上面临着完全相同的问题,相同的 API 设计,而且我们也使用预签名的 url。然而,Chrome(至少在 MacOS 上)似乎_确实_重新发送了授权标头。 (3认同)