只允许一种身份验证机制; 只有X-Amz-Algorithm查询参数..?

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.

  • 这个非常有帮助.我在邮递员中遇到同样的问题.有没有办法解决它 (5认同)

ako*_*977 7

我知道这可能来不及回答,但就像 @mlohbihler 所说,对我来说这个错误的原因是我在 Angular 中设置的 http 拦截器发送的授权标头。本质上,我没有正确过滤掉AWS S3域,以避免它自动获取JWT授权标头。


BKe*_*ewl 7

对于 Google 员工,如果您通过 Cloudfront 发送已签名(签名 v4)S3 请求并且在您的 Cloudfront Origin 设置中将“限制存储桶访问”设置为“是”,则 Cloudfront 会将授权标头添加到您的请求中,您将得到这个错误。但是,由于您已经签署了您的请求,您应该能够关闭此设置,而不会牺牲任何安全性。