2017-05-01 7 views
0

Je peux ajouter un événement à mon agenda google avec une clé API et un ID client OAuth 2.0, mais je veux le faire sans l'écran d'autorisation de google.google-api-php-client se connecter avec key.p12

J'ai suivi les informations trouvées sur ce poste:

stackoverflow.com/questions/8995451/how-do-i-connect-to-the-google-calendar-api-without-the-oauth-authentication

Pour cela, j'ai créé une 'clé de compte de service'. Je suis allé à mes lettres de créance de projet et sélectionnez 'Créer de vérification des pouvoirs> Service Key Account'

Puis:

compte de service> my_project_name

Type de clé> p12

J'enregistré le fichier clé key.p12

Voici mon code:

<?php 
// display error, debbug 
ini_set('display_errors',1); 

session_start(); 

require_once './google-api-php-client/src/Google_Client.php'; 
require_once './google-api-php-client/src/contrib/Google_CalendarService.php'; 

// following values are taken from : console.developers.google.com/apis/credentials?project=projectname credentials 
// OAuth 2.0 client IDs : Client ID 
const CLIENT_ID = 'xxxx'; 
// Service account keys : Service account 
const SERVICE_ACCOUNT_NAME = 'my_project_name'; 

// key 
const KEY_FILE = './key.p12'; 

$client = new Google_Client(); 
$client->setApplicationName("Google Calendar API Quickstart"); 

if (isset($_SESSION['token'])) { 
    $client->setAccessToken($_SESSION['token']); 
} 

// Load the key in PKCS 12 format 
$key = file_get_contents(KEY_FILE); 

$client->setAssertionCredentials(new Google_AssertionCredentials(
    SERVICE_ACCOUNT_NAME, 
    array('https://www.googleapis.com/auth/calendar'), 
    $key) 
); 

$client->setClientId(CLIENT_ID); 
$cal = new Google_CalendarService($client); 

//Save token in session 
if ($client->getAccessToken()) { 
    $_SESSION['token'] = $client->getAccessToken(); 
} 

// my code here 
$event = new Google_Event(... 
$calendarId = '[email protected]'; 
$event = $cal->events->insert($calendarId, $event); 

?> 

Et voici le message d'erreur:

Fatal error: Uncaught Google_AuthException: Error refreshing the OAuth2 token, message: '{ 
    'error' : 'invalid_client', 
    'error_description' : 'The OAuth client was not found.' 
}' in /home/www/google-api-php-client/src/auth/Google_OAuth2.php:288 
Stack trace: 
#0 /home/www/google-api-php-client/src/auth/Google_OAuth2.php(264): Google_OAuth2->refreshTokenRequest(Array) 
#1 /home/www/google-api-php-client/src/auth/Google_OAuth2.php(218): Google_OAuth2->refreshTokenWithAssertion() 
#2 /home/www/google-api-php-client/src/service/Google_ServiceResource.php(167): Google_OAuth2->sign(Object(Google_HttpRequest)) 
#3 /home/www/google-api-php-client/src/contrib/Google_CalendarService.php(469): Google_ServiceResource->__call('insert', Array) 
#4 /home/www/goog in /home/www/google-api-php-client/src/auth/Google_OAuth2.php on line 288 

Il semble que le $ client-> getAccessToken() n'est pas réglé, mais je ne sais pas pourquoi.

Merci d'avance pour votre aide.

Répondre

0

Créez une clé de compte de service et téléchargez le fichier * .json contenant les clés privées. Placez le fichier * .json que vous venez de télécharger dans le répertoire de votre choix (fichier credentials.json dans l'exemple). Ensuite, allez dans Google Agenda-> Partager et ajoutez l'identifiant du compte de service dans la liste.

putenv('GOOGLE_APPLICATION_CREDENTIALS=credentials.json'); 

$client = new Google_Client(); 
$client->useApplicationDefaultCredentials(); 
$client->addScope('https://www.googleapis.com/auth/calendar'); 
$client->setHttpClient(new GuzzleHttp\Client([ 'verify' => false ])); // disable ssl if necessary 

$service = new Google_Service_Calendar($client); 

// list events 
$service->events->listEvents($calendar_id, array('timeMin' => (new DateTime)->format(DateTime::RFC3339))); 

// add event 
$event = new Google_Service_Calendar_Event($data); 
$event = $service->events->insert($calendar_id, $event); 

Vous pouvez trouver le package client API Google PHP Library avec chargeur automatique dans la page releases sur GitHub, la seule require_once appel nécessaire est pour le fichier autoload:

require_once '/path/to/google-api-php-client/vendor/autoload.php'; 

Et, Google docs peut vous aider De plus, c'est juste une façon qui fonctionne pour moi, donc cela peut vous être utile aussi.

+0

merci Danijel pour votre réponse. J'ai créé un nouvel identifiant de compte de service avec le rôle> projet> propriétaire. J'ai téléchargé le fichier et l'ai placé dans le répertoire racine de mon webserer. Je suis coincé à 'Ensuite, allez dans Google Agenda-> Partager et ajouter l'identifiant du compte de service sur la liste.' Je suis allé à mon calendrier de compte google> paramètres> calendrier> mycalendar> Adresse du calendrier> paramètres de partage> Partager avec des personnes spécifiques, ici j'ai essayé d'entrer le «ID de clé de compte de service» sans succès. Il demande un email addr. Ai-je manqué quelque chose ? – blackndoor

+0

Oui, je l'ai mal écrit, je suis arrivé à "Gérer les comptes de service", et j'utilise "ID de compte de service", pas "ID de clé", mon erreur. – Danijel

+0

Merci beaucoup, ça marche! – blackndoor