Sigo recibiendo un invalid_grant
error al intentar obtener un token oAuth de Google para conectarme a la API de sus contactos. Toda la información es correcta y he comprobado esto por triplicado, de modo que me quedé perplejo.
¿Alguien sabe qué puede estar causando este problema? He intentado configurar una identificación de cliente diferente para él, pero obtengo el mismo resultado, he intentado conectar muchas formas diferentes, incluido intentar la autenticación forzada, pero sigue siendo el mismo resultado.
google-api
André Figueira
fuente
fuente
Respuestas:
Me encontré con este problema cuando no solicité explícitamente acceso "sin conexión" al enviar al usuario a OAuth "¿Quieres darle permiso a esta aplicación para tocar tus cosas?" página.
Asegúrese de especificar access_type = offline en su solicitud.
Detalles aquí: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
(Además: creo que Google agregó esta restricción a fines de 2011. Si tiene tokens antiguos de antes, deberá enviar a sus usuarios a la página de permisos para autorizar el uso sin conexión).
fuente
access_type
enoffline
, este error todavía ocurre.Me encontré con este mismo problema a pesar de especificar "sin conexión"
access_type
en mi solicitud según la respuesta de bonkydog. En pocas palabras, descubrí que la solución descrita aquí funcionó para mí:https://groups.google.com/forum/#!topic/google-analytics-data-export-api/4uNaJtquxCs
En esencia, cuando agrega un cliente OAuth2 en la consola de su API de Google, Google le dará un "ID de cliente" y una "dirección de correo electrónico" (suponiendo que seleccione "aplicación web" como su tipo de cliente). Y a pesar de las convenciones de nomenclatura engañosas de Google, esperan que envíe la "Dirección de correo electrónico" como valor del
client_id
parámetro cuando acceda a sus API de OAuth2.Esto se aplica al llamar a estas dos URL:
Tenga en cuenta que la llamada a la primera URL se realizará correctamente si la llama con su "ID de cliente" en lugar de su "Dirección de correo electrónico". Sin embargo, el uso del código devuelto por esa solicitud no funcionará al intentar obtener un token de portador de la segunda URL. En su lugar, obtendrá un 'Error 400' y un mensaje "invalid_grant".
fuente
Aunque esta es una pregunta antigua, parece que muchos todavía la encuentran: pasamos días y días rastreando esto nosotros mismos.
En la especificación OAuth2, "invalid_grant" es una especie de catch-all para todos los errores relacionados con tokens no válidos / caducados / revocados (token de autorización o actualización).
Para nosotros, el problema era doble:
El usuario ha revocado activamente el acceso a nuestra aplicación
Tiene sentido, pero obtén esto: 12 horas después de la revocación, Google deja de enviar el mensaje de error en su respuesta:
“error_description” : “Token has been revoked.”
Es bastante engañoso porque asumirá que el mensaje de error está ahí en todo momento, lo que no es el caso. Puede verificar si su aplicación todavía tiene acceso en la página de permisos de aplicaciones .
El usuario restableció / recuperó su contraseña de Google
En diciembre de 2015, Google cambió su comportamiento predeterminado para que los restablecimientos de contraseña para usuarios que no son de Google Apps revoquen automáticamente todos los tokens de actualización de aplicaciones del usuario. En la revocación, el mensaje de error sigue la misma regla que en el caso anterior, por lo que solo obtendrá la "descripción_error" en las primeras 12 horas. No parece haber ninguna forma de saber si el usuario revocó el acceso manualmente (intencionalmente) o si sucedió debido a un restablecimiento de contraseña (efecto secundario).
Aparte de eso, hay una gran cantidad de otras causas potenciales que podrían desencadenar el error:
He escrito un artículo breve que resume cada elemento con algunas pautas de depuración para ayudar a encontrar al culpable. Espero eso ayude.
fuente
Encontré el mismo problema. Para mí, arreglé esto usando la dirección de correo electrónico (la cadena que termina con ... @ developer.gserviceaccount.com) en lugar de la ID de cliente para el valor del parámetro client_id. El nombre establecido por Google es confuso aquí.
fuente
Mi problema fue que usé esta URL:
Cuando debería haber usado esta URL:
Se estaba probando una cuenta de servicio que quería acceso sin conexión al motor de almacenamiento .
fuente
Tuve el mismo mensaje de error 'invalid_grant' y fue porque el authResult ['code'] enviado desde el lado del cliente javascript no se recibió correctamente en el servidor.
Intente devolverlo desde el servidor para ver si es correcto y no una cadena vacía.
fuente
si está utilizando la biblioteca de escritura, simplemente configure el modo fuera de línea, como bonkydog sugirió aquí está el código:
https://github.com/codolutions/scribe-java/
fuente
Usando un clientId de Android (sin client_secret) recibía la siguiente respuesta de error:
No puedo encontrar ninguna documentación para el campo 'code_verifier' pero descubrí que si lo configura en valores iguales tanto en la autorización como en las solicitudes de token, eliminará este error. No estoy seguro de cuál debería ser el valor deseado o si debería ser seguro. Tiene una longitud mínima (16? Caracteres) pero encontré que la configuración
null
también funciona.Estoy usando AppAuth para la solicitud de autorización en mi cliente de Android que tiene una
setCodeVerifier()
función.Aquí hay una solicitud de token de ejemplo en el nodo:
Probé y esto funciona con ambos
https://www.googleapis.com/oauth2/v4/token
yhttps://accounts.google.com/o/oauth2/token
.Si está usando en su
GoogleAuthorizationCodeTokenRequest
lugar:fuente
Esta es una respuesta tonta, pero el problema para mí fue que no me di cuenta de que ya me habían emitido un token de oAuth activo para mi usuario de Google que no logré almacenar. La solución en este caso es ir a la consola api y restablecer el secreto del cliente.
Hay muchas otras respuestas en SO a este efecto, por ejemplo, Restablecer el secreto del cliente OAuth2: ¿los clientes necesitan volver a otorgar acceso?
fuente
Es posible que deba eliminar una respuesta de OAuth obsoleta o no válida.
Crédito: la muestra de node.js google oauth2 dejó de funcionar invalid_grant
Nota : Una respuesta de OAuth también dejará de ser válida si se cambia la contraseña utilizada en la autorización inicial.
Si está en un entorno bash, puede utilizar lo siguiente para eliminar la respuesta obsoleta:
rm /Users/<username>/.credentials/<authorization.json>
fuente
Hay dos razones principales para el error invalid_grant que debe tener en cuenta antes de la solicitud POST de Refresh Token y Access Token.
RFC 6749 OAuth 2.0 definió invalid_grant como: La concesión de autorización proporcionada (por ejemplo, el código de autorización, las credenciales del propietario del recurso) o el token de actualización no es válido, ha caducado, se ha revocado, no coincide con el URI de redireccionamiento utilizado en la solicitud de autorización o se envió a otro cliente. .
Encontré otro buen artículo, aquí encontrarás muchas otras razones para este error.
https://blog.timekit.io/google-oauth-invalid-grant-nightmare-and-how-to-fix-it-9f4efaf1da35
fuente
en este sitio console.developers.google.com
esta placa de consola seleccione su proyecto ingrese la url de juramento. la URL de devolución de llamada de oauth redirigirá cuando el éxito de oauth
fuente
Después de considerar y probar todas las otras formas aquí, así es como resolví el problema en nodejs con el
googleapis
módulo junto con elrequest
módulo, que usé para buscar los tokens en lugar delgetToken()
método proporcionado :Simplemente uso
request
para hacer la solicitud de API a través de HTTP como se describe aquí: https://developers.google.com/identity/protocols/OAuth2WebServer#offlinefuente
Intente cambiar su URL para solicitar
fuente
Para futuras personas ... Leí muchos artículos y blogs, pero tuve suerte con la solución a continuación ...
Este blog describe diferentes casos en los que aparece el error "invalid_grant".
¡¡¡Disfrutar!!!
fuente
para mí, tuve que asegurarme de que
redirect_uri
coincida exactamente con el de la consola del desarrolladorAuthorised redirect URIs
, eso lo solucionó para mí, pude depurar y saber cuál era exactamente el problema después de cambiar dehttps://accounts.google.com/o/oauth2/token
ahttps://www.googleapis.com/oauth2/v4/token
Tengo un error adecuado:
fuente
Tuve este problema después de habilitar una nueva API de servicio en la consola de Google e intentar usar las credenciales creadas anteriormente.
Para solucionar el problema, tuve que volver a la página de credenciales, hacer clic en el nombre de la credencial y hacer clic en "Guardar" nuevamente . Después de eso, pude autenticarme sin problemas.
fuente
En mi caso, el problema estaba en mi código. Por error, intenté iniciar el cliente 2 veces con los mismos tokens. Si ninguna de las respuestas anteriores ayudó, asegúrese de no generar 2 instancias del cliente.
Mi código antes de la corrección:
tan pronto como lo cambie a (use solo una instancia):
solucionó mis problemas con el tipo de subvención.
fuente
Para mí, el problema fue que tenía varios clientes en mi proyecto y estoy bastante seguro de que esto está perfectamente bien, pero eliminé todos los clientes para ese proyecto y creé uno nuevo y todos comenzaron a trabajar para mí (obtuve esta idea para la ayuda del complemento WP_SMTP foro de soporte) No puedo encontrar ese enlace como referencia
fuente
Si está desinfectando la entrada del usuario (por ejemplo,
$_GET["code"]
en php), asegúrese de no reemplazar accidentalmente algo en el código.La expresión regular que estoy usando es ahora
/[^A-Za-z0-9\/-]/
fuente
Mira este https://dev.to/risafj/beginner-s-guide-to-oauth-understanding-access-tokens-and-authorization-codes-2988
Primero necesitas un access_token:
Guarde el token de acceso, el token de actualización y el expire_in en una base de datos. El token de acceso expira después de $ expires_in segundos. De lo que necesita obtener un nuevo token de acceso (y guardarlo en la base de datos) con la siguiente solicitud:
Recuerde agregar el dominio redirect_uri a sus dominios en su consola de Google: https://console.cloud.google.com/apis/credentials en la pestaña "OAuth 2.0-Client-IDs". Allí también encontrará su Client-ID y Client-Secret.
fuente
Existe un tiempo de espera no documentado entre la primera vez que redirige al usuario a la página de autenticación de Google (y obtiene un código) y cuando toma el código devuelto y lo publica en la URL del token. Funciona bien para mí con el client_id proporcionado por Google real en lugar de una "dirección de correo electrónico no documentada". Solo necesitaba comenzar el proceso nuevamente.
fuente
Si está probando esto en cartero / insomnio y solo está tratando de que funcione, pista: el código de autenticación del servidor (parámetro de código) solo es bueno una vez. Lo que significa que si rellena cualquiera de los otros parámetros en la solicitud y obtiene un 400, deberá usar un nuevo código de autenticación del servidor o simplemente obtendrá otros 400.
fuente