2012-01-20 30 views
61

No puedo obtener mi token de actualización con mi código. Sólo puedo conseguir mi token de acceso, tipo de token etc., he seguido algunos tutoriales como poner access_type = fuera de línea en mi nombre de urlObtener el token de actualización google api

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 en conseguir el acceso de ficha

$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.

+0

/* comprobar este acoplamiento que funciona para mí @Nobert solución */https://stackoverflow.com/questions/10827920/not-receiving-google-oauth-refresh-token –

Respuesta

88

se enteraron añadiendo esto a sus parámetros de URL

approval_prompt = fuerza

+10

¿Por qué no funciona con Auto? No quiero que los usuarios den cada vez permiso. ¿Cómo puedo superar esto? –

+5

Porque el token de reparación solo se devuelve la primera vez al otorgar el permiso de la aplicación. Después de eso, todas las solicitudes con 'approval_prompt = auto' ya no tienen una refresh_token. Consulte esta respuesta para obtener una explicación más detallada http://stackoverflow.com/a/10857806/987864 – Daan

+3

Necesita 'access_type = offline' en todos los casos cuando desea que refresh_token – Daan

52

Si se me permite ampliar user987361 's respuesta:

De la parte de los documentos offline access OAuth2.0:

Cuando su aplicación recibe un token de actualización, es importante almacenar ese token de actualización para su uso futuro. Si su aplicación pierde el token de actualización, tendrá que volver a solicitar el consentimiento del usuario antes de obtener otro token de actualización. Si necesita para volver a solicitar el consentimiento del usuario, incluya el parámetro approval_prompt en la solicitud de código de autorización y establezca el valor en force.

Así, cuando ya se ha concedido el acceso, solicitudes posteriores de un grant_type de authorization_code no devolverá el refresh_token, incluso si access_type se estableció en offline en la cadena de consulta de la página consentimiento.

Como se indica 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 su usuario de nuevo a través del sistema, lo que puede hacer mediante el establecimiento de approval_prompt a force.

Saludos,

PS Este cambio fue anunciado en un blog post también.

+2

. Añadiría que solo necesitaría obtener un ** nuevo ** 'token de actualización' si lo pierde o si su usuario cancela su acceso. De lo contrario, puedes seguir usando el mismo '' token de actualización'' para obtener nuevos 'token' de acceso. – jeteon

+1

Tengo un CMS en el que diferentes usuarios usan diferentes cuentas de Google para conectarse a la API de análisis. Sin embargo, a veces varios usuarios se pueden conectar utilizando la misma cuenta corporativa de Google, pero cada uno de ellos desea acceder a diferentes cuentas de Analytics. Solo el primero recibe el token de actualización, mientras que el resto no y, por lo tanto, tiene que volver a conectarse cada hora. ¿No hay una forma de obtener el MISMO token de actualización para las autenticaciones posteriores en lugar de simplemente access_token, que caduca dentro de una hora? – SsjCosty

+0

Sí. Solo hazlo. Cuando envíe la solicitud, recibirá un token de acceso y el token de actualización. – bossylobster

12

Es access_type=offline que desee.

Esto devolverá el token de actualización la primera vez que el usuario autorice la aplicación. Las llamadas subsiguientes no lo obligan a volver a aprobar la aplicación (approval_prompt=force).

Ver más detalle: https://developers.google.com/accounts/docs/OAuth2WebServer#offline

+0

Esa página enlazada indica que el cliente de Google se ocupará de renovar el token de acceso cuando caduque (el token de renovación se encuentra presumiblemente en el archivo XML de secretos), pero no muestra cómo se detectaría que el token de acceso haya cambiado para que se puede guardar en la aplicación para el próximo acceso. ¿Existe una devolución de llamada para esto, o una aplicación debería siempre verificar si el token de acceso ha cambiado en el * * acceso remoto que realiza? – Jason

5

Hola he seguido los pasos siguientes y que había sido capaz de obtener el token de actualización.

El flujo de autorización tiene dos pasos.

  1. Es obtener el código de autorización utilizando https://accounts.google.com/o/oauth2/auth? URL.

    Para eso se envía una solicitud de correo que proporciona los siguientes parámetros. 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline' Si se proporciona arriba, recibirá un código de autorización.

  2. Recuperando AcessToken y RefreshToken usando https://accounts.google.com/o/oauth2/token? URL. Para eso, se envía una solicitud posterior que proporciona los siguientes parámetros.

    "código": código, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "authorization_code",

Así que 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 quiere el token nuevamente, revoque el acceso en su aplicación.

Esperamos que esto ayude a alguien :) aplausos

+0

gracias ayuda :) – tkr

8

Este es el código completo en PHP a través de Google SDK oficial

$client = new Google_Client(); 
## some need parameter 
$client->setApplicationName('your application name'); 
$client->setClientId('****************'); 
$client->setClientSecret('************'); 
$client->setRedirectUri('http://your.website.tld/complete/url2redirect'); 
$client->setScopes('https://www.googleapis.com/auth/userinfo.email'); 
## these two lines is important to get refresh token from google api 
$client->setAccessType('offline'); 
$client->setApprovalPrompt('force'); # this line is important when you revoke permission from your app, it will prompt google approval dialogue box forcefully to user to grant offline access 
+0

@Mr_Green gracias –

3

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.

Así que puedes obtener referh_token en algunos escenarios, no en todos.

puede tener el contenido en https://developers.google.com/identity/protocols/OAuth2WebServer#offline .

0

Para nuestra aplicación tuvimos que usar estos dos parámetros access_type=offline&prompt=consent. approval_prompt=forceno funcionó para nosotros

Cuestiones relacionadas