GoogleAuthUtil 및 Plus.API에서 이전

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

액세스 토큰 안티패턴에서 이전

GoogleAuthUtil.getToken으로 획득한 액세스 토큰을 다음 주소로 전송해서는 안 됩니다. 백엔드 서버를 ID 어설션으로 사용하는 것이 좋습니다. 토큰이 백엔드로 발급되어 삽입에 취약하다는 것을 알 수 있습니다. 암호화할 수 있습니다

예를 들어 Android 코드가 아래 예와 같다면 최신 권장사항으로 앱을 이전하세요.

Android 코드

이 예시에서 액세스 토큰 요청은 oauth2:과 범위 문자열을 GoogleAuthUtil.getToken 호출을 위한 scope 매개변수 (oauth2:https://www.googleapis.com/auth/plus.login)

인증 기관을 통해 획득한 액세스 토큰으로 인증하는 대신 GoogleAuthUtil.getToken: ID 토큰 흐름 또는 인증 코드 흐름을 사용합니다.

ID 토큰 흐름으로 이전

사용자 ID, 이메일 주소, 이름 또는 프로필 사진 URL만 필요한 경우 ID 토큰 흐름을 따릅니다.

ID 토큰 흐름으로 이전하려면 다음과 같이 변경합니다.

Android 클라이언트 측

  • GET_ACCOUNTS (연락처) 권한 요청 시 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()에서 Auth.GOOGLE_SIGN_IN_API(으)로 GoogleSignInOptions.Builder.requestIdToken(...) 구성

서버 측

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

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

서버가 Google Drive, YouTube, 연락처의 경우 서버 인증 코드 흐름을 사용합니다.

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

Android 클라이언트 측

  • GET_ACCOUNTS (연락처) 권한 요청 시 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()에서 Auth.GOOGLE_SIGN_IN_API(으)로 GoogleSignInOptions.Builder.requestServerAuthCode(...) 구성

서버 측

  • 서버 인증 코드 흐름의 새 엔드포인트 만들기
  • 클라이언트 앱이 마이그레이션된 후 이전 엔드포인트 사용 중지

이전 엔드포인트와 새 엔드포인트 간에 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 코드가 다음 예와 같다면 migrate:

Android 코드

이 예시에서 ID 토큰 요청은 audience:server:client_id과 ‘scope’ 매개변수로 웹 서버의 클라이언트 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()에서 Auth.GOOGLE_SIGN_IN_API(으)로 GoogleSignInOptions.Builder.requestIdToken(...) 구성

서버 측

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

이전 프로세스 중에 서버가 두 가지 URL 모두에서 이전 및 새 Android 클라이언트를 지원합니다. 토큰의 두 형식을 모두 확인하려면 사용하는 클라이언트 라이브러리에 해당하는 변경사항 (사용하는 경우):

  • 자바 (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 코드가 다음 예와 같다면 migrate:

Android 코드

이 예에서 서버 인증 코드 요청은 oauth2:server:client_id + 다음과 같이 웹 서버의 클라이언트 ID를 scope 매개변수로 전달합니다. 통화 GoogleAuthUtil.getToken건 (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

새로운 Sign-In API 인증 코드 흐름에는 다음과 같은 이점이 있습니다.

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

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

Android 클라이언트 측

  • GET_ACCOUNTS (연락처) 권한 요청 시 삭제
  • GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() 또는 AccountManager.newChooseAccountIntent()에서 Auth.GOOGLE_SIGN_IN_API(으)로 GoogleSignInOptions.Builder.requestServerAuthCode(...) 구성

서버 측

현재 코드를 유지하되 https://oauth2.googleapis.com/token를 지정 를 토큰 서버 엔드포인트로 GoogleAuthorizationCodeTokenRequest 객체 덕분에 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);
...
드림