2012-03-26 26 views
7

Próbuję użyć interfejsu API Google YouTube Data z PHP na podstawie dokumentacji Google tutaj: https://developers.google.com/youtube/2.0/developers_guide_protocol_oauth2#OAuth2_Refreshing_a_Token. Mój problem pojawia się podczas uwierzytelniania za pomocą protokołu OAuth. Używam oczywiście następującego autoryzowanego adresu URL, który jest identyczny z tym, który mówią doktorzy, z wyjątkiem mojego przekierowania uri i klucza aplikacji.Google API API Odświeżanie tokena nie jest wysyłane

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

Potem, jak docs powiedzieć, ja Curl następujące:

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

Jednak nie moja odpowiedź daje mi refresh_token jak ich dokumentacja mówi, że powinno. Właśnie dostaję pozostałe trzy elementy odpowiedzi.

Niektóre pytania, takie jak ten: Get refresh token google api powiedziałem, że używają approval_prompt = force, ale to też nie działa i całkowicie niszczy cel posiadania access_type = offline.

Jakieś pomysły, dlaczego dostanę poprawną odpowiedź z 3 z 4 elementów odpowiedzi?

Odpowiedz

2

Możesz wypróbować google oauth2 playground (https://code.google.com/oauthplayground/) i zobaczyć, jakie są różnice między twoimi params i tam.

28

od części offline access z docs OAuth2.0:

Gdy aplikacja odbiera odświeżania żeton, to ważne, żeby zachować tokena odświeżania do wykorzystania w przyszłości. Jeśli twoja aplikacja utraci token odświeżania, będzie musiała ponownie poprosić użytkownika o zgodę na uzyskanie numeru przed uzyskaniem kolejnego tokena odświeżania. Jeśli potrzebujesz , aby ponownie poprosić użytkownika o zgodę, dodaj parametr approval_prompt do żądania kodu autoryzacji i ustaw wartość na force.

Więc, kiedy już uzyskali dostęp kolejne wnioski o grant_type z authorization_code nie zwróci refresh_token, nawet jeśli access_type została ustawiona offline w ciągu kwerendy strony zgody.

Jak stwierdzono w powyższym cytatem, w celu uzyskania nowyrefresh_token już po otrzymaniu jednego, trzeba będzie wysłać użytkownikowi powrót poprzez zachęty, które można zrobić poprzez ustawienie approval_prompt do force.

Cheers,

PS zmiana ta została ogłoszona w blog post również.

+1

Dzięki za rozwiązanie! – WHITECOLOR

+3

Ktoś akceptuje to jako odpowiedź! –

+1

Z korzyścią dla każdego, kto cierpi na moje własne zamieszanie, po uzyskaniu 'odświeżającego tokena 'nie musisz _refresh_ it too, ponieważ możesz używać tego samego w kółko. Jedyny przypadek, w którym powinieneś potrzebować nowego, to utrata lub anulowanie dostępu przez użytkownika. – jeteon

Powiązane problemy