No puedo obtener mi token de actualización con mi código. Solo puedo obtener mi token de acceso, tipo de token, etc.He seguido algunos tutoriales, como poner access_type=offline
mi URL de inicio de sesión:
echo "<a href='https://accounts.google.com/o/oauth2/auth?"
. "access_type=offline&client_id=123345555.apps.googleusercontent.com& "
. "scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/plus.me&response_type=code& "
. "redirect_uri=http://www.sample.com/sample.php&state=/profile'>Google</a>";
y mis campos para obtener el token de acceso:
$fields=array(
'code'=> urlencode($authcode),
'client_id'=> urlencode($clientid),
'client_secret'=> urlencode($clientsecret),
'redirect_uri'=> urlencode($redirecturi),
'grant_type'=> 'authorization_code',
);
pero no puedo obtener refresh_token , solo access_token , token_type , id_token y expires_in .
google-calendar-api
token
access-token
gdata
Robin Carlo Catacutan
fuente
fuente
Respuestas:
Descubrí agregando esto a tus parámetros de URL
aprobación_prompt = forzarActualizar:
Úselo en su
access_type=offline&prompt=consent
lugar.approval_prompt=force
ya no funciona https://github.com/googleapis/oauth2client/issues/453fuente
approval_prompt=auto
ya no tienen un refresh_token. Consulte esta respuesta para obtener una explicación más detallada stackoverflow.com/a/10857806/987864access_type=offline
en todos los casos cuando desee el refresh_tokenprompt=consent
. Referencia: developers.google.com/identity/protocols/…access_type=offline&prompt=consent
. De lo contrario, elrefresh_token
no estará presente.Si puedo ampliar la respuesta del usuario987361 :
Desde la parte de acceso sin conexión de los documentos de OAuth2.0:
Por lo tanto, cuando ya haya otorgado acceso, las solicitudes posteriores
grant_type
deauthorization_code
a no devolverán elrefresh_token
, incluso siaccess_type
se estableció enoffline
en la cadena de consulta de la página de consentimiento.Como se señala en la cita anterior, con el fin de obtener una nueva
refresh_token
después de que ya están recibiendo una, tendrá que enviar a la espalda del usuario a través del sistema, lo que puede hacer mediante el establecimientoapproval_prompt
deforce
.Salud,
PD: Este cambio también se anunció en una publicación de blog .
fuente
refresh token
si lo pierde o si su usuario revoca su acceso. De lo contrario, puede seguir usando el mismorefresh token
para obtener nuevos correosaccess token
electrónicos.Es lo
access_type=offline
que quieres.Esto devolverá el token de actualización la primera vez que el usuario autorice la aplicación. Las llamadas posteriores no le obligan a volver a aprobar la aplicación (
approval_prompt=force
).Ver más detalles: https://developers.google.com/accounts/docs/OAuth2WebServer#offline
fuente
Este es un código completo en PHP usando el SDK oficial de Google
fuente
Para nuestra aplicación, tuvimos que usar ambos parámetros
access_type=offline&prompt=consent
.approval_prompt=force
no funcionó para nosotrosfuente
approval_prompt=force
, probablemente eran correctas en ese momento, pero ya no funcionan. Hay algo de discusión aquí: github.com/google/oauth2client/issues/453Hola, seguí los siguientes pasos y pude obtener el token de actualización.
El flujo de autorización tiene dos pasos.
Consiste en obtener el código de autorización mediante
https://accounts.google.com/o/oauth2/auth?
URL.Para eso, se envía una solicitud de publicación que proporciona los siguientes parámetros.
'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'
Proporcionar lo anterior recibirá un código de autorización.Recuperando AcessToken y RefreshToken usando
https://accounts.google.com/o/oauth2/token?
URL. Para eso, se envía una solicitud de publicación que proporciona los siguientes parámetros."código": código, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "código_autorización",
Entonces, en su primer intento, una vez que autorice los permisos, podrá obtener el token de actualización. Los intentos posteriores no proporcionarán el token de actualización. Si desea el token nuevamente, revoque el acceso en su aplicación.
Espero que esto ayude a alguien a aplaudir :)
fuente
OAuth tiene dos escenarios en modo real. El estilo de acceso normal y predeterminado se llama en línea. En algunos casos, su aplicación puede necesitar acceder a una API de Google cuando el usuario no está presente, es escenarios fuera de línea. Se obtiene un token de actualización en escenarios fuera de línea durante el primer intercambio de código de autorización.
Para que pueda obtener referh_token en algunos escenarios, no en todos.
puede tener el contenido en https://developers.google.com/identity/protocols/OAuth2WebServer#offline .
fuente
Desde marzo de 2016, utilícelo
prompt=consent
para regenerar el token de actualización de la API de Google.Como se menciona en https://github.com/googleapis/oauth2client/issues/453 ,
fuente
Para aquellos que usan la biblioteca cliente de la API de Google para PHP y buscan acceso sin conexión y tokens de actualización, tengan cuidado al momento de escribir este artículo, los documentos muestran ejemplos incorrectos.
actualmente está mostrando:
fuente: https://developers.google.com/identity/protocols/OAuth2WebServer#offline
Todo esto funciona muy bien, excepto UNA pieza
Después de un poco de razonamiento, cambié esta línea a la siguiente y TODO FUNCIONÓ
Tiene sentido, ya que al usar las solicitudes HTTP, se cambió de Approved_prompt = force a prompt = consent . Entonces, cambiar el método de establecimiento de setApprovalPrompt a setPrompt sigue la convención natural, ¡PERO NO ESTÁ EN LOS DOCUMENTOS! Eso lo encontré al menos.
fuente