새로 고침 토큰 받기 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_token 및 expires_in 만 얻을 수 없습니다 .
이것을 URL 매개 변수에 추가하여 알아 냈습니다.
Approval_prompt = force
user987361 의 답변을 확장 할 수 있다면 :
OAuth2.0 문서 의 오프라인 액세스 부분에서 :
애플리케이션이 새로 고침 토큰을 수신하면 나중에 사용할 수 있도록 해당 새로 고침 토큰을 저장하는 것이 중요합니다. 애플리케이션이 새로 고침 토큰을 잃어버린 경우 다른 새로 고침 토큰을 얻기 전에 사용자에게 동의를 요청하는 메시지를 다시 표시해야합니다. 사용자에게 동의를 요청하는 메시지를 다시 표시해야하는 경우
approval_prompt
인증 코드 요청에 매개 변수를 포함 하고 값을로 설정합니다force
.
따라서 이미 액세스 권한을 부여한 경우 동의 페이지의 쿼리 문자열에 로 설정되어 있어도 grant_type
의 후속 요청은를 authorization_code
반환하지 않습니다 .refresh_token
access_type
offline
위의 견적에서 언급했듯이 이미받은 후 새 항목 을 얻으려면 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
일하지 않았다
안녕하세요 저는 다음 단계를 따랐고 새로 고침 토큰을 얻을 수있었습니다.
승인 절차에는 두 단계가 있습니다.
https://accounts.google.com/o/oauth2/auth?
URL을 사용하여 인증 코드를 얻는 것 입니다.이를 위해 다음 매개 변수를 제공하는 게시 요청이 전송됩니다.
'scope=' + SCOPE + '&client_id=' + CLIENTID + '&redirect_uri=' + REDIRECT + '&response_type=' + TYPE + '&access_type=offline'
위의 정보를 제공하면 인증 코드를 받게됩니다.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
'developer tip' 카테고리의 다른 글
지도에 대한 나만의 비교기를 어떻게 만들 수 있습니까? (0) | 2020.10.29 |
---|---|
PHP로 PDF 파일 병합 (0) | 2020.10.28 |
텍스트 영역 HTML 태그의 한 줄씩 읽는 방법 (0) | 2020.10.28 |
파이썬 주석에서 긴 URL의 형식을 지정하고 여전히 PEP8을 준수해야합니다. (0) | 2020.10.28 |
모든 메소드를 가상으로 표시해야합니까? (0) | 2020.10.28 |