Puoi consentire agli utenti di eseguire l'autenticazione con Firebase utilizzando il loro ID Apple: utilizzando l'SDK Firebase per eseguire il flusso di accesso end-to-end OAuth 2.0.
Prima di iniziare
Per consentire agli utenti di accedere utilizzando Apple, configura prima Accedi con Apple sul sito per sviluppatori di Apple, quindi attiva Apple come provider di accesso per il tuo progetto Firebase.
Partecipa al programma per sviluppatori Apple
Accedi con Apple può essere configurato solo dai membri del programma Apple Developer.
Configura Accedi con Apple
La funzionalità Accedi con Apple deve essere attivata e configurata correttamente nel progetto Firebase. La configurazione varia a seconda delle piattaforme Android e Apple. Segui le "Configura Accedi con Apple" sezione del piattaforme Apple e/o Guide di Android prima procedere.Abilita Apple come provider di accesso
- Nella console Firebase, apri la sezione Auth. Nella scheda Metodo di accesso, Attiva il provider Apple.
- Configura le impostazioni del provider di accesso Apple:
- Se esegui il deployment dell'app solo sulle piattaforme Apple, puoi lasciare vuoti i campi ID servizio, ID team Apple, chiave privata e ID chiave.
- Per assistenza sui dispositivi Android:
- Aggiungi Firebase al tuo progetto Android. Essere assicurati di registrare la firma SHA-1 dell'app quando configuri l'app nel Console Firebase.
- Nel Firebase console Cloud, apri la sezione Auth. Nella scheda Metodo di accesso, attiva il provider Apple. Specifica l'ID servizio che hai creato nella sezione precedente. Inoltre, nella sezione di configurazione del flusso di codice OAuth, specifica il tuo ID team Apple e la chiave privata e l'ID chiave che hai creato. nella sezione precedente.
Rispettare i requisiti di Apple relativi ai dati anonimizzati
Accedi con Apple offre agli utenti la possibilità di anonimizzare i propri dati, incluso l'indirizzo email, quando accedono. Gli utenti che scelgono questa opzione hanno indirizzi email con il dominio privaterelay.appleid.com
. Quando
utilizzi Accedi con Apple nella tua app, devi rispettare tutte le
le norme per gli sviluppatori o i termini di Apple relativi a queste norme
ID.
Ciò include l'ottenimento del consenso dell'utente richiesto prima di associare informazioni personali che consentono l'identificazione diretta a un ID Apple anonimizzato. Quando utilizzi Firebase Authentication, potrebbero essere incluse le seguenti azioni:
- Collega un indirizzo email a un ID Apple anonimo o viceversa.
- Collega un numero di telefono a un ID Apple anonimo o viceversa
- Collegare una credenziale social non anonima (Facebook, Google e così via) a un ID Apple anonimizzato o viceversa.
L'elenco riportato sopra non è esaustivo. Fai riferimento all'Apple Developer Program il Contratto di licenza nella sezione Abbonamento del tuo account sviluppatore per assicurati che la tua app soddisfi i requisiti di Apple.
Accedi al corso firebase::auth::Auth
La classe Auth
è il gateway per tutte le chiamate API.
- Aggiungi i file di autenticazione e di intestazione dell'app:
#include "firebase/app.h" #include "firebase/auth.h"
- Nel codice di inizializzazione, crea una classe
firebase::App
.#if defined(__ANDROID__) firebase::App* app = firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity); #else firebase::App* app = firebase::App::Create(firebase::AppOptions()); #endif // defined(__ANDROID__)
- Acquista il corso
firebase::auth::Auth
per il tuofirebase::App
. Esiste una mappatura uno a uno traApp
eAuth
.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Gestire il flusso di accesso con l'SDK Firebase
La procedura di Accedi con Apple varia a seconda delle piattaforme Apple e Android.
Sulle piattaforme Apple
Autentica gli utenti con Firebase tramite l'SDK Objective-C di Accesso con Apple invocato dal codice C++.
Per ogni richiesta di accesso, genera una stringa casuale, un "nonce", che utilizzerai per assicurarti che il token ID che ricevi sia stato concesso specificamente in risposta alla richiesta di autenticazione della tua app. Questo è importante per prevenire gli attacchi di ripetizione.
- (NSString *)randomNonce:(NSInteger)length { NSAssert(length > 0, @"Expected nonce to have positive length"); NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._"; NSMutableString *result = [NSMutableString string]; NSInteger remainingLength = length; while (remainingLength > 0) { NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16]; for (NSInteger i = 0; i < 16; i++) { uint8_t random = 0; int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random); NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode); [randoms addObject:@(random)]; } for (NSNumber *random in randoms) { if (remainingLength == 0) { break; } if (random.unsignedIntValue < characterSet.length) { unichar character = [characterSet characterAtIndex:random.unsignedIntValue]; [result appendFormat:@"%C", character]; remainingLength--; } } } }
Invierai l'hash SHA256 del nonce con la richiesta di accesso, che Apple trasmetterà invariato nella risposta. Firebase convalida la risposta hashing il nonce originale e confrontandolo con il valore passato da Apple.
Avvia il flusso di accesso di Apple, incluso nella tua richiesta l'hash SHA256 di il nonce e la classe delegato che gestirà la risposta di Apple (vedi nel passaggio successivo):
- (void)startSignInWithAppleFlow { NSString *nonce = [self randomNonce:32]; self.currentNonce = nonce; ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init]; ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest]; request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail]; request.nonce = [self stringBySha256HashingString:nonce]; ASAuthorizationController *authorizationController = [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]]; authorizationController.delegate = self; authorizationController.presentationContextProvider = self; [authorizationController performRequests]; } - (NSString *)stringBySha256HashingString:(NSString *)input { const char *string = [input UTF8String]; unsigned char result[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(string, (CC_LONG)strlen(string), result); NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [hashed appendFormat:@"%02x", result[i]]; } return hashed; }
Gestisci la risposta di Apple nell'implementazione di ASAuthorizationControllerDelegate. Se l'accesso è andato a buon fine, utilizza il token ID della risposta di Apple con il nonce non sottoposto ad hashing per autenticarti con Firebase:
- (void)authorizationController:(ASAuthorizationController *)controller didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) { if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) { ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential; NSString *rawNonce = self.currentNonce; NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent."); if (appleIDCredential.identityToken == nil) { NSLog(@"Unable to fetch identity token."); return; } NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken encoding:NSUTF8StringEncoding]; if (idToken == nil) { NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken); } }
Utilizza la stringa del token risultante e il nonce originale per creare una credenziale Firebase e accedere a Firebase.
firebase::auth::OAuthProvider::GetCredential( /*provider_id=*/"apple.com", token, nonce, /*access_token=*/nullptr); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
Lo stesso pattern può essere utilizzato con
Reauthenticate
, che può essere impiegato per recuperare credenziali aggiornate per operazioni sensibili che richiedono un accesso recente.firebase::Future<firebase::auth::AuthResult> result = user->Reauthenticate(credential);
Lo stesso pattern può essere utilizzato per collegare un account con Accedi con Apple. Tuttavia, potresti riscontrare un errore quando un account Firebase esistente ha è già stato collegato all'account Apple a cui stai tentando di effettuare il collegamento. In questo caso, il futuro restituirà lo stato
kAuthErrorCredentialAlreadyInUse
eAuthResult
possono contenere un indirizzo validocredential
. Questa credenziale può essere utilizzata per accedere all'account collegato ad Apple tramiteSignInAndRetrieveDataWithCredential
senza dover generare un altro token e un altro nonce di Sign In with Apple.firebase::Future<firebase::auth::AuthResult> link_result = auth->current_user().LinkWithCredential(credential); // To keep example simple, wait on the current thread until call completes. while (link_result.status() == firebase::kFutureStatusPending) { Wait(100); } // Determine the result of the link attempt if (link_result.error() == firebase::auth::kAuthErrorNone) { // user linked correctly. } else if (link_result.error() == firebase::auth::kAuthErrorCredentialAlreadyInUse && link_result.result() ->additional_user_info.updated_credential.is_valid()) { // Sign In with the new credential firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential( link_result.result()->additional_user_info.updated_credential); } else { // Another link error occurred. }
Su Android
Su Android, autentica gli utenti con Firebase integrando l'accesso OAuth generico basato su web nella tua app utilizzando l'SDK Firebase per eseguire il flusso di accesso end-to-end.
Per gestire il flusso di accesso con l'SDK Firebase:
Crea un'istanza di un
FederatedOAuthProviderData
configurato con l'ID provider appropriato per Apple.firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
Facoltativo:specifica altri ambiti OAuth 2.0 oltre a quello predefinito da richiedere al provider di autenticazione.
provider_data.scopes.push_back("email"); provider_data.scopes.push_back("name");
Facoltativo: se vuoi visualizzare la schermata di accesso di Apple in una lingua diversa dall'inglese, imposta il parametro
locale
. Consulta la documentazione di Accedi con Apple per conoscere le lingue supportate.// Localize to French. provider_data.custom_parameters["language"] = "fr"; ```
Una volta configurati i dati del provider, utilizzali per creare un FederatedOAuthProvider.
// Construct a FederatedOAuthProvider for use in Auth methods. firebase::auth::FederatedOAuthProvider provider(provider_data);
Esegui l'autenticazione con Firebase utilizzando l'oggetto provider Auth. Tieni presente che, a differenza di altre operazioni FirebaseAuth, assumerà il controllo dell'interfaccia utente una vista web in cui l'utente può inserire le proprie credenziali.
Per avviare il flusso di accesso, chiama
signInWithProvider
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithProvider(provider_data);
La tua richiesta potrebbe quindi attendere o registra una richiamata sul Futuro.
Lo stesso pattern può essere utilizzato con
ReauthenticateWithProvider
, che può essere impiegato per recuperare credenziali aggiornate per operazioni sensibili che richiedono un accesso recente.firebase::Future<firebase::auth::AuthResult> result = user.ReauthenticateWithProvider(provider_data);
La tua applicazione potrebbe quindi attendere o registrare un callback su per il futuro.
Inoltre, puoi utilizzare
LinkWithCredential()
per collegare diversi provider di identità agli account esistenti.Tieni presente che Apple richiede di ottenere il consenso esplicito degli utenti prima di collegare i propri account Apple ad altri dati.
Ad esempio, per collegare un account Facebook all'account Firebase corrente, utilizza il token di accesso ottenuto dall'accesso dell'utente a Facebook:
// Initialize a Facebook credential with a Facebook access token. AuthCredential credential = firebase::auth::FacebookAuthProvider.getCredential(token); // Assuming the current user is an Apple user linking a Facebook provider. firebase::Future<firebase::auth::AuthResult> result = auth.current_user().LinkWithCredential(credential);
Accedere con Note di Apple
A differenza di altri provider supportati da Firebase Auth, Apple non fornisce una l'URL della foto.
Inoltre, se l'utente sceglie di non condividere la propria email con l'app,
esegue il provisioning di un indirizzo email univoco per l'utente (nel formato
xyz@privaterelay.appleid.com
), che condivide con la tua app. Se
configurato il servizio di inoltro email privato, Apple inoltra le email inviate a
l'indirizzo anonimo all'indirizzo email reale dell'utente.
Apple condivide le informazioni dell'utente, ad esempio il nome visualizzato, con le app solo la prima volta che l'utente accede. In genere, Firebase memorizza il nome visualizzato la prima volta che un utente accede con Apple, che puoi ottenere con current_user().display_name()
. Tuttavia, se in precedenza hai utilizzato Apple per firmare una
l'utente nell'app senza utilizzare Firebase, Apple non fornisce a Firebase
il nome visualizzato dell'utente.
Passaggi successivi
Dopo che un utente ha eseguito l'accesso per la prima volta, viene creato un nuovo account utente e collegato alle credenziali, ovvero nome utente e password, numero di telefono o informazioni del fornitore di autenticazione, con cui l'utente ha eseguito l'accesso. Il nuovo account è memorizzato come parte del tuo progetto Firebase e può essere utilizzato per identificare un utente del tuo progetto, a prescindere dal modo in cui l'utente esegue l'accesso.Nelle tue app, puoi recuperare le informazioni di base del profilo dell'utente dall'oggetto
firebase::auth::User
. Consulta:
Gestisci utenti.
Nelle regole di sicurezza di Firebase Realtime Database e Cloud Storage, puoi recuperare l'ID utente univoco dell'utente che ha eseguito l'accesso dalla variabile auth e utilizzarlo per controllare i dati a cui un utente può accedere.