Quiero obtener el token de acceso de Google. La API de Google dice que para obtener el token de acceso, envíe el código y otros parámetros a la página de generación de tokens, y la respuesta será un objeto JSON como:
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
Sin embargo, no recibo el token de actualización. La respuesta en mi caso es:
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
gdata
gdata-api
access-token
Muhammad Usman
fuente
fuente
Respuestas:
La
refresh_token
única se proporciona en la primera autorización del usuario. Las autorizaciones posteriores, como el tipo que realiza al probar una integración de OAuth2, no volverán arefresh_token
aparecer. :)refresh_token
(siempre que también incluya el parámetro de consulta 'access_type = offline'.Alternativamente, puede agregar los parámetros de consulta
prompt=consent&access_type=offline
a la redirección de OAuth (consulte la página OAuth 2.0 de Google para aplicaciones de servidor web).Esto hará que el usuario vuelva a autorizar la aplicación y siempre devolverá a
refresh_token
.fuente
access_type=offline
en todos los casos cuando desee elrefresh_token
.$client->setAccessType('offline')
. Elfunction setApprovalPrompt()
ya está pasadoforce
, por defecto.Para obtener el token de actualización, debe agregar ambos
approval_prompt=force
y,access_type="offline"
si está utilizando el cliente java proporcionado por Google, se verá así:fuente
Busqué una larga noche y esto está funcionando:
User-example.php modificado de admin-sdk
luego obtienes el código en la URL de redireccionamiento y la autenticación con el código y obtienes el token de actualización
Deberías almacenarlo ahora;)
Cuando su clave de acceso agota el tiempo de espera
fuente
Esto me ha causado cierta confusión, así que pensé en compartir lo que aprendí de la manera difícil:
Cuando solicita acceso utilizando los parámetros
access_type=offline
yapproval_prompt=force
, debe recibir un token de acceso y un token de actualización . El token de acceso caduca poco después de recibirlo y deberá actualizarlo.Realizó correctamente la solicitud para obtener un nuevo token de acceso y recibió la respuesta que tiene su nuevo token de acceso . También estaba confundido por el hecho de que no recibí un nuevo token de actualización . Sin embargo, así es como debe ser, ya que puede usar el mismo token de actualización una y otra vez.
Creo que algunas de las otras respuestas suponen que quería obtener un nuevo token de actualización por alguna razón y sugirió que vuelva a autorizar al usuario, pero en realidad no es necesario, ya que el token de actualización que tiene funcionará hasta revocado por el usuario.
fuente
La respuesta de Rich Sutton finalmente funcionó para mí, después de darme cuenta de que la adición
access_type=offline
se realiza en la solicitud del cliente de front-end para un código de autorización, no en la solicitud de back-end que intercambia ese código por un access_token. Agregué un comentario a su respuesta y a este enlace en Google para obtener más información sobre cómo actualizar tokens.PD: si está utilizando Satellizer, aquí le mostramos cómo agregar esa opción al $ authProvider.google en AngularJS .
fuente
Para obtenerlo
refresh_token
, debe incluirloaccess_type=offline
en la URL de solicitud de OAuth. Cuando un usuario se autentica por primera vez, obtendrá un valor no válidorefresh_token
y unoaccess_token
que caduca.Si tiene una situación en la que un usuario puede volver a autenticar una cuenta para la que ya tiene un token de autenticación (como @SsjCosty menciona anteriormente), debe recuperar información de Google para qué cuenta es el token. Para hacer eso, agregue
profile
a sus ámbitos. Usando la gema OAuth2 Ruby, su solicitud final podría verse así:Tenga en cuenta que el alcance tiene dos entradas delimitadas por espacios, una para acceso de solo lectura a Google Analytics y la otra es justa
profile
, que es un estándar OpenID Connect.Esto dará como resultado que Google proporcione un atributo adicional llamado
id_token
en laget_token
respuesta. Para obtener información de id_token, consulte esta página en los documentos de Google. Hay un puñado de bibliotecas proporcionadas por Google que validarán y "decodificarán" esto por usted (utilicé la gema Ruby google-id-token ). Una vez que se analiza, elsub
parámetro es efectivamente el ID único de la cuenta de Google.Vale la pena señalar que si cambia el alcance, volverá a recibir un token de actualización para los usuarios que ya se han autenticado con el alcance original. Esto es útil si, por ejemplo, ya tiene un grupo de usuarios y no desea que todos anulen la autenticación de la aplicación en Google.
Ah, y una nota final: no es necesario
prompt=select_account
, pero es útil si tiene una situación en la que sus usuarios pueden querer autenticarse con más de una cuenta de Google (es decir, no está usando esto para iniciar sesión / autenticación) .fuente
1. ¿Cómo obtener 'refresh_token'?
Solución: la opción access_type = 'offline' se debe usar al generar authURL. fuente: Uso de OAuth 2.0 para aplicaciones de servidor web
2. Pero incluso con 'access_type = offline', ¿no obtengo el 'refresh_token'?
Solución: tenga en cuenta que lo obtendrá solo en la primera solicitud, por lo que si lo está almacenando en algún lugar y existe una disposición para sobrescribir esto en su código cuando obtenga un nuevo access_token después de que caduque el anterior, asegúrese de no sobrescribir este valor.
De Google Auth Doc: (este valor = tipo_acceso)
Si necesita 'refresh_token' nuevamente, debe eliminar el acceso a su aplicación siguiendo los pasos escritos en la respuesta de Rich Sutton .
fuente
Establecer esto hará que el token de actualización se envíe cada vez:
A continuación se muestra un ejemplo (php):
fuente
Para mí estaba probando
CalendarSampleServlet
proporcionado por Google. Después de 1 hora, se agota el tiempo de acceso y hay una redirección a una página 401. Probé todas las opciones anteriores pero no funcionaron. Finalmente, al verificar el código fuente de 'AbstractAuthorizationCodeServlet' , pude ver que la redirección se deshabilitaría si las credenciales están presentes, pero idealmente debería haberlo verificadorefresh token!=null
. Agregué el siguiente códigoCalendarSampleServlet
y funcionó después de eso. Gran alivio después de tantas horas de frustración. Gracias a Dios.fuente
ahora google había rechazado esos parámetros en mi solicitud (access_type, prompt) ... :( y no hay ningún botón "Revocar acceso" en absoluto. Estoy frustrado por haber recuperado mi refresh_token lol
ACTUALIZACIÓN: encontré la respuesta aquí: D puede recuperar el token de actualización mediante una solicitud https://developers.google.com/identity/protocols/OAuth2WebServer
fuente
fuente
Uso de acceso sin conexión y solicitud: el consentimiento me funcionó bien:
fuente
Mi solución fue un poco extraña ... probé todas las soluciones que encontré en Internet y nada. Sorprendentemente, esto funcionó: elimine credentials.json, actualice, vuelva a vincular su aplicación en su cuenta. El nuevo archivo credentials.json tendrá el token de actualización. Copia de seguridad de este archivo en alguna parte. Luego, siga usando su aplicación hasta que vuelva a aparecer el error del token de actualización. Elimine el archivo crendetials.json que ahora solo aparece con un mensaje de error (esto sucedió en mi caso), luego pegue su viejo archivo de credenciales en la carpeta, ¡listo! Ha pasado 1 semana desde que hice esto y no tuve más problemas.
fuente
Para obtener cada vez un nuevo refresh_token en la autenticación, el tipo de credenciales de OAuth 2.0 creadas en el panel debe ser "Otro". También, como se mencionó anteriormente, la opción access_type = 'offline' debe usarse al generar authURL.
Cuando utilice credenciales con el tipo "Aplicación web", no funcionará ninguna combinación de las variables prompt / license_prompt; de todos modos, obtendrá el refresh_token solo en la primera solicitud.
fuente