Предоставленный ключ параметр не может быть принужден к закрытым ключом с помощью Google API-интерфейсы
Я пытаюсь проверить этот пример, который я нашел здесь, чтобы я мог сделать прямую загрузку на стороне клиента без входа пользователя в систему с помощью облачного хранилища Google.
Все выраженные константы имеют свои правильные значения, и путь является правильным и не имеет пустого содержимого.
Ошибка, которую я получаю:
openssl_sign(): supplied key param cannot be coerced into a private key
Моя функция реализована следующим образом:
public static function storageURL( $id, $method = 'GET', $duration = 10 ) {
$key = file_get_contents(self::KEY_FILE);
$pkey = openssl_get_privatekey($key, 'notasecret');
$expires = time( ) + $duration;
$content_type = ($method == 'PUT') ? 'application/x-www-form-urlencoded' : '';
$to_sign = ($method . "n" .
/* Content-MD5 */ "n" .
$content_type . "n" .
$expires . "n" .
'/'.self::BUCKET_NAME.'/' . $id);
$signature = '*Signature will go here*';
if (!openssl_sign( $to_sign, $signature, $pkey, 'sha256' ))
{
error_log( 'openssl_sign failed!' );
$signature = '<failed>';
} else {
$signature = urlencode( base64_encode( $signature ) );
}
return ('https://'.self::BUCKET_NAME.'.commondatastorage.googleapis.com/' .
$id .
'?GoogleAccessId=' . self::SERVICE_ACCOUNT_NAME .
'&Expires=' . $expires . '&Signature=' . $signature);
}
2 ответа:
Во-первых, вы должны использовать
openssl_pkcs12_read
для чтения файла ключа, а неfile_get_contents
. Во-вторых, я полагаю, что вы хотите оставить второй параметр вopenssl_get_privatekey
.Я настоятельно рекомендую вам использовать для этого google-api-php-client, который имеет Google_P12Signer.php
Более безопасный способ-использовать класс
Google_Signer_P12
, поставляемый сGoogle API PHP client для этого.Пример кода:
set_include_path(get_include_path() . PATH_SEPARATOR . 'PATH/TO/API/src'); require_once 'Google/Signer/P12.php'; $p12contents = file_get_contents('FILE.p12'); $googleSigner = new Google_Signer_P12($p12contents, 'notasecret'); $signature = $googleSigner->sign($data);