2012-03-26 21 views
7

Estoy intentando utilizar la API de datos de YouTube de Google con PHP según la documentación de Google aquí: https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token. Mi problema aparece cuando se autentica con OAuth. Estoy usando la siguiente URL de autorización, que es idéntica a la que dicen los documentos para usar, excepto para mi URL de redireccionamiento y la clave de la aplicación, obviamente.Token de actualización de API de Google YouTube no enviado

$this->authorizationUrl = 'https://accounts.google.com/o/oauth2/auth?'; 
$this->authorizationUrl .= 'client_id=' . $this->applicationKey . '&'; 
$this->authorizationUrl .= 'redirect_uri=' . $this->redirect_uri . '/account.php?action=youtube_oauth&'; 
$this->authorizationUrl .= 'scope=https://gdata.youtube.com&'; 
$this->authorizationUrl .= 'response_type=code&'; 
$this->authorizationUrl .= 'access_type=offline'; 

Entonces, como dicen los documentos que, Encrespo lo siguiente:

$curl_options = Array(
      CURLOPT_POSTFIELDS => Array(
       'code' => $code, 
       'client_id' => $this->applicationKey, 
       'client_secret' => $this->applicationSecret, 
       'redirect_uri' => $this->redirect_uri . '/account.php?action=youtube_oauth', 
       'grant_type' => 'authorization_code' 
      ), 
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token' 
     ); 

Sin embargo, mi respuesta nunca me da una refresh_token como su documentación dice que debería. Acabo de obtener los otros tres elementos de respuesta.

Algunas preguntas como esta: Get refresh token google api han dicho que use approval_prompt = force, pero eso tampoco funciona y es totalmente contrario al propósito de tener access_type = offline.

¿Alguna idea de por qué recibiría una respuesta válida con 3 de los 4 elementos de respuesta?

Respuesta

2

Puede probar google oauth2 playground (https://code.google.com/oauthplayground/) y ver cuáles son las diferencias entre sus params y allí.

28

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

Cuando la aplicación recibe un token de actualización, es importante almacenar que 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 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.

+1

¡Gracias por la solución! – WHITECOLOR

+3

¡Alguien acepta esto como la respuesta! –

+1

Para el beneficio de que alguien más sufra mi propia confusión, una vez que obtenga un 'refresh token' no necesita _refresh_ también, ya que puede usar el mismo una y otra vez. La única vez que debería necesitar una nueva es si la pierde o el usuario revoca su acceso. – jeteon

Cuestiones relacionadas