[gdata] Google OAuth 새로 고침 토큰을받지 못함

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다시 반환하지 않습니다 . 🙂

  1. https://myaccount.google.com/u/0/permissions 계정에 액세스 할 수있는 앱을 표시하는 페이지로 이동
    하십시오 .
  2. 타사 앱 메뉴에서 앱을 선택하십시오.
  3. 액세스 제거를 클릭 한 다음 확인을 클릭하여 확인하십시오.
  4. 다음 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=offlineapproval_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에 대한 읽기 전용 액세스이고 다른 하나는 profileOpenID Connect 표준입니다.

결과적으로 Google id_tokenget_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의 답변에 작성된 단계에 따라 앱에 대한 액세스 권한을 제거해야합니다 .