Como fazer a autenticação no Unity usando os serviços relacionados a jogos do Google Play

É possível usar os serviços relacionados a jogos do Google Play para fazer login em um jogo Android criado no Firebase e escrito em Unity. Para usar o login desses serviços com o Firebase, primeiro faça login do jogador no Google Play Games e solicite um código de autenticação do OAuth 2.0. Em seguida, envie esse código para PlayGamesAuthProvider a fim de gerar uma credencial do Firebase, que poderá ser usada para acessar a plataforma.

Antes de começar

Configurar seu projeto do Unity

  1. Adicione o arquivo de configuração do Firebase e o SDK do Firebase para Unity ao projeto do Unity, conforme descrito em Adicionar o Firebase ao seu projeto do Unity. Siga as instruções para Android.

    Lembre-se de importar FirebaseAuth.unitypackage.

  2. No editor do Unity, defina o nome do pacote do Android para seu jogo em Build Settings > Player Settings > Other Settings.

  3. Em seguida, acesse Build Settings > Player Settings > Publishing Settings para selecionar ou criar uma chave e um repositório de chaves que serão usados para fazer login no seu pacote do Android. Para que seu APK funcione, ele precisa estar assinado com o login do Play Games. Esse requisito se aplica não apenas à publicação, mas também ao período de desenvolvimento do seu jogo.

Configurar seu projeto do Firebase

  1. No Console do Firebase, acesse o projeto do Firebase no qual você registrou o projeto do Unity.

  2. Configure a impressão digital SHA-1 do seu jogo na página Configurações do Firebase console usando a chave definida no Unity.

    Crie a impressão digital SHA-1 da sua chave com o comando keytool:

    keytool -exportcert -list -v \
        -alias YOUR-KEY-NAME -keystore PATH-TO-KEYSTORE

    Como alternativa, você pode receber o hash SHA do certificado de assinatura com o comando gradle signingReport:

    gradlew signingReport

    Seu APK precisa estar assinado com essa chave, inclusive durante o desenvolvimento.

  3. Ative o Google Play Games como provedor de login:

    1. No Console do Firebase, abra a seção Autenticação.

    2. Gere e receba a chave secreta e o ID do ciente do servidor da Web do seu projeto:

      1. Na guia Método de login, ative o provedor de login do Google.

      2. Copie o ID do cliente do servidor da Web e o secret do provedor de login do Google.

    3. Na guia Método de login, ative o provedor de login Play Games e especifique o ID e a chave secreta do cliente do servidor da Web do seu projeto, que foi recebido na última etapa.

Configurar os serviços relacionados a jogos do Google Play com as informações do app Firebase

  1. No Google Play Console, abra seu app do Google Play ou crie um.

  2. Na seção Expandir, clique em Serviços relacionados a jogos do Google Play > Configuração e gerenciamento > Configuração.

  3. Clique em Sim, meu jogo já usa APIs do Google, selecione seu projeto do Firebase na lista e clique em Usar.

  4. Na página de configuração dos serviços relacionados a jogos do Google Play, clique em Adicionar credencial.

    1. Selecione o tipo de Servidor de jogos.
    2. No campo Cliente OAuth, selecione o ID do cliente da Web do seu projeto. Verifique se esse é o mesmo ID do cliente especificado quando você ativou o login do Play Games.
    3. Salve as alterações.
  5. Ainda na página de configuração dos serviços relacionados a jogos do Google Play, clique em Adicionar credencial novamente.

    1. Selecione o tipo Android.
    2. No campo Cliente OAuth, selecione o ID do cliente Android do seu projeto. Caso você não veja o ID do cliente do Android, configure a impressão digital SHA-1 do jogo no Console do Firebase.
    3. Salve as alterações.
  6. Nas páginas Eventos, Conquistas e Placares, crie todos os recursos do Play Games que você quer usar no seu jogo. Caso não queira criar um recurso, crie uma entrada de marcador de posição. Em seguida, em qualquer uma das páginas Eventos, Conquistas ou Placares, clique em Acessar recursos e copie o snippet de recursos do Android para algum lugar de fácil acesso. Você precisará desse snippet para configurar o plug-in dos serviços relacionados a jogos do Google Play.

    O snippet de recursos terá a seguinte aparência:

    <?xml version="1.0" encoding="utf-8"?>
    <!--
    Google Play game services IDs.
    Save this file as res/values/games-ids.xml in your project.
    -->
    <resources>
      <!-- app_id -->
      <string name="app_id" translatable="false">123456789000</string>
      <!-- package_name -->
      <string name="package_name" translatable="false">com.example.game</string>
      <!-- event Wiped Raid -->
      <string name="event_wiped_raid" translatable="false">CgkIpKjv1a4PEAIYBA</string>
    </resources>
    
  7. Na página Testadores, adicione os endereços de e-mail de qualquer usuário que precise fazer login no seu jogo antes de liberá-lo na Play Store.

