אם שדרגת ל-Firebase Authentication with Identity Platform, תוכל לאמת את המשתמשים שלך באמצעות Firebase באמצעות הספק תואם OpenID Connect (OIDC) לפי בחירתך. זה מאפשר להשתמש בספקי זהות שאינם נתמכים באופן מקורי על ידי Firebase.
לפני שאתה מתחיל
כדי להיכנס למשתמשים באמצעות ספק OIDC, תחילה עליך לאסוף מידע מהספק:
מזהה לקוח : מחרוזת ייחודית לספק המזהה את האפליקציה שלך. הספק שלך עשוי להקצות לך מזהה לקוח אחר עבור כל פלטפורמה שבה אתה תומך. זהו אחד הערכים של תביעת
aud
באסימוני זיהוי שהונפקו על ידי הספק שלך.סוד לקוח : מחרוזת סודית שבה משתמש הספק כדי לאשר בעלות על מזהה לקוח. עבור כל מזהה לקוח, תזדקק לסוד לקוח תואם. (ערך זה נדרש רק אם אתה משתמש בזרימת קוד ההסמכה , שמומלץ בחום).
מנפיק : מחרוזת המזהה את הספק שלך. ערך זה חייב להיות כתובת URL שכאשר היא מצורפת ל-/.well-known/
/.well-known/openid-configuration
-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, לחץ על הוסף ספק חדש ולאחר מכן לחץ על OpenID Connect .
בחר אם תשתמש בזרימת קוד ההרשאה או בזרימת ההענקה המרומזת .
עליך להשתמש תמיד בזרימת הקוד אם הספק שלך תומך בה . הזרימה המרומזת פחות בטוחה והשימוש בה מומלץ מאוד.
תן שם לספק זה. שימו לב למזהה הספק שנוצר: משהו כמו
oidc.example-provider
. תזדקק למזהה זה כשתוסיף קוד כניסה לאפליקציה שלך.ציין את מזהה הלקוח ואת סוד הלקוח שלך ואת מחרוזת המנפיק של הספק שלך. ערכים אלה חייבים להתאים בדיוק לערכים שהספק שלך הקצה לך.
שמור את השינויים שלך.
טפל בזרימת הכניסה עם Firebase SDK
אם אתה בונה אפליקציית Android, הדרך הקלה ביותר לאמת את המשתמשים שלך עם Firebase באמצעות ספק ה-OIDC שלך היא לטפל בכל זרימת הכניסה עם Firebase Android SDK.
כדי לטפל בזרימת הכניסה עם Firebase Android SDK, בצע את השלבים הבאים:
בנה מופע של OAuthProvider באמצעות ה- Builder שלו עם מזהה הספק
Kotlin+KTX
val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
Java
OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
אופציונלי : ציין פרמטרים נוספים של OAuth מותאמים אישית שברצונך לשלוח עם בקשת ה-OAuth.
Kotlin+KTX
// 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+KTX
// 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+KTX
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+KTX
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+KTX
// 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+KTX
// 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+KTX
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 ואחסון בענן , תוכל לקבל את מזהה המשתמש הייחודי של המשתמש
auth
ממשתנה האימות, ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.
אתה יכול לאפשר למשתמשים להיכנס לאפליקציה שלך באמצעות מספר ספקי אימות על ידי קישור אישורי ספק אימות לחשבון משתמש קיים.
כדי לצאת ממשתמש, התקשר signOut
:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();