在 Android 上使用 Microsoft 進行驗證

您可以讓使用者使用 OAuth 供應商通過 Firebase 驗證,例如 整合網頁式一般 OAuth 登入機制的 Microsoft Azure Active Directory 進入您的應用程式,並透過 Firebase SDK 執行端對端登入流程。

事前準備

使用 Microsoft 帳戶 (Azure Active Directory 和個人) 登入使用者 Microsoft 帳戶),您必須先將 Microsoft 設為 來建立 Firebase 專案:

  1. 將 Firebase 新增至您的 Android 專案

  2. Firebase 控制台開啟「驗證」專區。
  3. 在「Sign in method」分頁中,啟用「Microsoft」供應商。
  4. 將供應商開發人員主控台中的「用戶端 ID」和「用戶端密鑰」新增至 提供者設定:
    1. 如要註冊 Microsoft OAuth 用戶端,請按照 快速入門導覽課程:使用 Azure Active Directory v2.0 端點註冊應用程式。 請注意,這個端點支援使用 Microsoft 個人帳戶和 Azure 登入 Active Directory 帳戶。 瞭解詳情 Azure Active Directory v2.0 的相關資訊。
    2. 向這些供應商註冊應用程式時,請務必註冊 專案的 *.firebaseapp.com 網域,做為專案的重新導向網域 應用程式。
  5. 按一下 [儲存]
  6. 如果您尚未指定應用程式的 SHA-1 指紋,請按照 設定頁面 也可使用 Firebase 控制台詳情請參閱 驗證用戶端 ,進一步瞭解如何取得應用程式的 SHA-1 指紋。

使用 Firebase SDK 處理登入流程

如要建構 Android 應用程式,最簡單的使用者驗證方式 使用 Microsoft 帳戶處理所有登入作業 Firebase Android SDK 流程

如要使用 Firebase Android SDK 處理登入流程,請按照下列步驟操作:

  1. 使用 Builder,搭配 提供者 ID 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 說明文件。 請注意,您無法透過 setCustomParameters()。這些參數都是 client_id response_typeredirect_uristatescoperesponse_mode

    只允許特定 Azure AD 用戶群的使用者簽署 插入應用程式,即 Azure AD 用戶群的易記網域名稱 可以使用用戶群 GUID ID。方法是指定 「用戶群」欄位的值。

    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. 使用 OAuth 提供者物件向 Firebase 進行驗證。請注意,這不像 其他 FirebaseAuth 作業,系統會彈出 自訂 Chrome 分頁。 因此,請勿在 OnSuccessListener 中參照活動 以及您附加的 OnFailureListener。這些容器會在 作業就會啟動 UI

    請先檢查是否已收到回覆。登入身分: 此方法會將活動置於背景,也就是說, 卻是由系統回收。為了確保 如果遇到這種情形,請不要讓使用者再試一次 結果已經存在

    如要查看是否有待處理的結果,請呼叫 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.
                        }
                    });

    成功完成後, 可以從傳回的 OAuthCredential 物件中擷取。

    使用 OAuth 存取權杖可讓您呼叫 Microsoft Graph API

    有別於 Firebase Auth 支援的其他供應商,Microsoft 不需要 提供相片網址,並改為個人資料相片的二進位資料 透過以下方式要求: Microsoft Graph API

    除了 OAuth 存取權杖外,使用者的 OAuth ID 權杖 您也可從 OAuthCredential 物件擷取。 ID 權杖中的 sub 憑證附加資訊僅適用於應用程式,且與聯合值不相符 Firebase 驗證所使用的使用者 ID,可透過 user.getProviderData().get(0).getUid()。「oid」聲明欄位應該 使用 Azure AD 用戶群登入時,oid 憑證附加資訊會完全相同 比對。 但如果是非用戶群的情況,系統會填補 oid 欄位。聯合 ID 4b2eabcdefghijkloid 會有表單 00000000-0000-0000-4b2e-abcdefghijkl

  5. 以上範例著重登入流程,不過您可以 能讓您使用 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 即時資料庫和 Cloud Storage 中 查看安全性規則即可 透過 auth 變數取得已登入使用者的不重複使用者 ID。 控管使用者可以存取的資料

您可以讓使用者透過多重驗證機制登入您的應用程式 將驗證供應商憑證連結至 現有的使用者帳戶

如要登出使用者,請呼叫 signOut

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();