Integrar o login do Play Games ao seu jogo

  1. Faça o download da versão mais recente do Plug-in do Play Games para Unity e extraia o arquivo.

  2. Importe o pacote do Unity do plug-in para seu projeto do Unity. O pacote do Unity pode ser encontrado no diretório current-build do arquivo de lançamento.

  3. Configure o plug-in do Play Games:

    1. Clique em Janela > Google Play Games > Configuração > Configuração do Android para abrir a tela de configuração do Android.
    2. Cole o snippet de recursos do Android que você copiou do Play Console no campo Definição de recursos.
    3. Cole o ID do cliente do seu servidor da Web que você forneceu ao ativar o login do Play Games no Firebase console no campo ID do cliente.
    4. Clique em Configurar.
  4. No seu jogo, defina um cliente do Play Games com a configuração RequestServerAuthCode ativada:

    using GooglePlayGames;
    using GooglePlayGames.BasicApi;
    using UnityEngine.SocialPlatforms;
    using System.Threading.Tasks;
    
    PlayGamesClientConfiguration config = new PlayGamesClientConfiguration.Builder()
        .RequestServerAuthCode(false /* Don't force refresh */)
        .Build();
    
    PlayGamesPlatform.InitializeInstance(config);
    PlayGamesPlatform.Activate();
    
  5. Em seguida, quando um jogador optar por fazer login com o Play Games, chame Social.localUser.Authenticate():

    Social.localUser.Authenticate((bool success) => {
      // handle success or failure
    });
    

Autenticar no Firebase

Depois de adicionar o login do Play Games ao seu jogo, você poderá usar o código de autenticação dos serviços do Play Games no Firebase.

  1. Depois que o usuário fizer login usando o Play Games, acesse o gerenciador de continuação do login e receba um código de autenticação para a conta do jogador:

    Social.localUser.Authenticate((bool success) => {
      if (success) {
        authCode = PlayGamesPlatform.Instance.GetServerAuthCode();
      }
    });
    
  2. Em seguida, troque o código de autenticação dos serviços do Play Games por uma credencial do Firebase que será usada para autenticar o usuário:

    Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
    Firebase.Auth.Credential credential =
        Firebase.Auth.PlayGamesAuthProvider.GetCredential(authCode);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

Próximas etapas

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada ao ID do Play Games. Essa nova conta é armazenada como parte do seu projeto do Firebase e pode ser usada para identificar um usuário em cada app no seu projeto.

No seu jogo, é possível receber o UID do Firebase referente ao usuário usando o objeto Firebase.Auth.FirebaseUser:

Firebase.Auth.FirebaseUser user = auth.CurrentUser;
if (user != null && user.IsValid()) {
  string playerName = user.DisplayName;

  // The user's Id, unique to the Firebase project.
  // Do NOT use this value to authenticate with your backend server, if you
  // have one; use User.TokenAsync() instead.
  string uid = user.UserId;
}

Nas regras de segurança do Firebase Realtime Database e do Cloud Storage, é possível usar a variável auth para acessar o código exclusivo do usuário que fez login. Use essa informação para controlar quais dados os usuários podem acessar.

Para ter acesso às informações do jogador do Play Games de um usuário ou para acessar os serviços relacionados a jogos do Google Play, use as APIs fornecidas pelo plug-in do Play Games.

Para desconectar um usuário, chame SignOut():

auth.SignOut();