您可以使用 Firebase SDK 將網頁式通用 OAuth 登入功能整合至應用程式,藉此讓使用者透過 Microsoft Azure Active Directory 等 OAuth 供應商驗證 Firebase,並執行端對端登入流程。
事前準備
如要讓使用者使用 Microsoft 帳戶 (Azure Active Directory 和個人 Microsoft 帳戶) 登入,您必須先將 Microsoft 設為 Firebase 專案的登入提供者:
- 在 Firebase 控制台中,開啟「Auth」部分。
- 在「Sign in method」分頁中,啟用 Microsoft 供應器。
- 將該供應商開發人員工作室的「用戶端 ID」和「用戶端密鑰」新增至供應商設定:
- 如要註冊 Microsoft OAuth 用戶端,請按照 快速入門:使用 Azure Active Directory 2.0 端點註冊應用程式中的指示操作。請注意,這個端點支援使用 Microsoft 個人帳戶和 Azure Active Directory 帳戶登入。進一步瞭解 Azure Active Directory 2.0 版。
- 向這些供應商註冊應用程式時,請務必將專案的
*.firebaseapp.com
網域註冊為應用程式的重新導向網域。
- 按一下 [儲存]。
如果您尚未指定應用程式的 SHA-1 指紋,請前往 Firebase 控制台的「設定」頁面進行指定。如要進一步瞭解如何取得應用程式的 SHA-1 指紋,請參閱「驗證用戶端」一文。
使用 Firebase SDK 處理登入流程
如果您正在建構 Android 應用程式,透過 Firebase 使用 Microsoft 帳戶驗證使用者最簡單的方法,就是使用 Firebase Android SDK 處理整個登入流程。
如要使用 Firebase Android SDK 處理登入流程,請按照下列步驟操作:
使用提供者 ID microsoft.com 的 Builder 建構 OAuthProvider 例項。
Kotlin
val provider = OAuthProvider.newBuilder("microsoft.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
選用:指定您要透過 OAuth 要求傳送的其他自訂 OAuth 參數。
Kotlin
// 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()
傳遞 Firebase 必要參數。這些參數包括 client_id、response_type、redirect_uri、state、scope 和 response_mode。如要只允許特定 Azure AD 用戶群的使用者登入應用程式,您可以使用 Azure AD 用戶群的易記網域名稱或用戶群的 GUID ID。如要執行這項操作,請在自訂參數物件中指定「tenant」欄位。
Kotlin
// 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");
選用:指定您要向驗證服務供應器要求的其他 OAuth 2.0 範圍 (除了基本設定檔)。
Kotlin
// 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 權限和同意聲明說明文件。
使用 OAuth 提供者物件與 Firebase 進行驗證。請注意,與其他 FirebaseAuth 作業不同,這項作業會透過彈出自訂 Chrome 分頁來控制 UI。因此,請勿在您附加的
OnSuccessListener
和OnFailureListener
中參照活動,因為在作業啟動 UI 時,這兩者會立即解除連結。請先確認你是否已收到回覆。透過這種方法登入會將活動置於背景,也就是說,系統可以在登入流程中回收活動。為避免發生這種情況,請確認是否已顯示結果,以免使用者重試。
如要檢查是否有待處理的結果,請呼叫
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. } });
完成後,您可以從傳回的
OAuthCredential
物件中擷取與提供者相關聯的 OAuth 存取權權杖。您可以使用 OAuth 存取權杖呼叫 Microsoft Graph API。
與 Firebase Auth 支援的其他提供者不同,Microsoft 不會提供相片網址,而是必須透過 Microsoft Graph API 要求個人資料相片的二進位資料。
除了 OAuth 存取權杖外,您也可以從
OAuthCredential
物件擷取使用者的 OAuth ID 權杖。ID 權杖中的sub
憑證是特定於應用程式,不會與 Firebase 驗證所使用的聯合使用者 ID 相符,且可透過user.getProviderData().get(0).getUid()
存取。請改用oid
宣告欄位。使用 Azure AD 用戶群登入時,oid
權杖會完全相符。不過,如果是未分租的情況,oid
欄位會加上填充字元。對於聯合 ID4b2eabcdefghijkl
,oid
會採用00000000-0000-0000-4b2e-abcdefghijkl
的形式。雖然上述範例著重於登入流程,但您也可以使用
startActivityForLinkWithProvider
將 Microsoft 供應商連結至現有使用者。舉例來說,您可以將多個提供者連結至同一位使用者,讓他們使用任一提供者登入。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
可用於擷取敏感作業的最新憑證,這些作業需要最近的登入資訊。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. } });
後續步驟
使用者首次登入後,系統會建立新使用者帳戶,並連結至使用者登入時所用的憑證 (即使用者名稱和密碼、電話號碼或驗證服務提供者資訊)。這個新帳戶會儲存在 Firebase 專案中,無論使用者如何登入,都可以用於在專案中的每個應用程式中識別使用者。
-
在應用程式中,您可以從
FirebaseUser
物件取得使用者的個人資料基本資訊。請參閱「 管理使用者」。 在 Firebase Realtime Database 和 Cloud Storage 安全性規則中,您可以從
auth
變數取得已登入使用者的專屬使用者 ID,並利用該 ID 控管使用者可存取的資料。
您可以將驗證服務供應商憑證連結至現有使用者帳戶,讓使用者使用多個驗證服務供應商登入應用程式。
如要將使用者登出,請呼叫
signOut
:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();