אם שדרגתם ל-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 זמין רק בפרויקטים משודרגים.
במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
בכרטיסייה Sign-in method, לוחצים על Add new provider ואז על OpenID Connect.
בוחרים אם להשתמש בתהליך קוד הרשאה או בתהליך הרשאה מרומזת.
מומלץ להשתמש תמיד בתהליך קבלת הרשאה אם הספק תומך בו. זרם הענקת גישה משתמע פחות מאובטח, ולא מומלץ להשתמש בו.
נותנים שם לספק. רושמים את מזהה הספק שנוצר: משהו כמו
oidc.example-provider. תצטרכו את המזהה הזה כשתוסיפו קוד להתחברות לאפליקציה.מציינים את מזהה הלקוח, את סוד הלקוח ואת מחרוזת המנפיק של הספק. הערכים האלה צריכים להיות זהים בדיוק לערכים שהספק הקצה לכם.
שומרים את השינויים.
טיפול בתהליך הכניסה באמצעות Firebase SDK
אם אתם מפתחים אפליקציית Android, הדרך הכי קלה לאמת את המשתמשים שלכם ב-Firebase באמצעות ספק OIDC היא לטפל בכל תהליך הכניסה באמצעות Firebase Android SDK.
כדי לטפל בתהליך הכניסה באמצעות Firebase Android SDK, פועלים לפי השלבים הבאים:
יוצרים מופע של OAuthProvider באמצעות Builder עם המזהה של הספק
Kotlin
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
אופציונלי: מציינים פרמטרים נוספים של OAuth בהתאמה אישית שרוצים לשלוח עם בקשת ה-OAuth.
Kotlin
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com")
Java
// Target specific email with login hint. providerBuilder.addCustomParameter("login_hint", "user@example.com");
כדאי לבדוק עם ספק OIDC אילו פרמטרים הוא תומך. הערה: אי אפשר להעביר פרמטרים שנדרשים על ידי Firebase באמצעות התג
setCustomParameters(). הפרמטרים האלה הם client_id, response_type, redirect_uri, state, scope ו-response_mode.אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 מעבר לפרופיל הבסיסי שרוצים לבקש מספק האימות.
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. providerBuilder.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; providerBuilder.setScopes(scopes);
כדאי לבדוק עם ספק OIDC את היקפי ההרשאות שבהם הוא משתמש.
מתבצע אימות ב-Firebase באמצעות אובייקט ספק OAuth. שימו לב: בניגוד לפעולות אחרות של FirebaseAuth, הפעולה הזו תשתלט על ממשק המשתמש שלכם ותציג כרטיסייה מותאמת ב-Chrome. לכן, אל תפנו לפעילות שלכם ב-
OnSuccessListenerוב-OnFailureListenerשאתם מצרפים, כי הם ינותקו מיד כשהפעולה תתחיל בממשק המשתמש.קודם צריך לבדוק אם כבר קיבלת תשובה. אם נכנסים באמצעות השיטה הזו, הפעילות עוברת לרקע, כלומר המערכת יכולה להחזיר אותה במהלך תהליך הכניסה. כדי לוודא שלא תבקשו מהמשתמש לנסות שוב אם זה יקרה, כדאי לבדוק אם כבר יש תוצאה.
כדי לבדוק אם יש תוצאה בהמתנה, מתקשרים למספר
getPendingAuthResult:Kotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
כדי להתחיל את תהליך הכניסה, קוראים לפונקציה
startActivityForSignInWithProvider:Kotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
הדוגמאות שלמעלה מתמקדות בתהליכי כניסה, אבל יש לכם גם אפשרות לקשר ספק OIDC למשתמש קיים באמצעות
startActivityForLinkWithProvider. לדוגמה, אתם יכולים לקשר כמה ספקים לאותו משתמש, כדי שהוא יוכל להיכנס לחשבון דרך כל אחד מהם.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
אפשר להשתמש באותו דפוס עם
startActivityForReauthenticateWithProviderכדי לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
טיפול בתהליך הכניסה באופן ידני
אם כבר הטמעתם את תהליך הכניסה באמצעות OpenID Connect באפליקציה, אתם יכולים להשתמש באסימון המזהה ישירות כדי לבצע אימות ב-Firebase:
Kotlin
val providerId = "oidc.example-provider" // As registered in Firebase console. val credential = oAuthCredential(providerId) { setIdToken(idToken) // ID token from OpenID Connect flow. } Firebase.auth .signInWithCredential(credential) .addOnSuccessListener { authResult -> // User is signed in. // IdP data available in: // authResult.additionalUserInfo.profile } .addOnFailureListener { e -> // Handle failure. }
Java
AuthCredential credential = OAuthProvider .newCredentialBuilder("oidc.example-provider") // As registered in Firebase console. .setIdToken(idToken) // ID token from OpenID Connect flow. .build(); FirebaseAuth.getInstance() .signInWithCredential(credential) .addOnSuccessListener(new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in: // authResult.getAdditionalUserInfo().getProfile() } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
השלבים הבאים
אחרי שמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר, שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה נשמר כחלק מפרויקט Firebase, ואפשר להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט, בלי קשר לשיטת הכניסה של המשתמש.
-
באפליקציות, אפשר לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט
FirebaseUser. ניהול משתמשים ב-Firebase Realtime Database וב-Cloud Storage Security Rules, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה
auth, ולהשתמש בו כדי לקבוע לאילו נתונים משתמש יכול לגשת.
אתם יכולים לאפשר למשתמשים להיכנס לאפליקציה שלכם באמצעות כמה ספקי אימות על ידי קישור פרטי כניסה של ספק אימות לחשבון משתמש קיים.
כדי להוציא משתמש מהחשבון, מתקשרים אל
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();