FirebaseUI היא ספרייה שמבוססת על Firebase Authentication SDK ומספקת תהליכי ממשק משתמש להטמעה באפליקציה. FirebaseUI מספק את היתרונות הבאים:
- ספקים מרובים – תהליכי כניסה באמצעות כתובת אימייל/סיסמה, קישור באימייל, אימות בטלפון, כניסה באמצעות חשבון Google, Facebook, Twitter ו-GitHub.
- קישור חשבונות – תהליכים לקישור בטוח של חשבונות משתמשים בין ספקי זהויות.
- התאמה אישית – שינוי של סגנונות ה-CSS של FirebaseUI בהתאם לדרישות האפליקציה. בנוסף, מכיוון ש-FirebaseUI הוא קוד פתוח, אפשר ליצור ממנו פורק (fork) ולהתאים אותו אישית בדיוק לצרכים שלכם.
- הרשמה בהקשה אחת וכניסה אוטומטית – שילוב אוטומטי עם הרשמה בהקשה אחת לכניסה מהירה במכשירים שונים.
- ממשק משתמש מותאם – תמיכה ביותר מ-40 שפות.
- שדרוג משתמשים אנונימיים – היכולת לשדרג משתמשים אנונימיים באמצעות כניסה לחשבון או הרשמה. מידע נוסף זמין בקטע שדרוג משתמשים אנונימיים.
לפני שמתחילים
מוסיפים את Firebase Authentication לאפליקציית האינטרנט, ומוודאים שאתם משתמשים ב-API בגרסה 9 ואילך עם מרחבי שמות (לא ב-API המודולרי. אפשר לעיין בסרגל הצד למעלה).
אפשר לכלול את FirebaseUI באחת מהאפשרויות הבאות:
CDN
מוסיפים את הסקריפט ואת קובץ ה-CSS הבאים לתג <head> של הדף, מתחת לקטע הקוד של האיפוס ממסוף 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" />
מודול npm
מתקינים את FirebaseUI ואת יחסי התלות שלו באמצעות npm באמצעות הפקודה הבאה:
$ npm install firebaseui --save
require
המודולים הבאים בקובצי המקור:var firebase = require('firebase'); var firebaseui = require('firebaseui');
רכיב Bower
מתקינים את FirebaseUI ואת יחסי התלות שלו באמצעות Bower באמצעות הפקודה הבאה:
$ bower install firebaseui --save
אם שרת ה-HTTP שלכם מציג את הקבצים ב-
bower_components/
, צריך לכלול את הקבצים הנדרשים ב-HTML:<script src="bower_components/firebaseui/dist/firebaseui.js"></script> <link type="text/css" rel="stylesheet" href="bower_components/firebaseui/dist/firebaseui.css" />
איך מפעילים את FirebaseUI
אחרי ייבוא ה-SDK, מפעילים את ממשק המשתמש של האימות.
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
הגדרת שיטות כניסה
כדי להשתמש ב-Firebase כדי לאפשר למשתמשים להיכנס לחשבון, צריך להפעיל ולהגדיר את שיטות הכניסה שרוצים לתמוך בהן.
כתובת אימייל וסיסמה
במסוף Firebase, פותחים את הקטע Authentication ומפעילים את האימות באמצעות כתובת אימייל וסיסמה.
מוסיפים את מזהה ספק האימייל לרשימת
signInOptions
של FirebaseUI.ui.start('#firebaseui-auth-container', { signInOptions: [ firebase.auth.EmailAuthProvider.PROVIDER_ID ], // Other config options... });
אופציונלי: אפשר להגדיר את השדה
EmailAuthProvider
כך שהמשתמש יצטרך להזין שם מוצג (ברירת המחדל היאtrue
).ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, requireDisplayName: false } ] });
אימות קישור לאימייל
במסוף Firebase, פותחים את הקטע Authentication. בכרטיסייה Sign in method, מפעילים את הספק Email/Password. חשוב לזכור: כדי להשתמש בכניסה באמצעות קישור לאימייל, צריך להפעיל את הכניסה באמצעות כתובת אימייל/סיסמה.
באותו קטע, מפעילים את שיטת הכניסה קישור לאימייל (כניסה ללא סיסמה) ולוחצים על שמירה.
מוסיפים את מזהה ספק האימייל לרשימת FirebaseUI
signInOptions
יחד עם הקישור לאימיילsignInMethod
.ui.start('#firebaseui-auth-container', { signInOptions: [ { provider: firebase.auth.EmailAuthProvider.PROVIDER_ID, signInMethod: firebase.auth.EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD } ], // Other config options... });
כשמריצים עיבוד של ממשק המשתמש לכניסה באופן מותנה (רלוונטי לאפליקציות של דף יחיד), צריך להשתמש ב-
ui.isPendingRedirect()
כדי לזהות אם כתובת ה-URL תואמת לכניסה באמצעות קישור לאימייל, ואם צריך להריץ עיבוד של ממשק המשתמש כדי להשלים את הכניסה.// 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); }
אופציונלי: אפשר להגדיר את השדה
EmailAuthProvider
לכניסה דרך קישור באימייל כדי לאפשר או לחסום את האפשרות של המשתמש להשלים כניסה במכשירים שונים.אפשר להגדיר קריאה חוזרת (callback) אופציונלית של
emailLinkSignIn
כדי להחזיר את ההגדרה שלfirebase.auth.ActionCodeSettings
שישמש לשליחת הקישור. כך תוכלו לציין איך המערכת תפעל עם הקישור, קישור דינמי בהתאמה אישית, מצב נוסף בקישור העומק וכו'. אם לא תספקו את הפרמטר הזה, המערכת תשתמש בכתובת ה-URL הנוכחית ותפעיל תהליך לשימוש באינטרנט בלבד.כניסה באמצעות קישור לאימייל ב-FirebaseUI-web תואמת ל-FirebaseUI-Android ול-FirebaseUI-iOS. משתמש אחד שמתחיל את התהליך מ-FirebaseUI-Android יכול לפתוח את הקישור ולהשלים את הכניסה באמצעות FirebaseUI-web. אותו הדבר נכון גם לזרימה ההפוכה.
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' } }; } } ] });
ספקי OAuth (Google, Facebook, Twitter ו-GitHub)
במסוף Firebase, פותחים את הקטע Authentication ומפעילים את הכניסה של ספק OAuth שצוין. חשוב לוודא שגם מזהה הלקוח והסוד התואם של OAuth צוינו.
בנוסף, בקטע Authentication, מוודאים שהדומיין שבו יתבצע הרינדור של דף הכניסה מתווסף גם לרשימת הדומיינים המורשים.
מוסיפים את מזהה ספק ה-OAuth לרשימת
signInOptions
של FirebaseUI.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... });
אופציונלי: כדי לציין היקפים מותאמים אישית או פרמטרים מותאמים אישית של OAuth לכל ספק, אפשר להעביר אובייקט במקום רק את ערך הספק:
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. ] });
מספר טלפון
במסוף Firebase, פותחים את הקטע Authentication ומפעילים את הכניסה באמצעות מספר טלפון.
חשוב לוודא שהדומיין שבו דף הכניסה יוצג נוסף גם הוא לרשימת הדומיינים המורשים.
מוסיפים את מזהה הספק של מספר הטלפון לרשימת
signInOptions
של FirebaseUI.ui.start('#firebaseui-auth-container', { signInOptions: [ firebase.auth.PhoneAuthProvider.PROVIDER_ID ], // Other config options... });
אופציונלי: אפשר להגדיר את PhoneAuthProvider עם פרמטרים מותאמים אישית של reCAPTCHA, גם אם reCAPTCHA גלוי וגם אם הוא בלתי נראה (ברירת המחדל היא 'רגיל'). פרטים נוספים זמינים במסמכי העזרה של reCAPTCHA API.
אפשר גם להגדיר את מדינה ברירת המחדל שתיבחר בהזנת מספר הטלפון. רשימת קודי המדינות הנתמכים אם לא מציינים מדינה, ברירת המחדל של מספר הטלפון תהיה ארצות הברית (+1).
האפשרויות הבאות נתמכות כרגע.
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' } ] });
כניסה
כדי להתחיל את תהליך הכניסה של FirebaseUI, מאתחלים את המכונה של FirebaseUI על ידי העברת המכונה הבסיסית של Auth
.
// Initialize the FirebaseUI Widget using Firebase.
var ui = new firebaseui.auth.AuthUI(firebase.auth());
מגדירים את רכיב ה-HTML שבו יופיע הווידג'ט של 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>
מציינים את ההגדרות של FirebaseUI (ספקים נתמכים והתאמות אישיות של ממשק המשתמש, וכן קריאות חזרה (callbacks) לאחר הצלחה וכו').
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>'
};
לבסוף, מעבדים את ממשק האימות של FirebaseUI:
// The start method will wait until the DOM is loaded.
ui.start('#firebaseui-auth-container', uiConfig);
שדרוג משתמשים אנונימיים
הפעלת שדרוג של משתמשים אנונימיים
כשמשתמש אנונימי נכנס לחשבון או נרשם לחשבון קבוע, חשוב לוודא שהוא יוכל להמשיך במה שעשה לפני ההרשמה.
כדי לעשות זאת, צריך להגדיר את autoUpgradeAnonymousUsers
לערך true
כשמגדירים את ממשק המשתמש של הכניסה (האפשרות הזו מושבתת כברירת מחדל).
טיפול בהתנגשויות במיזוג של משתמשים אנונימיים
יש מקרים שבהם משתמש שנכנס לחשבון באופן אנונימי מנסה לשדרג למשתמש קיים ב-Firebase. מכיוון שאי אפשר לקשר משתמש קיים למשתמש קיים אחר, FirebaseUI יפעיל את פונקציית ה-call back signInFailure
עם קוד השגיאה firebaseui/anonymous-upgrade-merge-conflict
במקרה כזה.
אובייקט השגיאה יכלול גם את פרטי הכניסה הקבועים. כדי להשלים את הכניסה, צריך להפעיל את הכניסה באמצעות פרטי הכניסה הקבועים בקריאה החוזרת.
כדי שתוכלו להשלים את הכניסה דרך auth.signInWithCredential(error.credential)
, עליכם לשמור את נתוני המשתמש האנונימי ולמחוק את המשתמש האנונימי. לאחר השלמת הכניסה, מעתיקים את הנתונים חזרה למשתמש שאינו אנונימי. הדוגמה הבאה ממחישה איך התהליך הזה עובד.
// 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);
}
}
});
השלבים הבאים
- למידע נוסף על השימוש ב-FirebaseUI ועל התאמה אישית שלו, אפשר לעיין בקובץ README.
- אם נתקלתם בבעיה ב-FirebaseUI ואתם רוצים לדווח עליה, תוכלו להשתמש בכלי למעקב אחר בעיות ב-GitHub.