developer tip

새로 고침 토큰 받기 Google API

copycodes 2020. 10. 28. 08:13
반응형

새로 고침 토큰 받기 Google API


내 코드로 새로 고침 토큰을 얻을 수 없습니다. 액세스 토큰, 토큰 유형 등 만 가져올 수 있으며 access_type=offline로그인 URL을 입력하는 것과 같은 몇 가지 자습서를 따랐습니다 .

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>";

액세스 토큰을 얻는 내 필드 :

$fields=array(
    'code'=>  urlencode($authcode),
    'client_id'=> urlencode($clientid),
    'client_secret'=> urlencode($clientsecret),
    'redirect_uri'=> urlencode($redirecturi),
    'grant_type'=> 'authorization_code',
);

하지만 나는 refresh_token , access_token , token_type , id_tokenexpires_in얻을 수 없습니다 .


이것을 URL 매개 변수에 추가하여 알아 냈습니다.

Approval_prompt = force


user987361 의 답변을 확장 할 수 있다면 :

OAuth2.0 문서 오프라인 액세스 부분에서 :

애플리케이션이 새로 고침 토큰을 수신하면 나중에 사용할 수 있도록 해당 새로 고침 토큰을 저장하는 것이 중요합니다. 애플리케이션이 새로 고침 토큰을 잃어버린 경우 다른 새로 고침 토큰을 얻기 전에 사용자에게 동의를 요청하는 메시지를 다시 표시해야합니다. 사용자에게 동의를 요청하는 메시지를 다시 표시해야하는 경우 approval_prompt인증 코드 요청에 매개 변수를 포함 하고 값을로 설정합니다 force.

따라서 이미 액세스 권한을 부여한 경우 동의 페이지의 쿼리 문자열에 로 설정되어 있어도 grant_type후속 요청은를 authorization_code반환하지 않습니다 .refresh_tokenaccess_typeoffline

위의 견적에서 언급했듯이 이미받은 후 새 항목 을 얻으려면 refresh_token프롬프트를 통해 사용자를 다시 보내야합니다 .이 작업은로 설정 approval_prompt하여 수행 할 수 있습니다 force.

건배,

PS이 변경 사항은 블로그 게시물 에서도 발표되었습니다 .


그것은이다 access_type=offline당신이 원하는 것을.

이렇게하면 사용자가 앱을 처음 승인 할 때 새로 고침 토큰이 반환됩니다. 후속 호출로 인해 앱 ( approval_prompt=force) 을 다시 승인해야하는 것은 아닙니다 .

자세한 내용보기 : https://developers.google.com/accounts/docs/OAuth2WebServer#offline


이것은 Google 공식 SDK를 사용하는 PHP의 완전한 코드입니다.

$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

앱의 경우이 두 매개 변수를 모두 사용해야했습니다 access_type=offline&prompt=consent. 우리를 위해 approval_prompt=force 일하지 않았다


안녕하세요 저는 다음 단계를 따랐고 새로 고침 토큰을 얻을 수있었습니다.

승인 절차에는 두 단계가 있습니다.

  1. https://accounts.google.com/o/oauth2/auth?URL을 사용하여 인증 코드를 얻는 것 입니다.

    이를 위해 다음 매개 변수를 제공하는 게시 요청이 전송됩니다. 'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'위의 정보를 제공하면 인증 코드를 받게됩니다.

  2. https://accounts.google.com/o/oauth2/token?URL을 사용하여 AcessToken 및 RefreshToken 검색 . 이를 위해 다음 매개 변수를 제공하는 게시 요청이 전송됩니다.

    "code": 코드, "client_id": CID, "client_secret": CSECRET, "redirect_uri": REDIRECT, "grant_type": "authorization_code",

따라서 권한을 승인하면 첫 번째 시도에서 새로 고침 토큰을 얻을 수 있습니다. 후속 시도는 새로 고침 토큰을 제공하지 않습니다. 토큰을 다시 원하면 응용 프로그램에서 액세스 권한을 취소하십시오.

누군가가 응원하는 데 도움이되기를 바랍니다. :)


OAuth has two scenarios in real mode. The normal and default style of access is called online. In some cases, your application may need to access a Google API when the user is not present,It's offline scenarios . a refresh token is obtained in offline scenarios during the first authorization code exchange.

So you can get refersh_token is some scenarios ,not all.

you can have the content in https://developers.google.com/identity/protocols/OAuth2WebServer#offline .


Since March 2016, use prompt=consent to regenerate Google API refresh token.

As mentioned in https://github.com/googleapis/oauth2client/issues/453,

approval_prompt=force has been replaced with prompt=none|consent|select_account

참고URL : https://stackoverflow.com/questions/8942340/get-refresh-token-google-api

반응형