我在Angular中有一个SPA应用程序,并通过在CORS配置中启用PUT来启用写入JSON文件。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
我可以通过PUT创建一个JSON文件,然后从浏览器窗口进行GET以查看我创建的文件。但是,当通过Online S3控制台或CloudBerry下载创建的JSON文件时,即使我使用带有密钥的root帐户,我也会收到“拒绝访问”。错误消息如下所示:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>876213549363694A</RequestId>
<HostId>
ePMtRfoLm7zUrjYwSG6aIWIBeIwWI0Ajiq+LSUqylKofhdIIbSm5LfncoS0ZvxcC
</HostId>
</Error>
任何建议都非常赞赏!!
答案 0 :(得分:1)
S3的权限系统有点interesting。 S3跟踪存储桶中的对象以及存储桶本身的所有权信息 - 对象可以拥有与其所属存储桶不同的所有者,如果所有者不同,则必须获得他们两者的许可才能访问该对象 - 即使您是作为桶的主人!
您正在匿名上传对象,因此该对象最终由匿名用户拥有。您(存储桶的所有者)已授予匿名用户读取存储桶中对象的权限,该对象归匿名用户所有,因此未经身份验证的GET调用可以正常工作。但是,执行上载的匿名用户未授予您(存储桶拥有者)读取对象的权限,因此拒绝使用您的凭据进行身份验证的调用...奇怪。
出现这种情况的最快方法是在PUT请求中包含“x-amz-acl:bucket-owner-full-control”标头。这将授予存储桶的所有者(您)完全控制以读取,写入或删除对象,即使它仍然由匿名用户“拥有”。您可能需要考虑在存储桶策略中的所有匿名PUT请求中使用此标头,如文档here所示。
添加示例:
$http.put("/path", jsonData, {
headers: { 'x-amz-acl': 'bucket-owner-full-control' }
}
);