bucketIn мой проект, я загружаю файлы пользователя в облачное хранилище, поэтому, когда пользователь хочет загрузить этот файл, я хочу сгенерировать signurl из облака Google, чтобы ограничить доступ к файлам только этому конкретному пользователю. Поэтому я пробовал использовать следующий php-код для сделай это
`
function storageURL( $id, $method = 'GET', $duration = 10 ) { $expires = time( ) + $duration*60; $content_type = ($method == 'PUT') ? 'application/x-www-form-urlencoded' : ''; $to_sign = ($method . "\n" . /* Content-MD5 */ "\n" . $content_type . "\n" . $expires . "\n" . s '/bucket/' . $id); $signature = ''; $signer = new Google_Signer_P12(file_get_contents(__DIR__.'/'."key.p12"), "notasecret"); $signature = $signer->sign($to_sign); $signature = Google_Utils::urlSafeB64Encode($signature); return ('https://bucket.storage.googleapis.com/' . $id . '?GoogleAccessId=' . 'MyServiceAccount@developer.gserviceaccount.com' . '&Expires=' . $expires . '&Signature=' . $signature); } echo storageURL("object_file.docx"); ?>`
Когда я копирую этот URL-адрес в адресную строку браузера, он показывает мне ошибку SignatureDoesNotMatch, я получаю этот XML как вывод
<Error> <Code>SignatureDoesNotMatch</Code> <Message> The request signature we calculated does not match the signature you provided. Check your Google secret key and signing method. </Message> <StringToSign> GET 1409582445 /bucket/object_file.docx </StringToSign> </Error>
Я не могу понять, что не так с моим кодом …
PS Я могу загрузить файл, когда я вставляю его в адресную строку браузера « https://bucket.storage.googleapis.com/object_file.docx »
Проверьте этот раздел:
<StringToSign> GET 1409582445 /bucket/object_file.docx </StringToSign>
Это строка, которую GCS решила, что вы подписали бы на основе входящего запроса. Новые линии выходят куда-то по пути, но там есть три вещи: слово GET, метка времени и путь к объекту.
В вашем коде есть одна вещь, которой нет в этой строке: Content_Type. Пользователь загружает объект, поэтому он не предоставляет тип содержимого. Оставьте эту строку пустой.
Файл, который я пытался получить, имеет пробелы в имени из-за некоторых ошибок с urlencoding. Я не смог создать правильный URL-адрес для него …
Поэтому для файлов без пробелов отлично работает со мной
Ссылка -> Использование облачных хранилищ google и gsutil не могут генерировать действительный signedurl