Я только что начал обновлять свой код облачного хранилища Google с версии API версии 1.0 до версии 2.0, и у меня возникают некоторые проблемы.
С версией 1.0 я пользовался Signed URLs с большим успехом, используя файлы .p12. Однако это устарело в новой версии, и вместо этого я должен использовать Firebase/php-jwt, используя файлы JSON.
Проблема в том, что она просто не работает, я получаю ошибку:
<?xml version='1.0' encoding='UTF-8'?><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>PUT
image/png
1483626991
/myBucket/folder/test.PNG</StringToSign></Error>
Это упрощенный код, используемый для его подписания.
$string = ($method . "\n" .
$contentMd5 . "\n" .
$contentType . "\n" .
$expiration . "\n" .
$file);
$signedURL = base64_encode(Firebase\JWT\JWT::encode($string,
file_get_contents($credentialsFilePath)));
После получения подписанногоURL я создаю URL с правильными данными. Единственная часть, которую я изменил с 1.0 и 2.0, - это та часть, где вы подписываете URL. Кроме того, я проверил, что строка в поле "StringToSign" ответа в точности совпадает с строкой, которую я подписываю.
В версии 1.0 я подписал URL-адрес следующим образом:
$signedURL = base64_encode((new Google_Signer_P12(
file_get_contents($p12FilePath),
'notasecret'
))->sign($string));
Все это заставляет меня поверить, что я пою правильное содержание, но использование JWT-функции ошибочно. Кто-нибудь еще это сделал? Как вы это сделали?
Если интересно, это URL-адрес, который я создаю (работает с 1.0):
$returnArr['url'] = "https://{$bucket}.commondatastorage.googleapis.com/"
. $prefix . '/' . rawurlencode($file)
. "?GoogleAccessId=" . rawurlencode($serviceEmail)
. "&Expires={$expiration}"
. "&Signature=" . rawurlencode($signature);