с помощью google-api-php-клиента, неспособного создать правильный signedurl

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 »

Solutions Collecting From Web of "с помощью google-api-php-клиента, неспособного создать правильный signedurl"

Проверьте этот раздел:

 <StringToSign> GET 1409582445 /bucket/object_file.docx </StringToSign> 

Это строка, которую GCS решила, что вы подписали бы на основе входящего запроса. Новые линии выходят куда-то по пути, но там есть три вещи: слово GET, метка времени и путь к объекту.

В вашем коде есть одна вещь, которой нет в этой строке: Content_Type. Пользователь загружает объект, поэтому он не предоставляет тип содержимого. Оставьте эту строку пустой.

Файл, который я пытался получить, имеет пробелы в имени из-за некоторых ошибок с urlencoding. Я не смог создать правильный URL-адрес для него …

Поэтому для файлов без пробелов отлично работает со мной

Ссылка -> Использование облачных хранилищ google и gsutil не могут генерировать действительный signedurl