2015-11-05 4 views
13

मैं PHP में Google स्प्रेडशीट के साथ काम कर रहा हूं। जब मैं P12 कुंजी का उपयोग यह सही काम करता है, लेकिन जब मैं P12 कुंजी के बजाय JSON कुंजी का उपयोग गूगल फैले शीट के साथ प्रमाणीकरण है, यहPHP के साथ Google स्प्रेडशीट प्रमाणीकरण में पी 12 के बजाय JSON कुंजी का उपयोग कैसे करें?

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

दे रहा है कृपया मुझे बताओ कैसे JSON कुंजी का उपयोग करने के लिए गूगल फैले शीट के साथ प्रमाणीकरण, जबकि PHP में

+3

क्या आपने JSON कुंजी बनाने के निर्देशों का पालन किया था? – tam5

+2

क्या आप अपना कार्यान्वयन दिखा सकते हैं? – yergo

+0

@ इन्सोमैनिया क्या आप अभी भी इस पर काम कर रहे हैं? – Twisty

उत्तर

4

यहां मुझे मिला समाधान है।

P12 कुंजी
आम तौर पर के लिए, हम एक टोकन उत्पन्न करने के लिए निम्न कोड का उपयोग करें।

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

JSON कुंजी के लिए
लेकिन अब हम P12 कुंजी नहीं है, हम एक JSON कुंजी है, तो मैं बस उपरोक्त कोड में कुछ परिवर्तन किए, कृपया नीचे एक नज़र डालें:

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

कोड के इस टुकड़े के लिए आपको बहुत बहुत धन्यवाद, मुझे बहुत मदद मिली! –

+0

@guillaume_shm आपका स्वागत है :) –

1

एक्सेस टोकन केवल वैध 1 घंटा होगा और इसे डीकोडेड जेसन के रूप में भेजा जाएगा। तो आपको शायद इसे पहले डीकोड करना होगा।

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

पी 12 कुंजी का उपयोग करना ठीक काम करना चाहिए।

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(); 
संबंधित मुद्दे