【发布时间】:2020-11-28 06:23:15
【问题描述】:
在 Chrome、IE 和 Firefox 中跟踪 303 响应的重定向时,会包含 Authorization 标头。
当对内部服务的请求在 Location 标头中使用签名的 S3 URL 进行响应时,就会出现问题。
S3 将响应 400 响应,并且无法确定要使用哪种身份验证方法。
请求内部服务
GET INTERNAL_SERVICE HTTP/1.1
Pragma: no-cache
Origin: https://example.com
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,en-US;q=0.8,da;q=0.7,de;q=0.6
Authorization: Bearer g6YQjOy3BDu32es8xKdMRNpcQ2Fkrh5NG7y5fDs5
Accept: application/json, text/plain, */*
Cache-Control: no-cache
Authority: example.com
Host: example.com
Connection: close
回应
HTTP/1.1 303 See Other
Date: Tue, 13 Mar 2018 08:55:12 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Connection: close
Server: nginx
location: S3_SIGNED_URL
Cache-Control: no-cache, private
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Headers: Content-Type, Accept, Authorization, X-
Requested-With
Access-Control-Max-Age: 28800
对 S3 的请求
GET S3_SIGNED_URL HTTP/1.1
Pragma: no-cache
Origin: https://example.com
Accept-Encoding: gzip, deflate, br
Accept-Language: en-GB,en;q=0.9,en-US;q=0.8,da;q=0.7,de;q=0.6
Authorization: Bearer g6YQjOy3BDu32es8xKdMRNpcQ2Fkrh5NG7y5fDs5
Accept: application/json, text/plain, */*
Cache-Control: no-cache
Authority: example.com
Host: BUCKET_NAME.s3.eu-central-1.amazonaws.com
Connection: close
回应
HTTP/1.1 400 Bad Request
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET
Access-Control-Max-Age: 3000
Vary: Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id: REQUEST_ID
x-amz-id-2: AMZ_ID
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Tue, 13 Mar 2018 09:06:41 GMT
Connection: close
Server: AmazonS3
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>Only one auth mechanism allowed; only the X-Amz-Algorithm
query parameter, Signature query string parameter or the Authorization
header should be specified</Message>
<ArgumentName>Authorization</ArgumentName>
<ArgumentValue>Bearer g6YQjOy3BDu32es8xKdMRNpcQ2Fkrh5NG7y5fDs5</ArgumentValue>
<RequestId>REQUEST_ID</RequestId>
<HostId>HOST_ID</HostId>
</Error>
有没有办法指示浏览器忽略Authorization标头,或者强制S3忽略标头?
【问题讨论】:
-
如果您使用不同的重定向代码,例如 302 或 307,会怎样?无论如何,浏览器发送一个
Authorization跨域标头似乎是完全错误的......存储桶上是否配置了CORS? -
我们已经尝试了 303 和 307 并且这是同一个问题。并且已经配置了CORS
-
如果启用了 CORS,这是我的下一个想法......即使我最初没有认为,如果你有
<AllowedHeader>Authorization</AllowedHeader>(或*) 在存储桶的 CORS 配置中,可能存在交互。 w3.org/TR/cors/#cors-api-specification-redirect -
@MortenHauberg 你曾经解决过这个问题吗?我们面临着完全相同的问题。
-
现在是 2021 年,我仍然找不到这个问题的答案。这是一种非常不安全的设计,将授权标头重定向到跨域资源,并且随着 S3 的使用越来越多,我不断遇到这个问题。
标签: javascript amazon-s3 browser