Google에서 액세스 토큰을 가져오고 싶습니다. Google API에 따르면 액세스 토큰을 얻으려면 코드 및 기타 매개 변수를 토큰 생성 페이지로 보내면 응답은 다음과 같은 JSON 객체가됩니다.
{
"access_token" : "ya29.AHES6ZTtm7SuokEB-RGtbBty9IIlNiP9-eNMMQKtXdMP3sfjL1Fc",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/HKSmLFXzqP0leUihZp2xUt3-5wkU7Gmu2Os_eBnzw74"
}
그러나 새로 고침 토큰을받지 못했습니다. 내 경우의 응답은 다음과 같습니다
{
"access_token" : "ya29.sddsdsdsdsds_h9v_nF0IR7XcwDK8XFB2EbvtxmgvB-4oZ8oU",
"token_type" : "Bearer",
"expires_in" : 3600
}
답변
는 refresh_token
사용자 만으로부터 제 승인에 제공된다. OAuth2 통합을 테스트하는 동안 작성하는 종류와 같은 후속 인증은 refresh_token
다시 반환하지 않습니다 . 🙂
- https://myaccount.google.com/u/0/permissions 계정에 액세스 할 수있는 앱을 표시하는 페이지로 이동
하십시오 . - 타사 앱 메뉴에서 앱을 선택하십시오.
- 액세스 제거를 클릭 한 다음 확인을 클릭하여 확인하십시오.
- 다음 OAuth2 요청
refresh_token
은 ‘access_type = offline’쿼리 매개 변수를 포함하는 경우를 반환합니다 .
또는 쿼리 매개 변수 prompt=consent&access_type=offline
를 OAuth 리디렉션에 추가 할 수 있습니다 ( 웹 서버 응용 프로그램 용 Google OAuth 2.0 페이지 참조).
그러면 사용자에게 응용 프로그램을 다시 승인하라는 메시지가 표시되고 항상을 반환합니다 refresh_token
.
답변
당신이 모두를 추가해야 토큰 새로 고침을 얻기 위하여 approval_prompt=force
그리고 access_type="offline"
당신이 같이 표시됩니다 Google에서 제공하는 자바 클라이언트를 사용하는 경우 :
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
HTTP_TRANSPORT, JSON_FACTORY, getClientSecrets(), scopes)
.build();
AuthorizationCodeRequestUrl authorizationUrl =
flow.newAuthorizationUrl().setRedirectUri(callBackUrl)
.setApprovalPrompt("force")
.setAccessType("offline");
답변
나는 긴 밤을 수색했고 이것은 트릭을하고있다 :
admin-sdk의 수정 된 user-example.php
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$authUrl = $client->createAuthUrl();
echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
그런 다음 리디렉션 URL에서 코드를 얻고 코드로 인증하고 새로 고침 토큰을 얻습니다.
$client()->authenticate($_GET['code']);
echo $client()->getRefreshToken();
지금 저장해야합니다.)
액세스 키 시간이 초과되면
$client->refreshToken($theRefreshTokenYouHadStored);
답변
이로 인해 약간의 혼란이 생겨서 어려운 방법을 배우려고 온 것을 공유한다고 생각했습니다.
access_type=offline
및 approval_prompt=force
매개 변수를 사용하여 액세스를 요청 하면 액세스 토큰과 새로 고침 토큰을 모두 받아야합니다 . 액세스 당신이 그것을받을 당신이 그것을 새로 고침해야합니다 후 토큰 유효 기간이 곧 만료됩니다.
올바르게 새로운 얻을 수있는 요청을 만든 액세스 토큰을하고 새가 응답받은 액세스 토큰을. 또한 새로운 새로 고침 토큰을 얻지 못했다는 사실에 혼란 스러웠습니다 . 그러나 동일한 새로 고침 토큰을 반복해서 사용할 수 있기 때문에 이것이 의미하는 바입니다.
다른 답변 중 일부는 어떤 이유로 든 새로 고침 토큰 을 얻고 싶었고 사용자를 다시 인증한다고 제안했지만 실제로는 새로 고침 토큰을 사용할 때까지 필요하지 않습니다. 사용자가 취소했습니다.
답변
Rich Sutton의 답변은 마침내 그 코드를 access_token과 교환하는 백엔드 요청이 아닌 프론트 엔드 클라이언트의 인증 코드 요청 access_type=offline
에 추가되었다는 것을 알게 된 후에 저에게 효과적이었습니다. 토큰 새로 고침에 대한 자세한 내용을 보려면 그의 답변과 Google의이 링크에 의견을 추가했습니다 .
PS Satellizer를 사용하는 경우 AngularJS의 $ authProvider.google에 해당 옵션을 추가하는 방법이 있습니다 .
답변
를 얻으려면 OAuth 요청 URL refresh_token
에 포함해야합니다 access_type=offline
. 사용자를 인증 처음으로 당신은 비 무기 호를 다시 얻을 것이다 때 refresh_token
잘 한 access_token
만료.
사용자가 계정을 다시 인증 할 수있는 상황이있는 경우 (위의 @SsjCosty 언급과 같이) 이미 인증 토큰을 가지고있는 경우 토큰이있는 계정의 정보를 Google에서 가져와야합니다. 그렇게하려면 profile
범위에 추가 하십시오. OAuth2 Ruby gem을 사용하면 최종 요청은 다음과 같습니다.
client = OAuth2::Client.new(
ENV["GOOGLE_CLIENT_ID"],
ENV["GOOGLE_CLIENT_SECRET"],
authorize_url: "https://accounts.google.com/o/oauth2/auth",
token_url: "https://accounts.google.com/o/oauth2/token"
)
# Configure authorization url
client.authorize_url(
scope: "https://www.googleapis.com/auth/analytics.readonly profile",
redirect_uri: callback_url,
access_type: "offline",
prompt: "select_account"
)
범위에는 공백으로 구분 된 두 개의 항목이 있습니다. 하나는 Google Analytics에 대한 읽기 전용 액세스이고 다른 하나는 profile
OpenID Connect 표준입니다.
결과적으로 Google id_token
은 get_token
응답 에 추가 속성을 제공합니다 . id_token에서 정보를 얻으려면 Google 문서 에서이 페이지 를 확인하십시오 . 이를 위해이를 검증하고 “디코딩”하는 Google 제공 라이브러리가 몇 가지 있습니다 (Ruby google-id-token gem 사용 ). 구문 분석하면 sub
매개 변수는 사실상 고유 한 Google 계정 ID입니다.
주목할 점 은 범위 를 변경 하면 원래 범위로 이미 인증 된 사용자에 대해 새로 고침 토큰을 다시 받게됩니다. 예를 들어 이미 많은 사용자가 있고 Google에서 앱을 모두 인증 해제하지 않으려는 경우에 유용합니다.
아, 그리고 하나의 마지막 메모 : 필요 prompt=select_account
하지는 않지만 사용자가 둘 이상의 Google 계정으로 인증하려는 경우 (예 : 로그인 / 인증에 사용하지 않는 경우) 유용합니다 .
답변
1. ‘refresh_token’을 얻는 방법?
해결책 : authURL을 생성 할 때 access_type = ‘offline’옵션을 사용해야합니다. 출처 : 웹 서버 응용 프로그램에 OAuth 2.0 사용
2. 그러나 ‘access_type = offline’이 있어도 ‘refresh_token’을 얻지 못하고 있습니까?
솔루션 : 첫 번째 요청에서만이를 얻을 수 있으므로, 어딘가에 저장하고 이전 만료 후에 새 access_token을 가져올 때 코드에서이 값을 겹쳐 쓰는 조항이있는 경우이 값을 겹쳐 쓰지 않아야합니다.
Google 인증 문서에서 : (이 값 = access_type)
이 값은 애플리케이션에서 토큰의 인증 코드를 처음 교환 할 때 Google 인증 서버가 새로 고침 토큰과 액세스 토큰을 반환하도록 지시합니다.
‘refresh_token’이 다시 필요한 경우 Rich Sutton의 답변에 작성된 단계에 따라 앱에 대한 액세스 권한을 제거해야합니다 .