Миграция с GoogleAuthUtil и Plus.API

Если вы раньше интегрировались со входом в Google с помощью GoogleAuthUtil.getToken или Plus.API , вам следует перейти на новейший API входа в систему, чтобы повысить безопасность и улучшить взаимодействие с пользователем.

Миграция из анти-шаблона токена доступа

Вам не следует отправлять токены доступа, полученные с помощью GoogleAuthUtil.getToken на свой внутренний сервер в качестве подтверждения личности, поскольку вы не можете легко проверить, что токен был выдан вашему внутреннему серверу, что делает вас уязвимыми для вставки токена доступа со стороны злоумышленника.

Например, если ваш код Android выглядит так, как показано ниже, вам следует перенести свое приложение в соответствии с текущими рекомендациями.

Android-код

В этом примере запросы маркера доступа используют oauth2: плюс строку области в качестве параметра scope для вызова GoogleAuthUtil.getToken ( oauth2:https://www.googleapis.com/auth/plus.login ).

Вместо аутентификации с помощью токена доступа, полученного с помощью GoogleAuthUtil.getToken , используйте либо поток токена идентификатора, либо поток кода аутентификации.

Переход на поток токенов идентификатора

Если все, что вам нужно, это идентификатор пользователя, адрес электронной почты, имя или URL-адрес изображения профиля, используйте поток токена идентификатора .

Чтобы перейти на поток токенов идентификатора, внесите следующие изменения:

Клиентская часть Android

  • Удалите разрешение GET_ACCOUNTS (Контакты), если вы его запросите.
  • Переключите любой код с помощью GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() или AccountManager.newChooseAccountIntent() на Auth.GOOGLE_SIGN_IN_API с конфигурацией GoogleSignInOptions.Builder.requestIdToken(...) .

Серверная часть

Перейдите на поток кода аутентификации сервера.

Если вашему серверу требуется доступ к другим API Google, таким как 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.

Если вы используете GoogleAuthUtil для получения токенов идентификатора, вам следует перейти на новый поток токенов идентификатора API входа в систему.

Например, если ваш код Android выглядит так, как показано в следующем примере, вам следует выполнить миграцию:

Android-код

В этом примере запросы токена идентификатора используют audience:server:client_id плюс идентификатор клиента для вашего веб-сервера в качестве параметра области для вызова GoogleAuthUtil.getToken ( audience:server:client_id:9414861317621.apps.googleusercontent.com ).

Новый поток токенов идентификатора API входа в систему имеет следующие преимущества:

  • Упрощенный вход в систему одним касанием
  • Ваш сервер может получать информацию о профиле пользователя без дополнительного сетевого вызова.

Чтобы перейти на поток токенов идентификатора, внесите следующие изменения:

Клиентская часть Android

  • Удалите разрешение GET_ACCOUNTS (Контакты), если вы его запросите.
  • Переключите любой код с помощью GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() или AccountManager.newChooseAccountIntent() на Auth.GOOGLE_SIGN_IN_API с конфигурацией GoogleSignInOptions.Builder.requestIdToken(...) .

Серверная часть

Новый API входа выдает токены идентификатора, соответствующие спецификации OpenID Connect, в отличие от GoogleAuthUtil.getToken , который использует устаревший формат. В частности, эмитентом теперь является https://accounts.google.com со схемой https .

Во время процесса миграции вашему серверу необходимо проверить токен идентификатора как у старого, так и у нового клиента Android. Чтобы проверить оба формата токена, внесите изменения, соответствующие используемой вами клиентской библиотеке (если вы ее используете):

  • Java (клиентские библиотеки API Google): обновите до версии 1.21.0 или новее.
  • PHP (клиентские библиотеки API Google): если вы используете версию 1, обновите ее до версии 1.1.6 или новее; если вы используете версию 2, обновите ее до 2.0.0-RC1 или новее.
  • Node.js: обновите до 0.9.7 или новее.
  • Python или ваши собственные реализации: примите обоих этих эмитентов: https://accounts.google.com и accounts.google.com

Миграция из потока кода аутентификации сервера GoogleAuthUtil.

Если вы используете GoogleAuthUtil для получения кода аутентификации сервера, вам следует перейти на новый поток кода аутентификации API входа в систему.

Например, если ваш код Android выглядит так, как показано в следующем примере, вам следует выполнить миграцию:

Android-код

В этом примере запросы кода аутентификации сервера используют oauth2:server:client_id + идентификатор клиента вашего веб-сервера в качестве параметра scope для вызова GoogleAuthUtil.getToken ( oauth2:server:client_id:9414861317621.apps.googleusercontent.com ).

Новый поток кода аутентификации API входа в систему имеет следующие преимущества:

  • Упрощенный вход в систему одним касанием
  • Если вы будете следовать приведенному ниже руководству по миграции, ваш сервер сможет получить токен идентификатора, содержащий информацию профиля пользователя, когда вы выполняете обмен кодом аутентификации.

Чтобы перейти на новый поток кода аутентификации, внесите следующие изменения:

Клиентская часть Android

  • Удалите разрешение GET_ACCOUNTS (Контакты), если вы его запросите.
  • Переключите любой код с помощью GoogleAuthUtil , Plus.API , AccountPicker.newChooseAccountIntent() или AccountManager.newChooseAccountIntent() на Auth.GOOGLE_SIGN_IN_API с конфигурацией GoogleSignInOptions.Builder.requestServerAuthCode(...) .

Серверная часть

Сохраните текущий код, но укажите https://oauth2.googleapis.com/token в качестве конечной точки сервера токенов при создании объекта GoogleAuthorizationCodeTokenRequest , чтобы вы могли получить токен идентификатора с адресом электронной почты пользователя, идентификатором пользователя и информацией профиля без нужен еще один сетевой вызов. Эта конечная точка полностью обратно совместима, и приведенный ниже код будет работать для кодов аутентификации сервера, полученных как из старой, так и из новой реализации клиента 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);
...