Você pode permitir que seus usuários se autentiquem no Firebase usando o ID Apple deles usando o SDK do Firebase para realizar o fluxo de login OAuth 2.0 de ponta a ponta.
Antes de você começar
Para fazer login de usuários usando a Apple, primeiro configure Fazer login com a Apple no site do desenvolvedor da Apple e, em seguida, ative a Apple como provedor de login para seu projeto do Firebase.
Junte-se ao Programa de Desenvolvedores da Apple
Entrar com a Apple só pode ser configurado por membros do Apple Developer Program .
Configurar login com a Apple
O Apple Sign In deve estar ativado e configurado corretamente em seu projeto do Firebase. A configuração do Apple Developer varia entre as plataformas Android e Apple. Siga a seção "Configurar login com a Apple" dos guias iOS+ e/ou Android antes de continuar.Ativar a Apple como provedor de login
- No console do Firebase , abra a seção Auth . Na guia Método de login , habilite o provedor Apple .
- Defina as configurações do provedor de login da Apple:
- Se você estiver implantando seu aplicativo apenas em plataformas Apple, poderá deixar os campos ID do serviço, ID da equipe da Apple, chave privada e ID da chave vazios.
- Para suporte em dispositivos Android:
- Adicione o Firebase ao seu projeto Android . Certifique-se de registrar a assinatura SHA-1 do seu aplicativo ao configurá-lo no Firebase console.
- No console do Firebase , abra a seção Auth . Na guia Método de login , habilite o provedor Apple . Especifique o ID do serviço que você criou na seção anterior. Além disso, na seção de configuração do fluxo de código OAuth, especifique seu ID de equipe da Apple e a chave privada e o ID da chave que você criou na seção anterior.
Cumpra os requisitos de dados anônimos da Apple
Entrar com a Apple oferece aos usuários a opção de anonimizar seus dados, incluindo seu endereço de e-mail, ao fazer login. Os usuários que escolhem essa opção têm endereços de e-mail com o domínio privaterelay.appleid.com
. Ao usar o Login com a Apple em seu aplicativo, você deve cumprir todas as políticas ou termos de desenvolvedor aplicáveis da Apple em relação a esses IDs Apple anônimos.
Isso inclui a obtenção de qualquer consentimento necessário do usuário antes de associar qualquer informação pessoal de identificação direta a um ID Apple anônimo. Ao usar o Firebase Authentication, isso pode incluir as seguintes ações:
- Vincule um endereço de e-mail a um ID Apple anônimo ou vice-versa.
- Vincular um número de telefone a um ID Apple anônimo ou vice-versa
- Vincule uma credencial social não anônima (Facebook, Google, etc) a um ID Apple anônimo ou vice-versa.
A lista acima não é exaustiva. Consulte o Contrato de Licença do Apple Developer Program na seção Membership da sua conta de desenvolvedor para garantir que seu aplicativo atenda aos requisitos da Apple.
Acesse a classe Firebase.Auth.FirebaseAuth
A classe FirebaseAuth
é o gateway para todas as chamadas de API. Ele pode ser acessado por meio de FirebaseAuth.DefaultInstance .Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
Gerencie o fluxo de login com o SDK do Firebase
O processo de login com a Apple varia entre as plataformas Apple e Android.
Nas plataformas da Apple
Instale um plug-in de terceiros para lidar com nonce de login da Apple e geração de token, como o pacote de armazenamento de ativos da Unity do Unity . Pode ser necessário alterar o código para sondar a string de nonce aleatório gerada em seu estado de string bruta para uso em operações do Firebase (ou seja, armazenar uma cópia dela antes que o formulário SHA256 de resumo do nonce seja criado).
Use a string de token resultante e o nonce bruto para criar uma credencial do Firebase e fazer login no Firebase.
Firebase.Auth.Credential credential = Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null); auth.SignInWithCredentialAsync(credential).ContinueWith(task => { if (task.IsCanceled) { Debug.LogError("SignInWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception); return; } Firebase.Auth.FirebaseUser newUser = task.Result; Debug.LogFormat("User signed in successfully: {0} ({1})", newUser.DisplayName, newUser.UserId); });
O mesmo padrão pode ser usado com
ReauthenticateAsync
que pode ser usado para recuperar novas credenciais para operações confidenciais que exigem login recente. Para obter mais informações, consulte Gerenciar usuários .Ao vincular com o Apple Sign In em plataformas da Apple, você pode encontrar um erro informando que uma conta existente do Firebase já foi vinculada à conta da Apple. Quando isso ocorrer, uma
Firebase.Auth.FirebaseAccountLinkException
será lançada em vez daFirebase.FirebsaeException
padrão. A exceção inclui uma propriedadeUserInfo.UpdatedCredential
que, se válida, pode ser usada para fazer login do usuário vinculado à Apple por meio deFirebaseAuth.SignInWithCredential
. A credencial atualizada contorna a necessidade de gerar um novo token de entrada da Apple com nonce para a operação de entrada.Observe que
LinkWithCredentialAsync
continuará a lançar oFirebase.FirebaseException
padrão em falhas de link e, portanto, não poderá retornar uma credencial atualizada.auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync( Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null)) .ContinueWithOnMainThread( task => { if (task.IsCompleted) { // Link Success } else { if (task.Exception != null) { foreach (Exception exception in task.Exception.Flatten().InnerExceptions) { Firebase.Auth.FirebaseAccountLinkException firebaseEx = exception as Firebase.Auth.FirebaseAccountLinkException; if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) { // Attempt to sign in with the updated credential. auth.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential). ContinueWithOnMainThread( signInTask => { // Handle Sign in result. }); } else { DebugLog("Link with Apple failed:" + firebaseEx ); } } // end for loop } } });
No Android
No Android, autentique seus usuários com o Firebase integrando o login OAuth genérico baseado na Web ao seu aplicativo usando o SDK do Firebase para realizar o fluxo de login de ponta a ponta.
Para lidar com o fluxo de login com o SDK do Firebase, siga estas etapas:
Construa uma instância de um
FederatedOAuthProviderData
configurado com o ID do provedor apropriado para a Apple.Firebase.Auth.FederatedOAuthProviderData providerData = new Firebase.Auth.FederatedOAuthProviderData(); providerData.ProviderId = "apple.com";
Opcional: especifique escopos adicionais do OAuth 2.0 além do padrão que você deseja solicitar ao provedor de autenticação.
providerData.Scopes = new List<string>(); providerData.Scopes.Add("email"); providerData.Scopes.Add("name");
Opcional: se você quiser exibir a tela de login da Apple em um idioma diferente do inglês, defina o parâmetro
locale
. Consulte os documentos Entrar com a Apple para obter as localidades com suporte.providerData.CustomParameters = new Dictionary<string,string>; // Localize to French. providerData.CustomParameters.Add("language", "fr");
Depois que os dados do seu provedor forem configurados, use-os para criar um FederatedOAuthProvider.
// Construct a FederatedOAuthProvider for use in Auth methods. Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider(); provider.SetProviderData(providerData);
Autentique-se com o Firebase usando o objeto do provedor Auth. Observe que, diferentemente de outras operações do FirebaseAuth, isso assumirá o controle da sua interface do usuário, exibindo uma visualização da Web na qual o usuário pode inserir suas credenciais.
Para iniciar o fluxo de login, chame
signInWithProvider
:auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => { if (task.IsCanceled) { Debug.LogError("SignInWithProviderAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("SignInWithProviderAsync encountered an error: " + task.Exception); return; } Firebase.Auth.SignInResult signInResult = task.Result; Firebase.Auth.FirebaseUser user = signInResult.User; Debug.LogFormat("User signed in successfully: {0} ({1})", user.DisplayName, user.UserId); });
O mesmo padrão pode ser usado com
ReauthenticateWithProvider
que pode ser usado para recuperar novas credenciais para operações confidenciais que exigem login recente.user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => { if (task.IsCanceled) { Debug.LogError("ReauthenticateWithProviderAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError( "ReauthenticateWithProviderAsync encountered an error: " + task.Exception); return; } Firebase.Auth.SignInResult signInResult = task.Result; Firebase.Auth.FirebaseUser user = signInResult.User; Debug.LogFormat("User reauthenticated successfully: {0} ({1})", user.DisplayName, user.UserId); });
E você pode usar
linkWithCredential()
para vincular diferentes provedores de identidade a contas existentes.Observe que a Apple exige que você obtenha o consentimento explícito dos usuários antes de vincular suas contas da Apple a outros dados.
Por exemplo, para vincular uma conta do Facebook à conta atual do Firebase, use o token de acesso obtido ao fazer login do usuário no Facebook:
// Initialize a Facebook credential with a Facebook access token. Firebase.Auth.Credential credential = Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token); // Assuming the current user is an Apple user linking a Facebook provider. user.LinkAndRetrieveDataWithCredentialAsync(credential) .ContinueWithOnMainThread( task => { if (task.IsCanceled) { Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled."); return; } if (task.IsFaulted) { Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } Firebase.Auth.SignInResult signInResult = task.Result; Firebase.Auth.FirebaseUser user = signInResult.User; Debug.LogFormat("User linked successfully: {0} ({1})", user.DisplayName, user.UserId); });
Entrar com o Apple Notes
Ao contrário de outros provedores compatíveis com o Firebase Auth, a Apple não fornece um URL de foto.
Além disso, quando o usuário opta por não compartilhar seu e-mail com o aplicativo, a Apple fornece um endereço de e-mail exclusivo para esse usuário (no formato xyz@privaterelay.appleid.com
), que é compartilhado com seu aplicativo. Se você configurou o serviço de retransmissão de e-mail privado, a Apple encaminha os e-mails enviados para o endereço anônimo para o endereço de e-mail real do usuário.
A Apple só compartilha informações do usuário, como o nome de exibição, com aplicativos na primeira vez que um usuário faz login. Normalmente, o Firebase armazena o nome de exibição na primeira vez que um usuário faz login com a Apple, que você pode obter com getCurrentUser().getDisplayName()
. No entanto, se você já usou a Apple para fazer login de um usuário no aplicativo sem usar o Firebase, a Apple não fornecerá ao Firebase o nome de exibição do usuário.
Próximos passos
Depois que um usuário entra pela primeira vez, uma nova conta de usuário é criada e vinculada às credenciais — ou seja, o nome de usuário e a senha, número de telefone ou informações do provedor de autenticação — com as quais o usuário fez login. Essa nova conta é armazenada como parte do seu projeto do Firebase e pode ser usada para identificar um usuário em todos os aplicativos do projeto, independentemente de como o usuário faça login.Nos seus aplicativos, você pode obter as informações básicas do perfil do usuário no objeto firebase::auth::user. Consulte Gerenciar usuários .
Nas regras de segurança do Firebase Realtime Database e do Cloud Storage, você pode obter o ID de usuário exclusivo do usuário conectado na variável de autenticação e usá-lo para controlar quais dados um usuário pode acessar.