Migrar do GoogleAuthUtil e da API Plus.

Se você já fez a integração com o Login do Google usando GoogleAuthUtil.getToken ou Plus.API, migre para a API mais recente de login para ter mais segurança e uma melhor experiência do usuário.

Migrar do antipadrão do token de acesso

Não envie tokens de acesso recebidos com GoogleAuthUtil.getToken para o servidor de back-end como uma declaração de identidade, já que não é possível verificar facilmente se o token foi emitido para o back-end, deixando você vulnerável à inserção de um token de acesso de um invasor.

Por exemplo, se o código Android for semelhante ao exemplo abaixo, será necessário migrar o app para as práticas recomendadas atuais.

Código do Android

No exemplo, as solicitações de token de acesso usam oauth2: e uma string de escopo como o parâmetro scope para a chamada GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

Em vez de autenticar com um token de acesso adquirido com GoogleAuthUtil.getToken, use o fluxo do token de ID ou o fluxo do código de autenticação.

Migrar para o fluxo de tokens de ID

Se você só precisar do código, endereço de e-mail, nome ou URL da foto do perfil do usuário, use o fluxo de token de código.

Para migrar para o fluxo de tokens de ID, faça as seguintes mudanças:

Lado do cliente Android

  • Remover a permissão GET_ACCOUNTS (Contatos) se você solicitá-la
  • Mude qualquer código usando GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() ou AccountManager.newChooseAccountIntent() para Auth.GOOGLE_SIGN_IN_API com a configuração GoogleSignInOptions.Builder.requestIdToken(...).

Lado do servidor

Migrar para o fluxo de código de autenticação do servidor

Se o servidor precisar acessar outras APIs do Google, como o Google Drive, YouTube ou Contatos, use o fluxo de código de autenticação do servidor.

Para migrar para o fluxo do código de autenticação do servidor, faça as seguintes alterações:

Lado do cliente Android

  • Remover a permissão GET_ACCOUNTS (Contatos) se você solicitá-la
  • Mude qualquer código usando GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() ou AccountManager.newChooseAccountIntent() para Auth.GOOGLE_SIGN_IN_API com a configuração GoogleSignInOptions.Builder.requestServerAuthCode(...).

Lado do servidor

Ainda é possível compartilhar a lógica de acesso da API entre o endpoint antigo e o novo. Por exemplo:

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);
}

Migrar do fluxo de tokens de ID do GoogleAuthUtil

Se você usa GoogleAuthUtil para receber tokens de ID, migre para o novo fluxo de tokens de ID da API Login.

Por exemplo, se o código do Android for semelhante ao exemplo a seguir, você precisará migrar:

Código do Android

No exemplo, as solicitações de token de ID usam audience:server:client_id e o ID do cliente do servidor da Web como o parâmetro "scope" para a chamada GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

O novo fluxo de token do ID da API Sign-In tem os seguintes benefícios:

  • Experiência de login simplificada com um toque
  • Seu servidor pode receber informações do perfil do usuário sem uma chamada de rede extra

Para migrar para o fluxo de tokens de ID, faça as seguintes mudanças:

Lado do cliente Android

  • Remover a permissão GET_ACCOUNTS (Contatos) se você solicitá-la
  • Mude qualquer código usando GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() ou AccountManager.newChooseAccountIntent() para Auth.GOOGLE_SIGN_IN_API com a configuração GoogleSignInOptions.Builder.requestIdToken(...).

Lado do servidor

A nova API Sign-in emite tokens de ID que estão em conformidade com a especificação do OpenID Connect, ao contrário de GoogleAuthUtil.getToken, que usa um formato descontinuado. Especificamente, o emissor agora é https://accounts.google.com, com um esquema https.

Durante o processo de migração, o servidor precisa verificar o token de ID dos clientes antigos e novos do Android. Para verificar os dois formatos do token, faça a mudança que corresponda à biblioteca de cliente usada (se você usar um):

  • Java (bibliotecas de cliente de APIs do Google): upgrade para a versão 1.21.0 ou mais recente
  • PHP (bibliotecas de cliente de APIs do Google): se você usa a v1, faça upgrade para a versão 1.1.6 ou mais recente. Se você usa a v2, faça upgrade para a versão 2.0.0-RC1 ou mais recente
  • Node.js: upgrade para a versão 0.9.7 ou mais recente
  • Python ou suas próprias implementações: aceite os dois emissores: https://accounts.google.com e accounts.google.com

Migrar do fluxo de código de autenticação do servidor do GoogleAuthUtil

Se você usa GoogleAuthUtil para receber um código de autenticação do servidor, migre para o novo fluxo de código de autenticação da API Sign-In.

Por exemplo, se o código do Android for semelhante ao exemplo a seguir, você precisará migrar:

Código do Android

No exemplo, as solicitações de código de autenticação do servidor usam oauth2:server:client_id + o ID do cliente do servidor da Web como o parâmetro scope para a chamada GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

O novo fluxo do código de autenticação da API Sign-in tem os seguintes benefícios:

  • Experiência de login simplificada com um toque
  • Se você seguir o guia de migração abaixo, seu servidor poderá receber um token de ID que contém as informações de perfil do usuário quando você fizer a troca do código de autenticação

Para migrar para o novo fluxo de código de autenticação, faça as seguintes alterações:

Lado do cliente Android

  • Remover a permissão GET_ACCOUNTS (Contatos) se você solicitá-la
  • Mude qualquer código usando GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() ou AccountManager.newChooseAccountIntent() para Auth.GOOGLE_SIGN_IN_API com a configuração GoogleSignInOptions.Builder.requestServerAuthCode(...).

Lado do servidor

Mantenha seu código atual, mas especifique https://oauth2.googleapis.com/token como o endpoint do servidor de token ao criar o objeto GoogleAuthorizationCodeTokenRequest para que você possa receber um token de ID com o e-mail, o ID do usuário e as informações de perfil do usuário sem precisar de outra chamada de rede. Esse endpoint é totalmente compatível com versões anteriores, e o código abaixo funcionará para códigos de autenticação do servidor recuperados da sua implementação antiga e nova do cliente do 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);
...