如何在HTTP 302响应中删除授权头

10

我正在使用Java / Jersy框架(Tomcat)开发REST API。其中一个web服务的功能是将请求重定向(HTTP 302)到S3签名URL以获取文件。我们使用“Authorization”标头来检查请求的有效性。当调用此Web服务时,服务会生成带有签名的URL并重定向到已签名的URL。

REST Web服务中的Java代码(uri是已签名的URL)

return Response.status(HttpStatus.SCMOVEDTEMPORARILY).location(uri).build();
当重定向发生时,Authorization头也会随着签名一起传递。由于Amazon接受签名URL中的Authorization或Signature,但不接受两者同时存在,因此Amazon S3会抛出以下错误..

只允许一个认证机制; 仅应指定X-Amz-Algorithm查询参数、Signature查询字符串参数或Authorization头部

是否有办法在重定向时删除此头部发送...

我尝试添加一个过滤器,并使用自定义的HttpServletResponseWrapper实现覆盖ServletResponse,并在addHeader和setHeader方法中记录头部名称。然而Authorization头部从未调用该方法。

修改后的代码将头部设置为空也无法工作..

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

你找到解决方案了吗?我也遇到了同样的问题 :( - marcus3006
1个回答

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

1
谢谢,听起来很合理。对我来说,“问题”只存在于wget/curl/postman客户端中,而不是在普通的Web浏览器中。 - marcus3006
列表中的每个选项都可以通过参数启用/禁用身份验证标头的重新发送。但无论如何,没有一种通用的解决方案... - Babl
6
哇,我遇到了与NodeJS客户端完全相同的问题,使用相同的API设计并且我们也正在使用预签名URL。然而,看起来Chrome(至少在MacOS上)确实会重新发送Authorization头信息。 - j3141592653589793238
但是大多数HTTP客户端只会在重定向位置位于相同的域/来源时重新发送“Authorization”标头。根据我看到的情况 - 我正在使用Flutter和Chrome,它们似乎都想要重新发送“Authorization”标头,即使S3 URL显然与我的服务不同域。 - cbreezier
我今天花了一些时间来调试这个问题 - 我们做同样的事情。我们在API中有一个oauth验证路由,它会重定向到一个已签名的s3 URL。但是在Chrome中,这不起作用,因为它会重新发送原始请求头。我没有在Chrome中找到解决方法。我们只是修改了API以从s3 URL获取内容并将其返回给原始请求,而不是进行重定向。 - Chris Edgington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接