chi*_*ayo 18 amazon-s3 angularjs
我正在尝试向amazonS3预先签名的URL发送PUT请求.即使我只有一个PUT请求,我的请求似乎也会被调用两次.第一个请求返回200 OK,第二个请求返回400 Bad Request.
这是我的代码:
var req = {
method: 'PUT',
url: presignedUrl,
headers: {
'Content-Type': 'text/csv'
},
data: <some file in base64 format>
};
$http(req).success(function(result) {
console.log('SUCCESS!');
}).error(function(error) {
console.log('FAILED!', error);
});
Run Code Online (Sandbox Code Playgroud)
在400 Bad Request更详细的错误:
<?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 someToken</ArgumentValue>
<RequestId>someRequestId</RequestId>
<HostId>someHostId</HostId>
</Error>
Run Code Online (Sandbox Code Playgroud)
我不明白的是,为什么它会回归400?什么是解决方法?
mlo*_*ler 24
您的客户端可能正在发送使用Authorization标头的初始请求,该标头正在使用302进行响应.响应包括具有Signature参数的Location标头.问题是初始请求中的标头被复制到后续重定向请求中,因此它包含授权和签名.如果您从后续请求中删除授权,那么您应该是好的.
这发生在我身上,但是在Java/HttpClient环境中.我可以在Java中提供解决方案的详细信息,但遗憾的是不适用于AngularJS.
我知道这可能来不及回答,但就像 @mlohbihler 所说,对我来说这个错误的原因是我在 Angular 中设置的 http 拦截器发送的授权标头。本质上,我没有正确过滤掉AWS S3域,以避免它自动获取JWT授权标头。
对于 Google 员工,如果您通过 Cloudfront 发送已签名(签名 v4)S3 请求并且在您的 Cloudfront Origin 设置中将“限制存储桶访问”设置为“是”,则 Cloudfront 会将授权标头添加到您的请求中,您将得到这个错误。但是,由于您已经签署了您的请求,您应该能够关闭此设置,而不会牺牲任何安全性。
| 归档时间: |
|
| 查看次数: |
8228 次 |
| 最近记录: |