9

Google 클라이언트 코드를 사용하여 Google API에서 새로 고침 토큰을 얻으려고했습니다. 그것은 내가 서버 측에 보내는 코드를 반환합니다. 이제 서버 측에서 나는이 호출 구글-API-PHP 클라이언트를 사용하여 토큰 새로 고침을 얻기 위해 코드를 전송 및 액세스 토큰 을 사용하고 있습니다 : 내가 구글 놀이터에서 동일한 코드를 사용하지만Google API PHP 클라이언트 코드가 새로 고침 토큰을 반환하지 않습니다.

https://www.googleapis.com/oauth2/v4/token 

내가 얻을 뿐만 아니라 새로 고침 토큰으로 응답하지만 난이 내가 몇 가지 답변에서 언급 한 바와 같이 액세스 유형이 오프라인으로 설정 한 코드

public function getRefreshToken($code) 
{ 
    $client = new Google_Client(); 
    $client->setClientId(config('services.google.client_id')); 
    $client->setClientSecret(config('services.google.client_secret')); 
    $client->setRedirectUri('postmessage'); 
    $client->setScopes(config('services.google.scopes')); 
    $client->setAccessType("offline"); 
    $client->setApprovalPrompt("force"); 
    dd($client->authenticate($code)); 
    dd($client->getRefreshToken()); 
    return ; 
} 

하지만 여전히 나는 응답을 얻을 .. 내 자신의 서버에서 그것을 얻을하지 않습니다 새로 고침 토큰 ..이 응답은

입니다.
access_token :"xxxxxxxxxxxxxxxxxxxxxx" 
created:1510242052 
expires_in:3598 
id_token:"xxxxxxxx" 
token_type:"Bearer" 

답변

7

귀하의 PHP 코드는 나에게 잘 들립니다. 나는 당신의 프런트 엔드 자바 스크립트, 특히 그것이 빌드 구글에 대한 링크가 용의자가 될 수 있습니다 용의자. 사용시 authorization_code가 새로 고침 토큰을 생성하는지 여부는 부분적으로 Google에 대한 초기 링크에 포함 된 매개 변수에 따라 결정됩니다.

this answer에 자세히 설명 된대로 자바 스크립트 클라이언트 라이브러리는 "클라이언트 측 흐름"을 사용합니다. 일반적으로 프런트 엔드 앱에서는 response_type=token을 지정하지만 response_type=code을 지정하면 code이 다시 표시됩니다. 그러나 사용하면 code은 새로 고침 토큰을 생성하지 않습니다.

https://accounts.google.com/o/oauth2/v2/auth?client_id=7xxxxxxxxxxx-xxxxxxxxxxx.apps.googleusercontent.com&redirect_uri=http://localhost:8080/oauth2callback.php&response_type=code&scope=profile 

귀하의 백 엔드가 돌아 오는 code을 구속 할 수 있지만 응답은 새로 고침 토큰이 포함되지 않습니다 : 예를 들어

, a link built by a front end javascript library은 다음과 같이 나타납니다. 이는 의도적으로 설계된 동작입니다.

새로 고침 토큰을 사용할 수있는 을 얻는 한 가지 방법은 자바 스크립트 클라이언트 라이브러리가 아닌 링크를 빌드하는 데 백 엔드 PHP 클라이언트 라이브러리를 사용하는 것입니다.

https://accounts.google.com/o/oauth2/auth?response_type=code&access_type = 오프라인 & CLIENT_ID = 7xxxxxxxxxx-hxxxxxxxxxxxxxxxx.apps.googleusercontent.com & redirect_uri로 = HTTP % 3A % 2F % 2Flocalhost % 3A8080 % 2Foauth2callback.php & 상태 & 범위 : $client->createAuthUrl()이 같은 링크를 구축 할 것 = & approval_prompt =

This toy example 링크이 방법을 구축하고 새로 고침 토큰을받을 않는 힘을 프로필.

access_type=offineapproval_prompt=force을 추가합니다. 인증에 성공하면 리디렉션에 code이 포함되고 으로 바뀌며 사용하면 새로 고침 토큰을 제공합니다.

OAuth 2.0 놀이터는 access_type=offlineprompt=consent이 포함 된 초기 링크를 작성하며 새로 고침 토큰으로 사용할 수있는 코드도 생성합니다.

이 정보가 도움이되지 않는다면 프런트 엔드가 구축하고있는 Google에 대한 링크로 질문을 업데이트 할 수 있습니까?(클라이언트 ID가 수정 된 상태에서)

+0

"원래 매개 변수가 필요합니다"라는 오류가 발생했습니다. –

+0

새로 고침 토큰을 다시 받으시겠습니까? 언제이 오류가 발생합니까? 처음 Google에 갈 때? 'authenticate()'를 호출하면? 실제로 access_token을 사용하려고 할 때? 이 오류는 Maps API 오류처럼 들릴 수 있습니다 ... 그게 당신이 소비하려고하는 것입니까? –

+0

나는 여기에서 말할 두 가지가있다. 1. 먼저이 질문에 대해 현상금을 내야하는 이유는 무엇입니까? 아무도 아직이 질문에주의를 기울이지 않은 곳에서는 답변을하지 못했습니다. 2. GOOGLE DOCUMENTS에는 아무 것도 언급되어 있지 않습니다. 왜 이렇게이다 ? –