웹용 Google 로그인 자바스크립트 플랫폼 라이브러리가 지원 중단됩니다. 지원 중단 날짜인 2023년 3월 31일 이후에는 이 라이브러리를 다운로드할 수 없습니다. 대신 새로운 용 Google ID 서비스를 사용하세요.
새로 생성된 클라이언트 ID는 기본적으로 이전 플랫폼 라이브러리를 사용하지 못하도록 차단되며, 기존 클라이언트 ID는 영향을 받지 않습니다. 2022년 7월 29일 이전에 생성된 새 클라이언트 ID는 Google 플랫폼 라이브러리를 사용하도록 `plugin_name`을 설정할 수 있습니다.

GoogleAuthUtil 및 Plus.API에서 이전

이전에 GoogleAuthUtil.getToken 또는 Plus.API를 사용하여 Google 로그인과 통합한 경우, 보안 강화 및 더 나은 사용자 환경을 위해 최신 Sign-In API로 이전해야 합니다.

액세스 토큰 안티패턴에서 마이그레이션

토큰이 백엔드에 발행되었는지를 쉽게 확인할 수 없어 공격자가 액세스 토큰 삽입에 취약해질 수 있으므로 GoogleAuthUtil.getToken로 가져온 액세스 토큰을 ID 어설션으로 백엔드 서버로 전송해서는 안 됩니다.

예를 들어 Android 코드가 아래 예와 같은 경우 앱을 현재 권장사항으로 이전해야 합니다.

Android 코드

