2012-03-26 12 views
7

Ich versuche, das Google YouTube-Daten-API mit PHP auf der Grundlage der Dokumentation von Google zu verwenden: https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token. Mein Problem tritt bei der Authentifizierung mit OAuth auf. Ich benutze die folgende Autorisierungs-URL, die identisch ist mit der, die die Dokumente sagen, außer für meine Redirect-URL und den Anwendungsschlüssel.Google YouTube API-Aktualisierungstoken wird nicht gesendet

$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'; 

Dann, als die docs sagen, locke ich folgendes:

$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' 
     ); 

aber meine Antwort gibt mir nie eine refresh_token wie ihre Dokumentation sagt es sollte. Ich bekomme nur die anderen drei Antwortelemente.

Einige Fragen wie diese: Get refresh token google api haben gesagt, um approval_prompt = force zu verwenden, aber das funktioniert auch nicht und vollständig widerlegt den Zweck von access_type = offline.

Irgendwelche Ideen, warum ich eine gültige Antwort mit 3 der 4 Antwortelemente erhalten würde?

Antwort

2

Sie können google oauth2 playground ausprobieren (https://code.google.com/oauthplayground/) und sehen, welche Unterschiede zwischen Ihren Params und dort bestehen.

28

Vom offline access Teil der OAuth2.0 docs:

Wenn Ihre Anwendung empfängt ein Aktualisierungs-Token, ist es wichtig, dass die Aktualisierungs-Token für die zukünftige Verwendung zu speichern. Wenn Ihre Anwendung das Aktualisierungstoken verliert, muss sie den Benutzer erneut zur Bestätigung auffordern, bevor ein anderes Aktualisierungstoken abgerufen wird. Wenn Sie benötigen, um den Benutzer erneut zur Zustimmung aufzufordern, fügen Sie den Parameter approval_prompt in die Autorisierungscodeanforderung ein, und legen Sie den Wert auf force fest.

Also, wenn Sie bereits Zugriff gewährt haben, nachfolgende Anforderungen für ein grant_type von authorization_code die refresh_token nicht zurück, auch wenn access_type-offline in Query-String der Zustimmung Seite festgelegt wurde.

Wie oben im Angebot angegeben, um eine neuerefresh_token, nachdem sie bereits die Aufnahme eines zu erhalten, müssen Sie Ihre Benutzer zurück durch die Aufforderung senden, die Sie, indem Sie approval_prompt-force tun können.

Cheers,

PS Diese Änderung wurde in einem blog post auch angekündigt.

+1

Danke für die Lösung! – WHITECOLOR

+3

Jemand akzeptiert dies als die Antwort! –

+1

Zum Vorteil für alle anderen, die meine eigene Verwirrung erleiden, müssen Sie, sobald Sie ein'Erfrischungs-Token 'erhalten, es nicht mehr _refresh_, da Sie dasselbe immer und immer wieder verwenden können. Die einzige Zeit, in der Sie eine neue benötigen, ist, wenn Sie sie verlieren oder der Benutzer Ihren Zugriff widerruft. – jeteon

Verwandte Themen