Acceso sin conexión a PHP de la API de Google, "invalid_grant: el código ya se ha canjeado"
oauth google-api (1)
Hay tres tipos de códigos o tokens Googles Authentcation servidor devuelve.
- Código de autenticación
- Token de acceso
- Actualizar token.
Código de autenticación
Cuando un usuario hace clic en el formulario de autenticación y otorga acceso a su aplicación. Google te devuelve un código de autenticación. Debe tomar este código e intercambiarlo por un token de acceso y un token de actualización. Este código solo se usa una vez; si lo intentas y lo usas nuevamente, recibirás un mensaje de error.
invalid_grant: el código ya fue canjeado.
Token de acceso
Los tokens de acceso se utilizan para acceder a las API, este token debe enviarse junto con cada solicitud que realice. Los tokens de acceso son de corta duración, trabajan durante una hora y luego dejan de funcionar.
Actualizar token
Los tokens de actualización deben guardarse en su servidor en algún lugar. Una vez que el token de acceso caduque, puede usar el token de actualización para obtener un nuevo token de acceso.
Su problema es que está guardando el código de autenticación que no le es útil. Necesitas encontrar el token de actualización y guardarlo.
¿Cómo autorizar a un cliente de Google de forma permanente hasta que el usuario revoque la autorización?
Estoy intentando crear una aplicación que se conecte a Google Calendar. Tiene que ejecutarse en PHP y, por lo tanto, estoy usando el cliente PHP API de Google proporcionado por Google.
La aplicación debe tener acceso sin conexión para que funcione cuando el usuario no está en la sesión. La aplicación está destinada a permitir que el usuario administre y muestre sus calendarios públicamente en sitios web y demás.
He creado credenciales en la Consola de Google, utilizando el método de servicio (con un ID de cliente y un secreto de cliente). Usando el cliente de la API de Google también solicité la autorización del usuario. Abro una nueva ventana del navegador, el usuario autoriza, Google devuelve un código de autorización. Tomo este código, lo almaceno y lo uso para autorizar al cliente, que se conecta con éxito al calendario de Google e intercambia datos.
Ahora, entendí que este es un token que va a caducar. A menos que uno use el acceso sin conexión, que establezco. Sin embargo, después de unos minutos o menos, siempre obtendré un error: Error fetching OAuth2 access token, message: ''invalid_grant: Code was already redeemed.
Este es el código que utilizo para conectar al cliente:
$client = new /Google_Client();
$client->setApplicationName( ''My App'' );
$client->setScopes( array( /Google_Service_Calendar::CALENDAR ) );
$client->setClientId( $this->google_client_id );
$client->setClientSecret( $this->google_client_secret );
$client->setRedirectUri( $this->google_client_redirect );
$client->setAccessType( ''offline'' );
if ( $code = $this->google_client_auth ) {
try {
$client->authenticate( $code );
} catch( /Exception $e ) {
var_dump( $e );
}
}
return new /Google_Service_Calendar( $client );
Este es un método dentro de una clase.
La ID del cliente y el secreto del cliente se almacenan en la configuración de la aplicación.
También estoy almacenando el código devuelto por el usuario en una configuración, pero creo que aquí es donde lo estoy haciendo mal. Estoy poniendo el enlace a una ventana de Google OAuth en un método separado (que también usa la misma ID de cliente y secreto y también establece el método fuera de línea). Y para obtener la autorización está funcionando. Puedo acceder a los calendarios. Simplemente no dura mucho ...