이 예에서 액세스 토큰 요청은 oauth2:와 범위 문자열을 GoogleAuthUtil.getToken 호출(oauth2:https://www.googleapis.com/auth/plus.login)의 scope 매개변수로 사용합니다.

GoogleAuthUtil.getToken로 획득한 액세스 토큰으로 인증하는 대신 ID 토큰 흐름이나 인증 코드 흐름을 사용합니다.

ID 토큰 흐름으로 이전

사용자 ID, 이메일 주소, 이름 또는 프로필 사진 URL만 있으면 ID 토큰 흐름을 사용할 수 있습니다.

ID 토큰 흐름으로 이전하려면 다음 사항을 변경합니다.

Android 클라이언트 측

  • GET_ACCOUNTS 요청 (연락처) 권한 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()을 사용하여 코드를 GoogleSignInOptions.Builder.requestIdToken(...) 구성으로 Auth.GOOGLE_SIGN_IN_API으로 전환합니다.

서버 측

  • ID 토큰 인증을 위한 새 엔드포인트 만들기
  • 클라이언트 앱이 이전된 후 이전 엔드포인트 사용 중지

서버 인증 코드 흐름으로 이전

서버에서 Google Drive, YouTube, 주소록과 같은 다른 Google API에 액세스해야 하는 경우 서버 인증 코드 흐름을 사용합니다.

서버 인증 코드 흐름으로 이전하려면 다음과 같이 변경합니다.

Android 클라이언트 측

  • GET_ACCOUNTS 요청 (연락처) 권한 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()을 사용하여 코드를 GoogleSignInOptions.Builder.requestServerAuthCode(...) 구성으로 Auth.GOOGLE_SIGN_IN_API으로 전환합니다.

서버 측

  • 서버 인증 코드 흐름에 대한 새 엔드포인트를 만듭니다.
  • 클라이언트 앱이 이전된 후 이전 엔드포인트 사용 중지

이전 엔드포인트와 새 엔드포인트 간에 API 액세스 로직을 계속 공유할 수 있습니다. 예:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

GoogleAuthUtil ID 토큰 흐름에서 이전

GoogleAuthUtil를 사용하여 ID 토큰을 가져오는 경우 새로운 Sign-In API ID 토큰 흐름으로 이전해야 합니다.

예를 들어 Android 코드가 다음 예와 같다면 이전해야 합니다.

Android 코드

이 예에서 ID 토큰 요청에서는 audience:server:client_id와 웹 서버의 클라이언트 ID를 GoogleAuthUtil.getToken 호출(audience:server:client_id:9414861317621.apps.googleusercontent.com)의 '범위' 매개변수로 사용합니다.

새로운 Sign-In API ID 토큰 흐름에는 다음과 같은 이점이 있습니다.

  • 간소화된 원탭 로그인 환경
  • 서버에서 추가 네트워크 호출 없이 사용자 프로필 정보를 가져올 수 있음

ID 토큰 흐름으로 이전하려면 다음 사항을 변경합니다.

Android 클라이언트 측

  • GET_ACCOUNTS 요청(연락처) 권한 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()을 사용하여 코드를 GoogleSignInOptions.Builder.requestIdToken(...) 구성으로 Auth.GOOGLE_SIGN_IN_API으로 전환합니다.

서버 측

새로운 Sign-In API는 지원 중단된 형식을 사용하는 GoogleAuthUtil.getToken과 달리 OpenID Connect 사양을 준수하는 ID 토큰을 발급합니다. 특히 발급기관은 이제 https 스키마가 있는 https://accounts.google.com입니다.

이전 프로세스 중에 서버는 이전 Android 클라이언트 및 새 Android 클라이언트 모두의 ID 토큰을 확인해야 합니다. 토큰의 두 형식을 모두 확인하려면 사용하는 클라이언트 라이브러리에 맞게 변경하세요.

  • 자바 (Google API 클라이언트 라이브러리): 1.21.0 이상으로 업그레이드
  • PHP (Google API 클라이언트 라이브러리): v1을 사용하는 경우 1.1.6 이상으로 업그레이드하고 v2를 사용하는 경우 2.0.0-RC1 이상으로 업그레이드
  • Node.js: 0.9.7 이상으로 업그레이드
  • Python 또는 자체 구현: 두 발급자 모두 허용: https://accounts.google.comaccounts.google.com

GoogleAuthUtil 서버 인증 코드 흐름에서 이전

GoogleAuthUtil를 사용하여 서버 인증 코드를 가져오는 경우 새로운 Sign-In API 인증 코드 흐름으로 마이그레이션해야 합니다.

예를 들어 Android 코드가 다음 예와 같다면 이전해야 합니다.

Android 코드

이 예에서 서버 인증 코드 요청은 oauth2:server:client_id + 웹 서버의 클라이언트 ID를 GoogleAuthUtil.getToken 호출 (oauth2:server:client_id:9414861317621.apps.googleusercontent.com)의 scope 매개변수로 사용합니다.

새로운 Sign-In API 인증 코드 흐름은 다음과 같은 이점을 제공합니다.

  • 간소화된 원탭 로그인 환경
  • 아래 이전 가이드를 따르면 인증 코드 교환을 수행할 때 서버에서 사용자 프로필 정보가 포함된 ID 토큰을 가져올 수 있습니다.

새 인증 코드 흐름으로 이전하려면 다음과 같이 변경합니다.

Android 클라이언트 측

  • GET_ACCOUNTS 요청(연락처) 권한 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()을 사용하여 코드를 GoogleSignInOptions.Builder.requestServerAuthCode(...) 구성으로 Auth.GOOGLE_SIGN_IN_API으로 전환합니다.

서버 측

현재 코드를 그대로 유지하되 GoogleAuthorizationCodeTokenRequest 객체를 구성할 때 https://oauth2.googleapis.com/token를 토큰 서버 엔드포인트로 지정하여 다른 네트워크 호출 없이도 사용자의 이메일, 사용자 ID, 프로필 정보가 포함된 ID 토큰을 가져올 수 있습니다. 이 엔드포인트는 이전 버전과 완전히 호환되며, 이전 코드와 새 Android 클라이언트 구현 모두에서 가져온 서버 인증 코드에 아래 코드가 작동합니다.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...