2015-11-05 6 views
13

Ich arbeite mit Google Spreadsheet in PHP. Wenn ich P12 Taste funktioniert es perfekt, aber wenn ich JSON Schlüssel Schlüssel anstelle von P12 verwenden, während Authentifizieren mit Google Tabellenkalkulation wirdWie wird der JSON-Schlüssel anstelle von P12 in Google Spreadsheet-Authentifizierung mit PHP verwendet?

Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Unable to load private key'

geben Bitte sagen Sie mir, wie JSON Schlüssel zu verwenden, während Blatt Authentifizieren mit Google Verbreitung in PHP.

+3

Haben Sie die Anweisungen zum Erstellen eines JSON-Schlüssels befolgt? – tam5

+2

Können Sie Ihre Implementierung zeigen? – yergo

+0

@Insomania arbeitest du noch daran? – Twisty

Antwort

4

Hier ist die Lösung, die ich gefunden habe.

Für P12 Key
Normalerweise verwenden wir den folgenden Code ein Token zu erzeugen.

public static function getToken() 
    { 
     $key = file_get_contents(APPLICATION_DIR.'/'.APPLICATION_GOOGLE_CLIENT_KEY_FILE); 

     $cred = new Google_Auth_AssertionCredentials(
      APPLICATION_GOOGLE_CLIENT_EMAIL, 
      array('https://spreadsheets.google.com/feeds'), 
      $key 
     ); 

     $client = new Google_Client(); 
     $client->setAssertionCredentials($cred); 

     if (!$client->getAuth()->isAccessTokenExpired()) { 
      return false; 
     } 
     else { 
      $client->getAuth()->refreshTokenWithAssertion($cred); 
     } 

     $service_token = json_decode($client->getAccessToken()); 


     return $service_token->access_token; 
    } 

Für JSON Key
Aber jetzt nicht P12 Schlüssel haben wir haben wir einen JSON Schlüssel haben, so dass ich unten einen Blick nur einige Änderungen in den obigen Code aus, nehmen Sie bitte:

public static function getToken() 
    { 

     $key = APPLICATION_DIR.'/'.APPLICATION_GOOGLE_CLIENT_KEY_FILE; 
     $data = json_decode(file_get_contents($key)); // here i decoded the json 

     if (isset($data->type) && $data->type == 'service_account') { 

      $cred = new Google_Auth_AssertionCredentials(
       APPLICATION_GOOGLE_CLIENT_EMAIL, // it's the client email 
       array('https://spreadsheets.google.com/feeds'), // it's google spreadsheet scope 
       $data->private_key   // here is the private key 
      ); 
     } 

     $client = new Google_Client(); 
     $client->setAssertionCredentials($cred); 

     if (!$client->getAuth()->isAccessTokenExpired()) { 
      return false; 
     } 
     else { 
      $client->getAuth()->refreshTokenWithAssertion($cred); 
     } 

     $service_token = json_decode($client->getAccessToken()); 


     return $service_token->access_token; 
    } 
+2

Vielen Dank für dieses Stück Code, hat mir sehr geholfen! –

+0

@guillaume_shm Sie sind herzlich willkommen :) –

1

Access Token wird nur 1 Stunde gültig sein und wird als decodierte JSON gesendet. Sie müssen es wahrscheinlich zuerst entschlüsseln.

$token = json_decode($client->getAccessToken()); 
$serviceRequest = new DefaultServiceRequest($token->access_token); 
ServiceRequestFactory::setInstance($serviceRequest); 

Verwenden p12 Schlüssel sollte dann gut funktionieren.

session_start(); 

define('GOOGLE_CLIENT_ID',''); 
define('GOOGLE_CLIENT_EMAIL',''); 
define('GOOGLE_SPREADSHEETS_SCOPE','https://spreadsheets.google.com/feeds'); 
define('GOOGLE_APPLICATION_NAME','whatever'); 
define('GOOGLE_KEY_FILE','xxxxxxxxxxxxxx.p12'); // pass for key: notasecret 

function getToken() 
{ 
    $client = new Google_Client(); 
    $client->setApplicationName(GOOGLE_APPLICATION_NAME); 
    $client->setClientId(GOOGLE_CLIENT_ID); 

    $key = file_get_contents(GOOGLE_KEY_FILE); 
    $cred = new Google_Auth_AssertionCredentials(
     GOOGLE_CLIENT_EMAIL, 
     array(GOOGLE_SPREADSHEETS_SCOPE), 
     $key 
    ); 

    $client->setAssertionCredentials($cred); 

    if($client->getAuth()->isAccessTokenExpired()) { 
     $client->getAuth()->refreshTokenWithAssertion($cred); 
    } 

    $service_token = json_decode($client->getAccessToken()); 
    return $service_token->access_token; 
} 

require("vendor/autoload.php"); 

use Google\Spreadsheet\DefaultServiceRequest; 
use Google\Spreadsheet\ServiceRequestFactory; 

$_SESSION['access_token']=getToken(); 

$serviceRequest = new Google\Spreadsheet\DefaultServiceRequest($_SESSION['access_token']); 
Google\Spreadsheet\ServiceRequestFactory::setInstance($serviceRequest); 
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService(); 
$spreadsheetFeed = $spreadsheetService->getSpreadsheets(); 
Verwandte Themen