אם שדרגתם ל-Firebase Authentication with Identity Platform, אתם יכולים לאמת את המשתמשים שלכם באמצעות Firebase באמצעות ספק תואם OpenID Connect (OIDC) לפי בחירתכם. כך אפשר להשתמש בספקי זהויות שלא נתמכים באופן טבעי על ידי Firebase.
לפני שמתחילים
כדי להשתמש בספק OIDC כדי לאפשר למשתמשים להיכנס, צריך קודם לאסוף מהספק מידע מסוים:
מזהה לקוח: מחרוזת ייחודית לספק שמזהה את האפליקציה שלכם. יכול להיות שהספק יקצה לכם מזהה לקוח שונה לכל פלטפורמה שאתם תומכים בה. זהו אחד מהערכים של ההצהרה
audבאסימוני הזהות שהונפקו על ידי הספק.סוד הלקוח: מחרוזת סודית שהספק משתמש בה כדי לאשר את הבעלות על Client-ID. לכל מזהה לקוח צריך להיות סוד לקוח תואם. (הערך הזה נדרש רק אם משתמשים בתהליך קוד האימות, שמומלץ מאוד).
המוסד המנפיק: מחרוזת שמזהה את הספק. הערך הזה צריך להיות כתובת URL שאם מוסיפים לה את
/.well-known/openid-configuration, היא הופכת למיקום של מסמך הגילוי של ספק OIDC. לדוגמה, אם המנפיק הואhttps://auth.example.com, מסמך הגילוי צריך להיות זמין בכתובתhttps://auth.example.com/.well-known/openid-configuration.
אחרי שיש לכם את הפרטים שלמעלה, אתם יכולים להפעיל את OpenID Connect כספק כניסה לפרויקט Firebase:
אם לא שדרגתם ל-Firebase Authentication with Identity Platform, עליכם לעשות זאת. אימות OpenID Connect זמין רק בפרויקטים משודרגים.
בדף Sign-in providers (ספקי כניסה) במסוף Firebase, לוחצים על Add new provider (הוספת ספק חדש) ואז על OpenID Connect.
בוחרים אם להשתמש בתהליך קוד הרשאה או בתהליך הרשאה מרומזת.
מומלץ להשתמש תמיד בתהליך קבלת הרשאה אם הספק תומך בו. זרם הענקת גישה משתמע פחות מאובטח, ולא מומלץ להשתמש בו.
נותנים שם לספק. רושמים את מזהה הספק שנוצר: משהו כמו
oidc.example-provider. תצטרכו את המזהה הזה כשתוסיפו קוד להתחברות לאפליקציה.מציינים את מזהה הלקוח, את סוד הלקוח ואת מחרוזת המנפיק של הספק. הערכים האלה צריכים להיות זהים בדיוק לערכים שהספק הקצה לכם.
שומרים את השינויים.
טיפול בתהליך הכניסה באמצעות Firebase SDK
הדרך הכי קלה לאמת את המשתמשים שלכם באמצעות Firebase באמצעות ספק OIDC היא לטפל בתהליך הכניסה כולו באמצעות Firebase SDK.
כדי לטפל בתהליך הכניסה באמצעות Firebase JavaScript SDK, פועלים לפי השלבים הבאים:
יוצרים מופע של
OAuthProviderבאמצעות מזהה הספק שקיבלתם במסוף Firebase.Web
import { OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('oidc.example-provider');Web
var provider = new firebase.auth.OAuthProvider('oidc.example-provider');אופציונלי: מציינים פרמטרים נוספים של OAuth בהתאמה אישית שרוצים לשלוח עם בקשת ה-OAuth.
Web
provider.setCustomParameters({ // Target specific email with login hint. login_hint: 'user@example.com' });Web
provider.setCustomParameters({ // Target specific email with login hint. login_hint: 'user@example.com' });כדאי לפנות לספק כדי לקבל מידע על הפרמטרים שהוא תומך בהם. הערה: אי אפשר להעביר פרמטרים שנדרשים על ידי Firebase באמצעות התג
setCustomParameters. הפרמטרים האלה הםclient_id,response_type,redirect_uri,state,scopeו-response_mode.אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 מעבר לפרופיל הבסיסי שרוצים לבקש מספק האימות.
Web
provider.addScope('mail.read'); provider.addScope('calendars.read');Web
provider.addScope('mail.read'); provider.addScope('calendars.read');כדי לדעת אילו היקפים נתמכים, צריך לפנות לספק.
מתבצע אימות ב-Firebase באמצעות אובייקט ספק OAuth.
אפשר להפנות את המשתמש לדף הכניסה של הספק או לפתוח את דף הכניסה בחלון קופץ בדפדפן.
תהליך ההפניה לכתובת אחרת
כדי להפנות לדף הכניסה של הספק, מתקשרים אל
signInWithRedirect():Web
import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);Web
firebase.auth().signInWithRedirect(provider);אחרי שהמשתמש משלים את הכניסה וחוזר לאפליקציה, אפשר לקבל את תוצאת הכניסה על ידי קריאה ל-
getRedirectResult().Web
import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });Web
firebase.auth().getRedirectResult() .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });חלון קופץ
Web
import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // User is signed in. // IdP data available using getAdditionalUserInfo(result) // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });Web
firebase.auth().signInWithPopup(provider) .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });בדוגמאות שלמעלה התמקדנו בתהליכי כניסה, אבל אפשר להשתמש באותו דפוס כדי לקשר ספק OIDC למשתמש קיים באמצעות
linkWithRedirect()ו-linkWithPopup(), ולאמת מחדש משתמש באמצעותreauthenticateWithRedirect()ו-reauthenticateWithPopup(). אפשר להשתמש בפעולות האלה כדי לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית.
טיפול בתהליך הכניסה באופן ידני
אם כבר הטמעתם את תהליך הכניסה באמצעות OpenID Connect באפליקציה, אתם יכולים להשתמש באסימון המזהה ישירות כדי לבצע אימות ב-Firebase:
Web
import { getAuth, signInWithCredential, OAuthProvider } from "firebase/auth";
const provider = new OAuthProvider("oidc.example-provider");
const credential = provider.credential({
idToken: idToken,
});
signInWithCredential(getAuth(), credential)
.then((result) => {
// User is signed in.
// IdP data available in result.additionalUserInfo.profile.
// Get the OAuth access token and ID Token
const credential = OAuthProvider.credentialFromResult(result);
const accessToken = credential.accessToken;
const idToken = credential.idToken;
})
.catch((error) => {
// Handle error.
});
Web
const provider = new OAuthProvider("oidc.example-provider");
const credential = provider.credential({
idToken: idToken,
});
firebase.auth().signInWithCredential(credential)
.then((result) => {
// User is signed in.
// IdP data available in result.additionalUserInfo.profile.
// Get the OAuth access token and ID Token
const credential = OAuthProvider.credentialFromResult(result);
const accessToken = credential.accessToken;
const idToken = credential.idToken;
})
.catch((error) => {
// Handle error.
});