php - por - oauth2 api
No se puede actualizar el token OAuth2 en PHP, no vĂ¡lido (3)
Necesito hacer un script PHP que cree un evento sigle en Google Calendar. No tuve problemas para configurar la identificación del cliente, el secreto del cliente, la clave dev y la creación de un nuevo evento.
Mi único problema es con OAuth2, en particular, necesito hacer una conexión permanente y no quiero hacer la autenticación cada vez que ejecuto el script.
En realidad, con este script puedo obtener un token y un token de actualización, pero cada hora mi token caduca y no sé cómo actualizarlo. ¿Cómo puedo editar este código para hacer eso? ¿Puedo guardar el token y el token de actualización en algún lugar y siempre usar la misma información?
Obtengo una excepción no detectada ''Google_AuthException'' con el mensaje ''Error al actualizar el token OAuth2, mensaje:'' {"error": "invalid_grant"
Ya he leído algunas otras publicaciones sobre este tema aquí en stackoverflow, pero todavía no he encontrado una solución ...: /
<?php
require_once ''src/Google_Client.php'';
require_once ''src/contrib/Google_CalendarService.php'';
session_start();
$client = new Google_Client();
$client->setApplicationName("Calendar App");
$client->setClientId(''xxxx'');
$client->setClientSecret(''yyy'');
$client->setRedirectUri(''http://www.zzzzzz'');
$client->setDeveloperKey(''kkk'');
$client->setAccessType(''offline'');
$cal = new Google_CalendarService($client);
if (isset($_GET[''logout''])) {
unset($_SESSION[''token'']);
}
if (isset($_GET[''code''])) {
$client->authenticate($_GET[''code'']);
$_SESSION[''token''] = $client->getAccessToken();
header(''Location: http://'' . $_SERVER[''HTTP_HOST''] . $_SERVER[''PHP_SELF'']);
}
if (isset($_SESSION[''token''])) {
//echo $_SESSION[''token''];
//$client->setAccessToken($_SESSION[''token'']);
$authObj = json_decode($_SESSION[''token'']);
$accessToken = $authObj->access_token;
$refreshToken = $authObj->refresh_token;
$tokenType = $authObj->token_type;
$expiresIn = $authObj->expires_in;
echo ''access_token = '' . $accessToken;
echo ''<br />'';
echo ''refresh_token = '' . $refreshToken;
echo ''<br />'';
echo ''token_type = '' . $tokenType;
echo ''<br />'';
echo ''expires_in = '' . $expiresIn;
}
if(!empty($cookie)){
$client->refreshToken($this->Cookie->read(''token''));
}
if ($client->getAccessToken()) {
$calList = $cal->calendarList->listCalendarList();
$_SESSION[''token''] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
print "<a class=''login'' href=''$authUrl''>Connect Me!</a>";
}
// Creation of a single event
$event = new Google_Event();
$event->setSummary($event_name);
$event->setLocation('''');
....
?>
¡Muchas gracias por su ayuda!
Recibí este error antes porque estaba tratando de autenticar dos veces.
Como tienes esta línea:
if (isset($_GET[''code'']))
Intentará autenticarse cuando el código esté en la cadena de consulta independientemente de si ya está autenticado. Intente comprobar si el token SESSION está presente antes de intentar (re) autenticar.
Intente eliminar setDeveloperKey (), esto me causaba algunos problemas y parece innecesario.
Esta página https://developers.google.com/accounts/docs/OAuth2WebServer#offline explica cómo funciona el token de actualización y cómo usarlo para obtener un token de acceso nuevo usando http sin procesar.
De esta pregunta ¿Cómo actualizar el token con el cliente API de Google? aquí está el equivalente php
here is the snippet to set token, before that make sure the access type should be set to offline
if (isset($_GET[''code''])) {
$client->authenticate();
$_SESSION[''access_token''] = $client->getAccessToken();
}
To refresh token
$google_token= json_decode($_SESSION[''access_token'']);
$client->refreshToken($google_token->refresh_token);
this will refresh your token, you have to update it in session for that you can do
$_SESSION[''access_token'']= $client->getAccessToken()
DEBUGGING Siga estos tres pasos para depurar cualquier aplicación oauth
Asegúrate de haber leído https://developers.google.com/accounts/docs/OAuth2 y también la subpágina adecuada (aplicación web, javascript, etc.) según el sabor de oauth que estés usando. No vas a ir muy lejos al depurar tu aplicación si no entiendes lo que está haciendo.
Usa Oauth Playground en https://developers.google.com/oauthplayground/ para recorrer los pasos de Oauth y finalmente realizar una llamada a la API de Google. Esto confirmará su comprensión y le mostrará cómo son las llamadas y respuestas http
Utilice el seguimiento / registro / proxy, etc. para rastrear el tráfico http real de su aplicación. Compare esto con lo que observó en el paso 2. Esto debería mostrarle dónde radica el problema.