2015-07-15 5 views
1

У меня есть приложение SPA в Angular и разрешено записывать файлы JSON, включив PUT в конфигурации CORS.Amazon S3 JSON File - Access Denied

<?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> 

я могу создать файл в формате JSON через PUT и затем выполнить GET, чтобы увидеть файл я создал, из окна браузера. Однако при загрузке созданного файла JSON через консоль Online S3 или CloudBerry я получаю «доступ запрещен», хотя я использую учетную запись root с секретным ключом. Сообщение об ошибке выглядит так:

<Error> 
<Code>AccessDenied</Code> 
<Message>Access Denied</Message> 
<RequestId>876213549363694A</RequestId> 
<HostId> 
ePMtRfoLm7zUrjYwSG6aIWIBeIwWI0Ajiq+LSUqylKofhdIIbSm5LfncoS0ZvxcC 
</HostId> 
</Error> 

Любые предложения, высоко оцененные!

ответ

1

Система разрешений S3 - это немного interesting. S3 отслеживает информацию о владельцах для объектов в ведрах, а также сами ведра - объекты CAN могут иметь другого владельца, чем тот, к которому они принадлежат, и если владельцы разные, у вас должно быть разрешение от BOTH из них для доступа к объекту - это владелец ведра!

Вы загружаете объект анонимно, поэтому объект заканчивается владельцем анонимного пользователя. Вы (владелец ведра) дали разрешение анонимному пользователю читать объекты из вашего ведра, а объект принадлежит анонимному пользователю, поэтому работают неавторизованные вызовы GET. Однако анонимный пользователь, выполнивший загрузку, НЕ дал вам (владельцу ведра) разрешение на чтение объекта, поэтому вызовы, прошедшие проверку подлинности с использованием ваших учетных данных, отклоняются ... Bizarre.

Самый быстрый выход из этой ситуации - включить заголовок «x-amz-acl: bucket-owner-full-control» в ваш запрос PUT. Это дает владельцу ведро (вам) полный контроль над чтением, записью или удалением объекта, даже если он все еще «принадлежит» анонимному пользователю. Возможно, вы захотите, чтобы этот заголовок был необходим для всех анонимных запросов PUT в политике ведра, как описано в документе here.


Добавление примера:

$http.put("/path", jsonData, { 
        headers: { 'x-amz-acl': 'bucket-owner-full-control' } 
        } 
); 
+0

Спасибо .. большое объяснение –