FirebaseUI è una libreria creata sull'SDK Firebase Authentication che fornisce flussi UI drop-in da utilizzare nella tua app. FirebaseUI offre i seguenti vantaggi:
- Più provider: flussi di accesso per email/password, link via email, autenticazione tramite telefono, accesso con Google, Facebook, Twitter e GitHub.
- Collegamento dell'account: flussi per collegare in modo sicuro gli account utente tra i provider di identità.
- Personalizzazione: esegui l'override degli stili CSS di FirebaseUI in modo che corrispondano ai requisiti della tua app. Inoltre, poiché FirebaseUI è open source, puoi creare un fork del progetto e personalizzarlo in base alle tue esigenze.
- Registrazione con un solo tocco e accesso automatico: integrazione automatica con la registrazione con un solo tocco per un accesso rapido su più dispositivi.
- UI localizzata: internazionalizzazione per oltre 40 lingue.
- Upgrade degli utenti anonimi: possibilità di eseguire l'upgrade degli utenti anonimi tramite accesso/registrazione. Per saperne di più, consulta la sezione Aggiornamento degli utenti anonimi.
Prima di iniziare
Aggiungi Firebase Authentication alla tua applicazione web, assicurandoti di utilizzare l'API con spazio dei nomi v9 o versioni successive (non l'API modulare; vedi la barra laterale sopra).
Includi FirebaseUI tramite una delle seguenti opzioni:
CDN
Includi il seguente script e il seguente file CSS nel tag <head> della pagina, sotto lo snippet di inizializzazione della console Firebase:
<script src="https://www.gstatic.com/firebasejs/ui/6.0.1/firebase-ui-auth.js"></script> <link type="text/css" rel="stylesheet" href="https://www.gstatic.com/firebasejs/ui/6.0.1/firebase-ui-auth.css" />Modulo npm
Installa FirebaseUI e le relative dipendenze tramite npm utilizzando il seguente comando:
$ npm install firebaseui --saverequirei seguenti moduli all'interno dei file di origine:var firebase = require('firebase'); var firebaseui = require('firebaseui');
Componente Bower
Installa FirebaseUI e le relative dipendenze tramite Bower utilizzando il seguente comando:
$ bower install firebaseui --save
Includi i file richiesti nel codice HTML se il server HTTP pubblica i file all'interno di
bower_components/:<script src="bower_components/firebaseui/dist/firebaseui.js"></script> <link type="text/css" rel="stylesheet" href="bower_components/firebaseui/dist/firebaseui.css" />
Inizializza FirebaseUI
Dopo aver importato l'SDK, inizializza l'UI di autenticazione.
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
Configurare i metodi di accesso
Prima di poter utilizzare Firebase per consentire agli utenti di accedere, devi attivare e configurare i metodi di accesso che vuoi supportare.
Indirizzo email e password
Nella console Firebase, vai a Sicurezza > Autenticazione.
Nella scheda Metodo di accesso, attiva il provider di accesso Email/Password.
Aggiungi l'ID del fornitore di servizi email all'elenco di
signInOptionsdi FirebaseUI.ui.start('#firebaseui-auth-container', { signInOptions: [ firebase.auth.EmailAuthProvider.PROVIDER_ID ], // Other config options... });
(Facoltativo): l'
EmailAuthProviderpuò essere configurato in modo da richiedere all'utente di inserire un nome visualizzato (il valore predefinito ètrue).ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, requireDisplayName: false } ] });
Autenticazione tramite link email
Nella console Firebase, vai a Sicurezza > Autenticazione.
Nella scheda Metodo di accesso, attiva il provider di accesso Email/Password. Tieni presente che l'accesso con email/password deve essere attivato per utilizzare l'accesso con link via email.
Nella stessa sezione, attiva il provider di accesso Link via email (accesso senza password).
Fai clic su Salva.
Aggiungi l'ID provider email all'elenco di
signInOptionsdi FirebaseUI insieme al link emailsignInMethod.ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, signInMethod: firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD } ], // Other config options... });
Quando esegui il rendering dell'UI di accesso in modo condizionale (pertinente per le app a pagina singola), utilizza
ui.isPendingRedirect()per rilevare se l'URL corrisponde a un accesso con link email e se l'UI deve essere sottoposta a rendering per completare l'accesso.// Is there an email link sign-in? if (ui.isPendingRedirect()) { ui.start('#firebaseui-auth-container', uiConfig); } // This can also be done via: if (firebase.auth().isSignInWithEmailLink(window.location.href)) { ui.start('#firebaseui-auth-container', uiConfig); }
(Facoltativo): il
EmailAuthProviderper l'accesso con link via email può essere configurato per consentire o impedire all'utente di completare l'accesso su più dispositivi.È possibile definire un callback
emailLinkSignInfacoltativo per restituire la configurazionefirebase.auth.ActionCodeSettingsda utilizzare per l'invio del link. Ciò consente di specificare come può essere gestito il link, il link dinamico personalizzato, lo stato aggiuntivo nel link diretto e così via. Se non viene fornito, viene utilizzato l'URL corrente e viene attivato un flusso solo web.L'accesso con link via email in FirebaseUI-web è compatibile con FirebaseUI-Android e FirebaseUI-iOS in cui un utente che avvia il flusso da FirebaseUI-Android può aprire il link e completare l'accesso con FirebaseUI-web. Lo stesso vale per il flusso opposto.
ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, signInMethod: firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD, // Allow the user the ability to complete sign-in cross device, // including the mobile apps specified in the ActionCodeSettings // object below. forceSameDevice: false, // Used to define the optional firebase.auth.ActionCodeSettings if // additional state needs to be passed along request and whether to open // the link in a mobile app if it is installed. emailLinkSignIn: function() { return { // Additional state showPromo=1234 can be retrieved from URL on // sign-in completion in signInSuccess callback by checking // window.location.href. url: 'https://www.example.com/completeSignIn?showPromo=1234', // Custom FDL domain. dynamicLinkDomain: 'example.page.link', // Always true for email link sign-in. handleCodeInApp: true, // Whether to handle link in iOS app if installed. iOS: { bundleId: 'com.example.ios' }, // Whether to handle link in Android app if opened in an Android // device. android: { packageName: 'com.example.android', installApp: true, minimumVersion: '12' } }; } } ] });
Provider OAuth (Google, Facebook, Twitter e GitHub)
Nella console Firebase, vai a Sicurezza > Autenticazione.
Nella scheda Metodo di accesso, attiva l'accesso del provider OAuth specificato. Assicurati che siano specificati anche l'ID client OAuth e il client secret corrispondenti.
Se non l'hai ancora fatto, autorizza il dominio della tua app:
Nella console Firebase, vai alla scheda Sicurezza > Autenticazione > Impostazioni.
Nella sezione Domini autorizzati, fai clic su Aggiungi dominio e aggiungi il tuo dominio.
Aggiungi l'ID provider OAuth all'elenco di FirebaseUI
signInOptions.ui.start('#firebaseui-auth-container', { signInOptions: [ // List of OAuth providers supported. firebase.auth.GoogleAuthProvider.PROVIDER_ID, firebase.auth.FacebookAuthProvider.PROVIDER_ID, firebase.auth.TwitterAuthProvider.PROVIDER_ID, firebase.auth.GithubAuthProvider.PROVIDER_ID ], // Other config options... });
Facoltativo: per specificare ambiti personalizzati o parametri OAuth personalizzati per provider, puoi passare un oggetto anziché solo il valore del provider:
ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.GoogleAuthProvider.PROVIDER_ID, scopes: [ 'https://www.googleapis.com/auth/contacts.readonly' ], customParameters: { // Forces account selection even when one account // is available. prompt: 'select_account' } }, { provider: firebase.auth.FacebookAuthProvider.PROVIDER_ID, scopes: [ 'public_profile', 'email', 'user_likes', 'user_friends' ], customParameters: { // Forces password re-entry. auth_type: 'reauthenticate' } }, firebase.auth.TwitterAuthProvider.PROVIDER_ID, // Twitter does not support scopes. firebase.auth.EmailAuthProvider.PROVIDER_ID // Other providers don't need to be given as object. ] });
Numero di telefono
Nella console Firebase, vai a Sicurezza > Autenticazione.
Nella scheda Metodo di accesso, attiva il provider di accesso Telefono.
Se non l'hai ancora fatto, autorizza il dominio della tua app:
Nella console Firebase, vai alla scheda Sicurezza> Autenticazione > Impostazioni.
Nella sezione Domini autorizzati, fai clic su Aggiungi dominio e aggiungi il tuo dominio.
Aggiungi l'ID fornitore del numero di telefono all'elenco di
signInOptionsdi FirebaseUI.ui.start('#firebaseui-auth-container', { signInOptions: [ firebase.auth.PhoneAuthProvider.PROVIDER_ID ], // Other config options... });
(Facoltativo): PhoneAuthProvider può essere configurato con parametri reCAPTCHA personalizzati, indipendentemente dal fatto che reCAPTCHA sia visibile o invisibile (impostazione predefinita: normale). Per ulteriori dettagli, consulta la documentazione dell'API reCAPTCHA.
È possibile impostare anche il paese predefinito da selezionare nell'input del numero di telefono. Consulta l'elenco dei codici paese supportati per l'elenco completo dei codici. Se non specificato, l'input del numero di telefono verrà impostato per impostazione predefinita sugli Stati Uniti (+1).
Attualmente sono supportate le seguenti opzioni.
ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.PhoneAuthProvider.PROVIDER_ID, recaptchaParameters: { type: 'image', // 'audio' size: 'normal', // 'invisible' or 'compact' badge: 'bottomleft' //' bottomright' or 'inline' applies to invisible. }, defaultCountry: 'GB', // Set default country to the United Kingdom (+44). // For prefilling the national number, set defaultNationNumber. // This will only be observed if only phone Auth provider is used since // for multiple providers, the NASCAR screen will always render first // with a 'sign in with phone number' button. defaultNationalNumber: '1234567890', // You can also pass the full phone number string instead of the // 'defaultCountry' and 'defaultNationalNumber'. However, in this case, // the first country ID that matches the country code will be used to // populate the country selector. So for countries that share the same // country code, the selected country may not be the expected one. // In that case, pass the 'defaultCountry' instead to ensure the exact // country is selected. The 'defaultCountry' and 'defaultNationaNumber' // will always have higher priority than 'loginHint' which will be ignored // in their favor. In this case, the default country will be 'GB' even // though 'loginHint' specified the country code as '+1'. loginHint: '+11234567890' } ] });
Accedi
Per avviare il flusso di accesso FirebaseUI, inizializza l'istanza FirebaseUI passando l'istanza Auth sottostante.
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
Definisci l'elemento HTML in cui verrà eseguito il rendering del widget di accesso FirebaseUI.
<!-- The surrounding HTML is left untouched by FirebaseUI.
Your app may use that space for branding, controls and other customizations.-->
<h1>Welcome to My Awesome App</h1>
<div id="firebaseui-auth-container"></div>
<div id="loader">Loading...</div>
Specifica la configurazione di FirebaseUI (provider supportati e personalizzazioni della UI, nonché callback di successo e così via).
var uiConfig = {
callbacks: {
signInSuccessWithAuthResult: function(authResult, redirectUrl) {
// User successfully signed in.
// Return type determines whether we continue the redirect automatically
// or whether we leave that to developer to handle.
return true;
},
uiShown: function() {
// The widget is rendered.
// Hide the loader.
document.getElementById('loader').style.display = 'none';
}
},
// Will use popup for IDP Providers sign-in flow instead of the default, redirect.
signInFlow: 'popup',
signInSuccessUrl: '<url-to-redirect-to-on-success>',
signInOptions: [
// Leave the lines as is for the providers you want to offer your users.
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
firebase.auth.FacebookAuthProvider.PROVIDER_ID,
firebase.auth.TwitterAuthProvider.PROVIDER_ID,
firebase.auth.GithubAuthProvider.PROVIDER_ID,
firebase.auth.EmailAuthProvider.PROVIDER_ID,
firebase.auth.PhoneAuthProvider.PROVIDER_ID
],
// Terms of service url.
tosUrl: '<your-tos-url>',
// Privacy policy url.
privacyPolicyUrl: '<your-privacy-policy-url>'
};
Infine, esegui il rendering dell'interfaccia di autenticazione FirebaseUI:
// The start method will wait until the DOM is loaded.
ui.start('#firebaseui-auth-container', uiConfig);
Upgrade degli utenti anonimi
Abilitazione dell'upgrade degli utenti anonimi
Quando un utente anonimo accede o si registra con un account permanente, vuoi
assicurarti che possa continuare a fare ciò che stava facendo prima della registrazione.
Per farlo, imposta autoUpgradeAnonymousUsers su true quando configuri
la UI di accesso (questa opzione è disattivata per impostazione predefinita).
Gestione dei conflitti di unione dell'upgrade degli utenti anonimi
Esistono casi in cui un utente, inizialmente connesso in modo anonimo, tenta di eseguire l'upgrade
a un utente Firebase esistente. Poiché un utente esistente non può essere collegato a un altro
utente esistente, FirebaseUI attiverà il callback signInFailure con un
codice di errore firebaseui/anonymous-upgrade-merge-conflict quando si verifica quanto sopra.
L'oggetto errore conterrà anche le credenziali permanenti. L'accesso con la
credenziale permanente deve essere attivato nel callback per completare l'accesso.
Prima di poter completare l'accesso tramite
auth.signInWithCredential(error.credential), devi salvare i dati dell'utente
anonimo ed eliminarlo. Al termine dell'accesso, copia
i dati nell'utente non anonimo. L'esempio seguente illustra come funzionerebbe questo flusso.
// Temp variable to hold the anonymous user data if needed.
var data = null;
// Hold a reference to the anonymous current user.
var anonymousUser = firebase.auth().currentUser;
ui.start('#firebaseui-auth-container', {
// Whether to upgrade anonymous users should be explicitly provided.
// The user must already be signed in anonymously before FirebaseUI is
// rendered.
autoUpgradeAnonymousUsers: true,
signInSuccessUrl: '<url-to-redirect-to-on-success>',
signInOptions: [
firebase.auth.GoogleAuthProvider.PROVIDER_ID,
firebase.auth.FacebookAuthProvider.PROVIDER_ID,
firebase.auth.EmailAuthProvider.PROVIDER_ID,
firebase.auth.PhoneAuthProvider.PROVIDER_ID
],
callbacks: {
// signInFailure callback must be provided to handle merge conflicts which
// occur when an existing credential is linked to an anonymous user.
signInFailure: function(error) {
// For merge conflicts, the error.code will be
// 'firebaseui/anonymous-upgrade-merge-conflict'.
if (error.code != 'firebaseui/anonymous-upgrade-merge-conflict') {
return Promise.resolve();
}
// The credential the user tried to sign in with.
var cred = error.credential;
// Copy data from anonymous user to permanent user and delete anonymous
// user.
// ...
// Finish sign-in after data is copied.
return firebase.auth().signInWithCredential(cred);
}
}
});
Passaggi successivi
- Per saperne di più sull'utilizzo e la personalizzazione di FirebaseUI, consulta il file README.
- Se riscontri un problema in FirebaseUI e vuoi segnalarlo, utilizza Issue Tracker di GitHub.