Estoy intentando que mi aplicación php llame a la API de Google Calendar usando el servicio para autenticar. Tengo acceso administrativo a mi Education G Suite, y he realizado los siguientes pasos como se indica aquí: https: //developers.google.com/identity/protocols/OAuth2ServiceAccount

  1. Creé una cuenta de servicio con autoridad en todo el dominio y guardé las credenciales adecuadas.
  2. Se agregó el calendario (lectura-escritura) https://www.googleapis.com/auth/calendar alcance a mi cuenta de administrador en "Acceso de cliente API administrado" utilizando mi ClientID (que está confirmado por la interfaz de usuario)
  3. Realizó las llamadas adecuadas al cliente de la API php, intentando suplantar al administrador y a otra cuenta de usuario, según los ejemplos. aquí: https://developers.google.com/api- client-library / php / auth / service-accounts

Sin embargo, cuando intento obtener información del calendario, sigo recibiendo el siguiente error:

Google_Service_Exception: {"error": "unauthorized_client", "error_description": "El cliente no está autorizado para recuperar tokens de acceso con este método". }

Por búsqueda en Google, esto normalmente significa que no he delegado la autoridad de todo el dominio, pero definitivamente sí. He probado otras apis de Google con los mismos resultados.

Aquí está mi código. Gracias por cualquier pensamiento o ayuda.

<?php require_once __DIR__ . '/vendor/autoload.php';
putenv('GOOGLE_APPLICATION_CREDENTIALS=****/client_secret.json');

$user_to_impersonate = 'user@****.com';
$user_scopes = array(
    Google_Service_Calendar::CALENDAR
);
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->setSubject($user_to_impersonate);
$client->setScopes($user_scopes);
$client->setAccessType('offline');

$calendar = new Google_Service_Calendar($client);
$calendarId = 'primary';
$optParams = array(
    'maxResults' => 10,
    'orderBy' => 'startTime',
    'singleEvents' => TRUE,
    'timeMin' => date('c'),
);
$results = $calendar->events->listEvents($calendarId, $optParams);
...


?>
1
Jerry Lupo 28 feb. 2018 a las 01:11

3 respuestas

La mejor respuesta

El cliente no está autorizado para recuperar tokens de acceso utilizando este método.

Cuando cree su proyecto en la consola de desarrollador de Google, debería haber creado las credenciales de la cuenta de servicio. Luego, se lo promocionaría para descargar un archivo que este archivo contiene las credenciales para una cuenta de servicio.

El código que usa para conectarse a una cuenta de servicio es diferente del código que usa para conectarse usando navegadores o credenciales de cliente nativas.

ServiceAccount.php enlace al código

require_once __DIR__ . '/vendor/autoload.php';
// Use the developers console and download your service account
// credentials in JSON format. Place the file in this directory or
// change the key file location if necessary.
putenv('GOOGLE_APPLICATION_CREDENTIALS='.__DIR__.'/service-account.json');
/**
 * Gets the Google client refreshing auth if needed.
 * Documentation: https://developers.google.com/identity/protocols/OAuth2ServiceAccount
 * Initializes a client object.
 * @return A google client object.
 */
function getGoogleClient() {
    return getServiceAccountClient();
}
/**
 * Builds the Google client object.
 * Documentation: https://developers.google.com/api-client-library/php/auth/service-accounts
 * Scopes will need to be changed depending upon the API's being accessed. 
 * array(Google_Service_Analytics::ANALYTICS_READONLY, Google_Service_Analytics::ANALYTICS)
 * List of Google Scopes: https://developers.google.com/identity/protocols/googlescopes
 * @return A google client object.
 */
function getServiceAccountClient() {
    try {   
        // Create and configure a new client object.        
        $client = new Google_Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope([YOUR SCOPES HERE]);
        return $client;
    } catch (Exception $e) {
        print "An error occurred: " . $e->getMessage();
    }
}

Parece que está utilizando el código de cuenta de servicio correcto. Sin embargo, probablemente haya descargado el archivo de credenciales incorrecto, le sugiero que vuelva a descargar el archivo de la consola de desarrolladores de Google.

1
DaImTo 28 feb. 2018 a las 07:40

Había agregado ámbitos incorrectos en el paso 2 anterior. Esperemos que esto todavía permita a algunas personas ver los pasos correctos.

0
Jerry Lupo 1 mar. 2018 a las 17:04

También me he encontrado con este problema, pero solo cuando uso $ client -> setSubject (impersonationemail); Intente comentar esta línea y vea qué código de respuesta le da.

0
uselessinfoguru 30 mar. 2018 a las 18:34