0

Я пытаюсь загрузить файл .jpeg в облачную хранилище Google, но мой запрос не выполняется со следующей ошибкой 401.Ошибка 401, причина: анонимные пользователи не имеют storage.objects.create доступ к bucket

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "required", 
    "message": "Anonymous users does not have storage.objects.create access to bucket XXXtest.", 
    "locationType": "header", 
    "location": "Authorization" 
    } 
    ], 
    "code": 401, 
    "message": "Anonymous users does not have storage.objects.create access to bucket XXXtest." 
} 
} 

Мой запрос POST выглядит следующим образом.

<form id="upload_image_form" class="" action="https://www.googleapis.com/upload/storage/v1/b/XXXtest/o?uploadType=media&name=myObject" method="post" enctype="multipart/form-data"> 
    <input id="image" name="image" type="file" accept="image/x-png, image/jpeg, image/png" onchange=""> 

    <input type="hidden" name="Content-Type" value="image/jpeg"> 
    <input type="hidden" name="name" value="my_name"> 
    <input type="hidden" name="Accept" value="application/json, text/json, text/x-json, text/javascript"> 
    <input type="hidden" name="host" value="www.googleapis.com"> 
    <input type="hidden" name="Transfer-Encoding" value="chunked"> 
    <input type="hidden" name="Authorization" value="<?php echo 'Bearer'.' '.$_SESSION['access_token']['access_token']; ?>"> 
    <input type="hidden" name="Expect" value="100-continue"> 
    <input type="hidden" name="Accept-Encoding" value="gzip, deflate"> 
    <input type="hidden" name="Connection" value="Keep-Alive"> 
    <input type="hidden" name="acl" value="bucket-owner-writer"> 
    <input id="upload" name="upload" value="Upload" type="submit" style="position: absolute;"> 

</form> 

Можете ли вы сказать мне, что я упускаю в соответствии с этим documentation?

+1

Вы проверили/установили списки ACL? https://cloud.google.com/storage/docs/access-control/create-manage-lists –

+3

Эй, вы действительно не хотите этого делать! Вы передаете токен доступа своему конечному пользователю в форме. Мало того, что это не сработает, это также дает любому, кто рассматривает эту страницу, токен, который они могут использовать, чтобы делать все, что захочет, с учетными данными этого пользователя. Это похоже на включение вашего пароля в комментарий HTML. –

+0

Привет @DanCornilescu Да, я установил это со значением «bucket-owner-writer», но он все еще не работает. – MKB

ответ

1

Чтобы пользователи могли загружать объекты в GCS через форму POST, вам понадобится создать «документ политики», описывающий, какие объекты пользователь может загрузить, затем подписать, а затем передать подписанный документ как параметр в форме. Вы можете прочитать больше о загрузке в ГКС через POST здесь: https://cloud.google.com/storage/docs/xml-api/post-object

И особо отметить раздел подписанных документов политик здесь: https://cloud.google.com/storage/docs/xml-api/post-object#policydocument

Вот документ Пример политики:

{"expiration": "2010-06-16T11:11:11Z", 
"conditions": [ 
    ["starts-with", "$key", "" ], 
    {"acl": "bucket-owner-read" }, 
    {"bucket": "travel-maps"}, 
    {"success_action_redirect": "http://www.example.com/success_notification.html" }, 
    ["eq", "$Content-Type", "image/jpeg" ], 
    ["content-length-range", 0, 1000000] 
    ] 
} 

Вы хотите затем base64, документ, подпишите результат с помощью закрытого ключа для учетной записи службы, которую вы хотите, чтобы пользователь действовал как для целей загрузки, а затем предоставил их в скрытых полях, например:

<input type="hidden" name="policy" value="eyJleHBpcmF0aW9uIjogIjIwMTAtMDYtMTZUMTE6MTE6MTFaIiwNCiAiY29uZGl0aW9ucyI6IFsNCiAgWyJzdGFydHMtd2l0aCIsICJrZXkiLCAiIiBdLA0KICB7ImFjbCI6ICJidWNrZXQtb3duZXItcmVhZCIgfSwNCiAgeyJidWNrZXQiOiAidHJhdmVsLW1hcHMifSwNCiAgeyJzdWNjZXNzX2FjdGlvbl9yZWRpcmVjdCI6ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3N1Y2Nlc3Nfbm90aWZpY2F0aW9uLmh0bWwiIH0sDQogIFsiZXEiLCAiQ29udGVudC1UeXBlIiwgImltYWdlL2pwZWciIF0sDQogIFsiY29udGVudC1sZW5ndGgtcmFuZ2UiLCAwLCAxMDAwMDAwXQ0KICBdDQp9"> 
<input type="hidden" name="signature" value="BSAMPLEaASAMPLE6SAMPLE+SAMPPLEqSAMPLEPSAMPLE+SAMPLEgSAMPLEzCPlgWREeF7oPGowkeKk7J4WApzkzxERdOQmAdrvshKSzUHg8Jqp1lw9tbiJfE2ExdOOIoJVmGLoDeAGnfzCd4fTsWcLbal9sFpqXsQI8IQi1493mw="> 
+0

Привет Брэндон. Спасибо за эту полезную информацию. Я новичок в облаке Google. Я не знаю, как создать этот документ (может быть, глупый вопрос). Могу ли я узнать, нужно ли нам создавать файл с вышеуказанной конфигурацией и включать кодированный путь к файлу или делать что-то еще в коде? – MKB

+1

Документ политики представляет собой строку JSON, которая была закодирована с использованием base64 и передана GCS как часть запроса POST в качестве скрытого ввода. Вы можете объявить его как константу в своем коде, иначе вы можете сгенерировать ее с помощью JSON и библиотеки base64 «на лету». –