setup google cliente php google-api oauth-2.0 google-calendar service-accounts

php - google - oauth2 api



Token OAuth2, mensaje: ''{"error": "access_denied"}'' devuelto cuando trato de actualizar Google Calendar usando OAuth(Cuenta de servicio) (2)

Estoy usando la biblioteca estándar de Google para PHP para usar el servicio de calendario y he configurado un tipo de cuenta de servicio para la autenticación OAuth 2.0 a través de la consola API de Google.

Mi objetivo principal es actualizar el calendario de google del usuario (por ejemplo: usuario@nombre de organización de organización) (cuando el usuario no está en línea) a través de un lote. P.ej. actualizar un evento en el calendario de usuarios.

Cuando el usuario inicia sesión en la aplicación (usando OAuth2.0), él o ella otorgará permiso para que la aplicación "Administre sus calendarios", "Ver sus calendarios" y "Realice estas operaciones cuando no esté usando la aplicación".

El siguiente código se usa para iniciar sesión con OAuth2.0

<?php require_once ''../../src/Google_Client.php''; require_once ''../../src/contrib/Google_CalendarService.php''; session_start(); $client = new Google_Client(); $client->setApplicationName("Google Calendar PHP Starter Application"); $client->setClientId(''XXXXX-flue2a9o5ll602ovrhaejlpm9otgjh1r.apps.googleusercontent.com''); $client->setClientSecret(''XXXXXXXXXX''); $client->setRedirectUri(''http://localhost/testAPI/google-api-php-client/examples/calendar/simple.php''); $client->setDeveloperKey(''AIzaSyCGvXRXGMo58ZDswyb4zBkJgRMLcHBRIrI''); $cal = new Google_CalendarService($client); if (isset($_GET[''logout''])) { unset($_SESSION[''token'']); } if (isset($_GET[''code''])) { $client->authenticate($_GET[''code'']); $_SESSION[''code'']=$_GET[''code'']; $_SESSION[''token''] = $client->getAccessToken(); header(''Location: http://'' . $_SERVER[''HTTP_HOST''] . $_SERVER[''PHP_SELF'']); } if (isset($_SESSION[''token''])) { $client->setAccessToken($_SESSION[''token'']); } if ($client->getAccessToken()) { $calList = $cal->calendarList->listCalendarList(); print "<h1>Calendar List</h1><pre>" . print_r($calList, true) . "</pre>"; echo $_SESSION[''code'']; $_SESSION[''token''] = $client->getAccessToken(); } else { $authUrl = $client->createAuthUrl(); print "<a class=''login'' href=''$authUrl''>Connect Me!</a>"; } ?>

Una vez que obtengo los permisos, ¿tengo que guardar algo para usar estos permisos en el futuro cuando el usuario no está conectado?

El siguiente código funciona bien cuando el usuario está conectado. Pero devuelve Error al actualizar el token OAuth2, mensaje: ''{"error": "access_denied"}'' cuando el usuario está desconectado

<?php require_once ''../src/Google_Client.php''; require_once ''../src/contrib/Google_CalendarService.php''; session_start(); const CLIENT_ID = ''XXXXXX.apps.googleusercontent.com''; const SERVICE_ACCOUNT_NAME = ''[email protected]''; const KEY_FILE = ''f183b8caXXXXXXXXatekey.p12''; $client = new Google_Client(); $client->setApplicationName("XXXXXXXX Calendar Service"); if (isset($_SESSION[''token''])) { $client->setAccessToken($_SESSION[''token'']); } $key = file_get_contents(KEY_FILE); $client->setClientId(CLIENT_ID); $client->setAssertionCredentials(new Google_AssertionCredentials( SERVICE_ACCOUNT_NAME, array(''https://www.googleapis.com/auth/calendar''), $key, ''notasecret'', ''http://oauth.net/grant_type/jwt/1.0/bearer'', ''[email protected]'') ); $client->setClientId(CLIENT_ID); $cal = new Google_CalendarService($client); try{ $cal->events->quickAdd("[email protected]", "SERVICE TEST "); }catch(Exception $e){ print_r($e->getMessage()); } // We''re not done yet. Remember to update the cached access token. // Remember to replace $_SESSION with a real database or memcached. if ($client->getAccessToken()) { echo $_SESSION[''token''] = $client->getAccessToken(); }

¿Qué debo hacer para actualizar el calendario cuando el usuario no está conectado (siempre que el usuario haya dado permiso)? ¿Debo guardar el código de acceso cuando el usuario está conectado y usarlo más tarde cuando quiero ejecutar el lote?

Por cierto, ¿qué es el manejo de asociación?


De hecho, no es necesario que compartas el calendario con la cuenta de servicio. Lo que debe suceder es delegar la autoridad de todo el dominio a su cuenta de servicio.

La cuenta de servicio que creó ahora debe tener acceso a los datos de usuario del dominio de Google Apps a los que desea acceder.

Las siguientes tareas deben ser realizadas por un administrador del dominio de Google Apps: 1. Vaya al panel de control de su dominio de Google Apps. La URL debe tener el siguiente aspecto: https://www.google.com/a/cpanel/mydomain.com

  1. Vaya a Herramientas avanzadas ...> Administre el acceso de terceros al Cliente OAuth.

  2. En el campo Nombre del cliente, ingrese la ID del cliente de la cuenta de servicio.

  3. En el campo One or More API Scopes, ingrese la lista de ámbitos a los que se debe otorgar acceso a su aplicación. Por ejemplo, si necesita acceso de solo lectura en todo el dominio a la API de Google Calendar, ingrese: https://www.googleapis.com/auth/calendar.readonly

  4. Haga clic en el botón Autorizar.


Obtiene el error debido a que sus ámbitos no se mencionaron correctamente. En Google OAuth 2.0 Scope definido:

Indica el acceso a la API de Google que está solicitando su aplicación . Los valores pasados ​​en este parámetro informan la página de consentimiento mostrada al usuario. Existe una relación inversa entre el número de permisos solicitados y la probabilidad de obtener el consentimiento del usuario.

espacio delimitado conjunto de permisos solicitados por la aplicación

  • Para resolver el problema primero tiene que cambiar los parámetros del alcance

  • Incluir el alcance del calendario en él

  • A continuación, obtenga el token de acceso y luego intente cambiar las cosas

  • Luego haga los cambios según los requisitos y los pasos provistos en la documentación de la API