Подпись Google Cloud Storage Url – SignatureDoesNotMatch

Я могу поместить файл (image.png) в свой ведро Google Cloud Storage с помощью google-api-php-client, но теперь у меня возникли проблемы с попыткой создать подписанный URL-адрес, чтобы получить доступ к файлу с моего сайта. Образец кода:

$bucketName = 'bucket-name'; $id = 'image.png'; $serviceAccountName = '123456789-xxxx@developer.gserviceaccount.com'; $privateKey = file_get_contents($location_to_key_file); $signer = new \Google_P12Signer($privateKey, "notasecret"); $ttl = time() + 3600; $stringToSign = "GET\n" . "\n" . "\n" . $ttl . "\n". '/' . $bucketName . '/' . $id; $signature = $signer->sign(utf8_encode($stringToSign)); $finalSignature = \Google_Utils::urlSafeB64Encode($signature); $host = "https://".$bucketName.".storage.googleapis.com"; echo $host. "/".$id."?GoogleAccessId=" . $serviceAccountName . "&Expires=" . $ttl . "&Signature=" . $finalSignature; 

Возвращает:

 <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 1387590477 /bucketname/image.png</StringToSign></Error> 

im с помощью google-api-php-client с php 5.5

ive последовал за несколькими примерами:

https://groups.google.com/forum/#!topic/gs-discussion/EjPRAWbWKbw

https://groups.google.com/forum/#!msg/google-api-php-client/jaRYDWdpteQ/xbNTLfDhUggJ

Может быть, значение конфигурации im не передается правильно? Я предполагаю, что должно использоваться электронное письмо с учетной записью службы. Также попытался включить md5hash и content-type в $ stringToSign, те же результаты.

любая помощь / советы будут оценены.

Rdb почти делает трюк для меня. Я использовал рабочий пример python из GoogleCloudPlatform для python, чтобы отладить ошибки в URL- адресе и найти следующее:

  • GoogleAccessId должен быть уркокодирован
  • Вы должны заменить в Подписи следующие символы: '-' => '% 2B', '_' => '% 2F
  • Подпись должна заканчиваться на «% 3D»

Код:

 $host. "/".$id."?Expires=" . $ttl . "&GoogleAccessId=" . urlencode($serviceAccountName) . "&Signature=" . str_replace(array('-','_',), array('%2B', '%2F'),urlencode($finalSignature)).'%3D'; 

Теперь url должен работать, и вы можете использовать некоторые продвинутые операторы, такие как response-content-disposition или response-content-type

Можете ли вы попытаться создать подписанный URL, используя $host as –

$host = "https://".$bucketName.".commondatastorage.googleapis.com";

Есть одна разница, которую я нашел с документом, к которому вы обращаетесь.

благодаря

вы можете попробовать эти коды 🙂

 $finalSignature = base64_encode($signature); echo $host. "/".$id."?GoogleAccessId=" . $serviceAccountName . "&Expires=" . $ttl . "&Signature=" . urlencode($finalSignature); 

Я думаю, что ваша ошибка в $finalSignature = \Google_Utils::urlSafeB64Encode($signature); линия. Этот метод делает что-то странное с URL-адресом и заменяет определенные символы.

В конце концов, я все это работал со следующим кодом:

 $expires = time() + 60 * 30; // Half an hour // Get the key from the key file $privateKeyPath = Config::get('gcs.signing.key'); $privateKey = file_get_contents($privateKeyPath); $signer = new Google_Signer_P12($privateKey, Config::get('gcs.signing.password')); //Signing does not like spaces, however it also doesn't like urlencoding or html entities $cloudStoragePath = str_replace(' ', '%20', $cloudStoragePath); //Create string to sign $stringToSign = "GET\n\n\n" . $expires . "\n" . "/" . $cloudStoragePath; //Sign $signature = $signer->sign(utf8_encode($stringToSign)); $query = array( 'GoogleAccessId' => Config::get('gcs.signing.service_account'), 'Expires' => $expires, 'Signature' => base64_encode($signature) ); $url = self::$storageBaseUrl . '/' . $cloudStoragePath . '?' . http_build_query($query);