2015-11-05 14 views
13

PHP'de Google Spreadsheet ile çalışıyorum. Ben P12 anahtarı kullandığınızda mükemmel çalışır, ancak Google Yayılması Tablosu ile kimlik denetimi sırasında yerine P12 anahtarının JSON anahtarını kullandığınızda, Google'ın Yayılması Tablosu ile kimlik denetimi yaparken nasıl JSON tuşunu kullanmak söyle PHP ile Google Spreadsheet Kimlik Doğrulaması'nda P12 yerine JSON anahtarı nasıl kullanılır?

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

veriyor PHP'de.

+3

JSON anahtarı oluşturma talimatlarını takip ettiniz mi? – tam5

+2

Uygulamanızı gösterebilir misiniz? – yergo

+0

@Insomania hala bunun üzerinde çalışıyor musunuz? – Twisty

cevap

4

İşte bulduğum çözüm.


Normalde Anahtar P12 için, bir belirteç oluşturmak için aşağıdaki kodu kullanabilirsiniz.

JSON Anahtar için
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; 
    } 


Ama şimdi P12 anahtarı yok, bir JSON anahtarı var, bu yüzden sadece yukarıdaki kodda bazı değişiklikler yapılmış, aşağıda bir göz atın lütfen:

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

Bu kod parçası için çok teşekkür ederim, bana çok yardımcı oldu! –

+0

@guillaume_shm hoşgeldiniz :) –

1

Erişim belirteci yalnızca 1 saat geçerli olacak ve kodu çözülmüş json olarak gönderilecektir. Yani muhtemelen önce onu çözmelisin.

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

p12 tuşunu kullanarak iyi çalışın.

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(); 
İlgili konular