Предоставленный параметр ключа нельзя преобразовать в закрытый ключ с помощью API Google.

Я пытаюсь проверить этот пример, который я нашел здесь, чтобы я мог выполнить прямую загрузку на стороне клиента без входа пользователя в систему с помощью Google Cloud Storage.

Все выраженные константы имеют правильные значения, а путь правильный и не имеет пустого содержимого.

Ошибка, которую я получаю:

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);
    }

person ryandawkins    schedule 15.01.2014    source источник


Ответы (2)


Во-первых, вам нужно использовать openssl_pkcs12_read для чтения файла ключа, а не file_get_contents. Во-вторых, я считаю, что вы хотите оставить второй параметр до openssl_get_privatekey.

Я настоятельно рекомендую вам использовать для этого google-api-php-client. , который имеет Google_P12Signer. php

person jterrace    schedule 15.01.2014
comment
Итак, я могу сгенерировать URL-адрес, используя только это? - person ryandawkins; 16.01.2014
comment
Что это? Если вы имеете в виду google-api-php-client, то да - person jterrace; 16.01.2014
comment
О... где вы находите документацию к апи-библиотеке? - person ryandawkins; 16.01.2014

Более безопасный способ — использовать для этого класс Google_Signer_P12, поставляемый с PHP-клиентом Google API. .

Пример кода:

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);
person Muhammad Reda    schedule 17.09.2014
comment
google_signer_p12 был удален в новой версии, что использовать вместо него? - person ; 15.05.2017