2014-01-15 5 views
8

Ich versuche dieses Beispiel zu testen, das ich here gefunden habe, so dass ich direkt auf der Clientseite hochladen kann, ohne den Benutzer mit Google Cloud Storage anmelden zu müssen.Der mitgelieferte Schlüsselparameter kann nicht mit Google APIs in einen privaten Schlüssel umgewandelt werden

Alle angegebenen Konstanten haben ihre korrekten Werte, und der Pfad ist korrekt und hat keinen leeren Inhalt.

Der Fehler Ich erhalte:

openssl_sign(): supplied key param cannot be coerced into a private key 

Meine Funktion implementiert ist:

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

Antwort

2

Zuerst müssen Sie openssl_pkcs12_read verwenden, um die Schlüssel-Datei zu lesen, nicht file_get_contents. Zweitens glaube ich, dass Sie den zweiten Parameter auf openssl_get_privatekey verlassen möchten.

empfehle ich Ihnen diese verwenden google-api-php-client für, die Google_P12Signer.php

+0

So kann ich die URL generieren gerade dies mit? – RyanDawkins

+0

Was ist "das"? Wenn du den Google-API-Client meinst, dann ja – jterrace

+0

Oh ... wo findest du die Dokumentation zur api-Bibliothek? – RyanDawkins

0

Der sicherere Weg hat, ist Google_Signer_P12 Klasse mit Google API PHP client ausgeliefert zu verwenden, das zu tun.

Codebeispiel:

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); 
+0

google_signer_p12 wurde in der neuen Version entfernt, was stattdessen zu verwenden? –

Verwandte Themen