google api - how - Comportamiento extraño de token OAuth2.0(credenciales no válidas 401)
https www googleapis com oauth2 v3 token (7)
Por lo general, el mecanismo de Google OAuth2.0 funciona de maravilla.
- El usuario confirma el permiso para acceder a la cuenta de Google con los ámbitos seleccionados.
- El token de actualización se recupera y guarda en un almacenamiento prolongado.
- Cada vez que se necesita (si el token de acceso caducó) el token de acceso se recupera y se usa para acceder a las API.
Pero a veces (hasta el momento solo dos veces durante más de 6 meses) he experimentado un comportamiento extraño:
Las solicitudes a las API de Google devuelven el error Credenciales no válidas (401). Actualizar el token de acceso (utilizando el token de actualización almacenado) no ayuda.
Aquí hay algunos resultados estructurados que tengo cuando pruebo este problema:
+ ------------------------------------------------------------------------- + | 1.TRYING TO REFRESH THE TOKEN. | | 2.DONE REFRESHING THE TOKEN. | + ------------------------------------------------------------------------- + | access: **************************************************** | | refresh: ********************************************* | | expires: 3600 | | created: 2013-07-23 13:12:36 | + ------------------------------------------------------------------------- +
También intenté verificar el token de acceso "nuevo" enviando solicitudes a https://www.googleapis.com/oauth2/v1/tokeninfo
+ ------------------------------------------------------------------------- + | 1. TRYING TO CHECK THE TOKEN . | | 2. DONE CHECKING THE TOKEN THE TOKEN. | + ------------------------------------------------------------------------- + | issued_to: ************.apps.googleusercontent.com | | audience: ************.apps.googleusercontent.com | | user_id: ************ | | expires_in: 3600 | | email: **********@gmail.com | | verified_email: 1 | | access_type: offline | | scopes:: | + ------------------------------------------------------------------------- + | https://www.googleapis.com/auth/userinfo.email | | https://www.googleapis.com/auth/userinfo.profile | | https://www.googleapis.com/auth/plus.me | | https://www.googleapis.com/auth/drive | + ------------------------------------------------------------------------- +
Pero cuando intento acceder a la alimentación de la unidad, la respuesta es:
Error calling GET https://www.googleapis.com/drive/v2/files (401) Invalid Credentials domain: global reason: authError message: Invalid Credentials locationType: header location: Authorization
También experimentamos el mismo problema con los calendarios. Asi que:
- Token era válido antes (todo funcionó).
- La ficha de actualización todavía funciona.
- Solicitar un feed responde con el error "Credenciales no válidas".
- Todos los otros tokens siguen funcionando bien, lo que significa que el código es válido.
Normalmente, cuando se revoca el token, se devuelve el error "invalid_grant" cuando se intenta actualizar el token.
Preguntas
- ¿Cuál puede ser el motivo de este comportamiento? Si el token de actualización fue revocado o no es válido de alguna otra manera, ¿la solicitud de token de acceso nuevo produce un error?
- ¿Hay alguna forma de validar el token de actualización?
Según los documentos de la API de Google sobre errores y códigos de error:
https://developers.google.com/drive/handle-errors#401_invalid_credentials
401: Invalid Credentials
Invalid authorization header. The access token you''re using is either expired or invalid.
error: {
errors: [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization",
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Esto concuerda exactamente con su versión del error, y probablemente sea lo que Google cree que está mal con su solicitud.
Pero, como bien sabe, las solicitudes de la API de Google pueden arrojar errores que son claramente inútiles para diagnosticar realmente el problema. Obtuve errores de "Credenciales no válidas" por varias razones. Casi siempre es porque realicé algún tipo de cambio que pensé que no importaría, pero realmente lo hace.
Mi primer pensamiento (rodado en la oscuridad aquí) sería ir a la consola API de Google:
https://code.google.com/apis/console
El verificador de tokens de autenticación de Google ( https://www.googleapis.com/oauth2/v1/tokeninfo ) puede devolver una respuesta válida, pero tal vez se haya cambiado el secreto del cliente o la identificación del cliente.
Incluso pequeños cambios en el cuerpo de la respuesta también pueden causar este error.
No sé cómo se realizan las solicitudes, ya sea mediante llamadas REST o una lib cliente, pero utilizo el ruby lib, que permite una interfaz de línea de comandos para hacer llamadas a la API. He encontrado que este y el campo de juegos OAuth2 son muy útiles para diagnosticar las llamadas a la API de Google.
Solo un FYI: solo he recibido 2 errores de la API de Google: "Credenciales no válidas" y "Permisos insuficientes". El último casi siempre tiene que ver con malos alcances. El primero es casi todo lo demás.
También diría que si solo has experimentado 2 errores en 6 meses, ¡tienes suerte!
Recientemente experimenté este extraño error. Mi solución: pongo la función que desacopla todas las sesiones antes de redireccionar a AuthUrl .
Tuve este problema cuando intenté experimentar cambiando la URL de redirección en la consola de Google y luego actualicé mi archivo de credenciales json en el servidor. Tuve que borrar las variables de sesión antes de comenzar de nuevo. Entonces, en su proyecto, solo haga esto una vez:
session_start(); //starts a session
session_unset(); //flushes out all the contents previously set
Recuerde eliminar el session_unset()
después de ejecutarlo en seco una vez.
Estoy en entorno de desarrollo. También tuve este problema.
Primero intenté actualizar las credenciales. Sin resultados. Luego eliminé mi aplicación (ya que todavía estoy en el entorno de desarrollo, estuvo bien, pero TENGA CUIDADO CON ESTA ACCIÓN si ya está usando esto en producción), creó una nueva, actualizó las credenciales JSON en el cliente. .sin embargo, no hay resultado.
Lo resolví abriendo una nueva instancia del navegador que no estaba registrada en mi cuenta de Google (Navegación privada, ya que estoy en Firefox), inicié sesión en mi cuenta de Google una vez más y traté de usar mi cliente (que es una aplicación web) ) Me redireccionaron a la pantalla de autorización como se esperaba y después de eso, funcionó bien para mí.
Recibí (401) Invalid Credentials
cuando eliminé el acceso a mi cuenta de Google para la aplicación en particular. Entonces, lo que tenía que hacer era solicitar la URL de autorización (la que comienza con https://accounts.google.com/o/oauth2/auth
), nuevamente.
Me encontré con este mismo problema cuando necesité cambiar mis ámbitos de Solo lectura a Leer y escribir todos los archivos. Por lo tanto, actualicé mis ámbitos desde la parte superior de mi archivo desde Solo lectura a:
// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/sheets.googleapis.com-nodejs-quickstart.json
var SCOPES = [''https://www.googleapis.com/auth/drive''];
Google, a partir de su guía de API, tiene estos comentarios que dicen que cada vez que cambie de ámbito, debe actualizar las credenciales. Creo que esto significa, aunque no estoy seguro, que el token debe actualizarse. El antiguo token todavía está en manos de Google y creía que solo tenía acceso de solo lectura, por lo que devolvería un error 401. Por lo tanto, necesito volver a crear mi token, pero Google nunca me ofreció una nueva pantalla de consentimiento que me permitiera decir permitir leer y escribir en todos los archivos. Por lo tanto, necesitaba que la pantalla volviera a aparecer, por lo que crearía un token nuevo para reemplazar el antiguo:
fs.readFile(TOKEN_PATH, function(err, token) {
if (err) {
getNewToken(oauth2Client, callback);
} else {
getNewToken(oauth2Client, callback);
// oauth2Client.credentials = JSON.parse(token);
// callback(oauth2Client);
}
});
Como ya tenía una ficha guardada, nunca creé una nueva. Por lo tanto, acabo de comentar el uso del antiguo token y le dije que obtuviera un token nuevo, no importa si tenemos uno o no. Luego, fui a mis aplicaciones conectadas en Google y borré mi credencial de conexión anterior. No estoy seguro de si este paso es necesario, pero solo estoy intentando acceder a mi cuenta personal. Luego, cuando ejecuté mi programa, me impulsó a volver a autenticarme, y todo funcionó y no recibí un error de autenticación. Una vez hecho esto, asegúrese de eliminar las líneas comentadas para usar tokens ya hechos. Estaba usando el archivo de la API de Google quickstart.js para todo esto.
Por lo tanto, cuando actualicé mis ámbitos, el token antiguo todavía estaba usando el ámbito de Solo lectura, por lo tanto obtendría (401) credenciales no válidas.
Resolví este problema cuando eliminé archivos json en c: / Users / [usuario] /. Credenciales.