אימות באמצעות Microsoft ב-Android

ניתן לאפשר למשתמשים לבצע אימות מול Firebase באמצעות ספקי OAuth כמו Microsoft Azure Active Directory על ידי שילוב OAuth התחברות כללית מבוססת-אינטרנט להיכנס לאפליקציה באמצעות Firebase SDK כדי לבצע את תהליך הכניסה מקצה לקצה.

לפני שמתחילים

כדי להיכנס למשתמשים באמצעות חשבונות Microsoft (Azure Active Directory ו-Individual חשבונות Microsoft), עליך להפעיל תחילה את Microsoft כספקית כניסה עבור לפרויקט Firebase שלכם:

  1. מוסיפים את Firebase לפרויקט Android.

  2. במסוף Firebase, פותחים את הקטע אימות.
  3. בכרטיסייה Sign in method, מפעילים את הספק Microsoft.
  4. מוסיפים את Client ID ואת Client Secret ממסוף המפתחים של הספק הזה אל תצורת ספק:
    1. כדי לרשום לקוח Microsoft OAuth, פועלים לפי ההוראות הבאות: מדריך למתחילים: רישום אפליקציה באמצעות נקודת הקצה של Azure Active Directory גרסה 2.0. חשוב לשים לב שנקודת הקצה הזו תומכת בכניסה באמצעות חשבונות Microsoft לשימוש אישי וגם באמצעות Azure חשבונות Active Directory. מידע נוסף על Azure Active Directory v2.0
    2. כשרושמים אפליקציות אצל הספקים האלה, חשוב לרשום את הדומיין *.firebaseapp.com של הפרויקט כדומיין ההפניה האוטומטית של אפליקציה.
  5. לוחצים על שמירה.
  6. אם עדיין לא ציינת את טביעת האצבע SHA-1 של האפליקציה, יש לעשות זאת דרך דף ההגדרות במסוף Firebase. פרטים נוספים אימות הלקוח לפרטים על קבלת טביעת האצבע SHA-1 של האפליקציה שלך.

איך מבצעים את תהליך הכניסה באמצעות Firebase SDK

אם מפתחים אפליקציה ל-Android, הדרך הקלה ביותר לאמת את המשתמשים עם Firebase באמצעות חשבונות Microsoft, לטפל בכל תהליך הכניסה עם ה-SDK של Firebase ל-Android.

כדי לבצע את תהליך הכניסה באמצעות ה-Android SDK של Firebase, צריך לבצע את השלבים הבאים:

  1. בניית מופע של OAuthProvider באמצעות ה-Builder שלו עם הערך מזהה הספק microsoft.com.

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("microsoft.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");

  2. אופציונלי: מציינים פרמטרים מותאמים אישית נוספים של OAuth שרוצים לשלוח עם בקשת ה-OAuth.

    Kotlin+KTX

    // Target specific email with login hint.
    // Force re-consent.
    provider.addCustomParameter("prompt", "consent")
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com")

    Java

    // Target specific email with login hint.
    // Force re-consent.
    provider.addCustomParameter("prompt", "consent");
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");

    למידע על הפרמטרים שנתמכים ב-Microsoft, ראו מסמכי תיעוד של Microsoft OAuth. שימו לב שאי אפשר להעביר פרמטרים שנדרשים ל-Firebase עם setCustomParameters() הפרמטרים האלה הם client_id, response_type, redirect_uri, state, scope וגם response_mode.

    כדי לאפשר רק למשתמשים מדייר (tenant) מסוים של Azure AD לחתום באפליקציה, או שם הדומיין הידידותי של הדייר ב-Azure AD או במזהה ה-GUID של הדייר. כדי לעשות זאת, אפשר לציין ה-"tenant" באובייקט של הפרמטרים המותאמים אישית.

    Kotlin+KTX

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider.addCustomParameter("tenant", "TENANT_ID")

    Java

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider.addCustomParameter("tenant", "TENANT_ID");

  3. אופציונלי: מציינים היקפי הרשאות OAuth 2.0 נוספים מעבר לפרופיל הבסיסי שרוצים לבקש מספק האימות.

    Kotlin+KTX

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.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");
                }
            };
    provider.setScopes(scopes);

    מידע נוסף זמין מסמכי בנושא הרשאות והסכמה של Microsoft.

  4. מבצעים אימות עם 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.
                        }
                    });

    בסיום התהליך, אסימון הגישה ל-OAuth שמשויך ל אפשר לאחזר את הספק מהאובייקט OAuthCredential שמוחזר.

    באמצעות אסימון הגישה של OAuth, אפשר לקרוא ל- Microsoft Graph API.

    בניגוד לספקים אחרים שנתמכים על ידי Firebase Auth, Microsoft לא מספקים כתובת URL של תמונה, ובמקום זאת, הנתונים הבינאריים של תמונת פרופיל לשליחת בקשה דרך Microsoft Graph API.

    בנוסף לאסימון הגישה ל-OAuth, פרוטוקול OAuth של המשתמש אסימון מזהה אפשר לאחזר אותו גם מהאובייקט OAuthCredential. ההצהרה sub באסימון המזהה היא ספציפית לאפליקציה ולא תותאם להצהרה המאוחדת מזהה משתמש שמשמש את Firebase Auth ונגיש דרך user.getProviderData().get(0).getUid(). שדה ההצהרה oid צריך להיות נעשה בו שימוש. כשמשתמשים בדייר (tenant) Azure AD כדי להיכנס לחשבון, ההצהרה oid תהיה להתאים לבחירה. עם זאת, בבקשה שאינה של דייר (tenant), השדה oid מרופד. עבור מאוחד מזהה 4b2eabcdefghijkl, ל-oid יהיה טופס 00000000-0000-0000-4b2e-abcdefghijkl.

  5. הדוגמאות שלמעלה מתמקדות בתהליכי הכניסה, אבל יש גם יכולת לקשר ספק של Microsoft למשתמש קיים באמצעות 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.
                        }
                    });

  6. אפשר להשתמש באותו קו ביטול נעילה עם 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.
                        }
                    });

השלבים הבאים

אחרי שמשתמש נכנס בפעם הראשונה, נוצר חשבון משתמש חדש שמקושרות לפרטי הכניסה - כלומר שם המשתמש והסיסמה, מספר הטלפון מספר, או פרטים של ספק אימות – המשתמש נכנס באמצעותו. החדש הזה מאוחסנים כחלק מפרויקט Firebase, וניתן להשתמש בהם כדי לזהות משתמש בכל האפליקציות בפרויקט, בלי קשר לאופן שבו המשתמשים נכנסים לחשבון.

  • באפליקציות שלכם, תוכלו לקבל את פרטי הפרופיל הבסיסיים של המשתמש דרך אובייקט FirebaseUser. ראו ניהול משתמשים.

  • בתוך Firebase Realtime Database ו-Cloud Storage כללי אבטחה – מקבלים את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בהם כדי לקבוע לאילו נתונים המשתמש יוכל לגשת.

אפשר לאפשר למשתמשים להיכנס לאפליקציה באמצעות מספר סוגי אימות מספקים באמצעות קישור פרטי הכניסה של ספק האימות קיים חשבון משתמש קיים.

כדי לנתק משתמש מהחשבון, יש להתקשר אל signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();