簡體   English   中英

檢測登錄用戶的 Firebase 身份驗證提供程序

[英]Detect Firebase Auth Provider for Loged in User

如何檢查我的用戶是否使用哪個身份驗證提供程序登錄到我的應用程序? 我想檢測我的用戶是否使用 Facebook auth provider 或使用 Email Provider 或使用 Google auth provider 登錄到我的應用程序。 我在 Firebase Docs 中搜索過這個,但我找不到任何正確的答案,

您可以隨時查看 Malik 指出的提供商列表。 但是,由於您可以將多個提供者鏈接到同一用戶,因此要使用多個提供者獲取當前用戶的登錄方法,您必須檢查 ID 令牌。 您需要檢查令牌中的firebase.sign_in_provider聲明。 這將為您提供用於獲取 ID 令牌的登錄方法。 要在客戶端獲取它,您需要 getIdToken 然后使用一些 JWT 解析器解析返回的 JWT。

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser.getProviderData().size() > 0) {
            //Prints Out google.com for Google Sign In, prints facebook.com for Facebook
            e("TOM", "Provider: " + firebaseUser.getProviderData().get(firebaseUser.getProviderData().size() - 1).getProviderId());

        }

您可以使用方法getIdTokenResult()用戶對象(的firebase.User ),以獲得IdTokenResult對象,其signInProvider屬性,你可以用它來檢測登入登錄的用戶的方法。

我一直對這個問題感到困惑,也很長時間沒有找到合適的解決方案。 結果證明解決方案很短:

String strProvider = FirebaseAuth.getInstance().
         getAccessToken(false).getResult().getSignInProvider();

因此, if (strProvider.equals("password"))那么身份驗證是通過電子郵件 + 密碼,
if (strProvider.equals("google.com"))那么身份驗證是通過谷歌,
if (strProvider.equals("facebook.com"))那么身份驗證是通過 Facebook 進行的。

加法

但是,使用這種單行代碼,您可以通過添加OnSuccessListener來防止異常, OnSuccessListener所示:

mAuth = FirebaseAuth.getInstance();
mAuth.getAccessToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
                @Override
                public void onSuccess(GetTokenResult getTokenResult) {
                    strProvider = getTokenResult.getSignInProvider();
                }
            });

到這里解決同樣的問題,無法找到用戶用來登錄的提供商。
我正在使用 react-firebaseui lib 為現成的 UI 開發 react-js 應用程序。
經過一番掙扎,我簡單地分析了 auth 返回的“user”對象,我們收到了一個數組“providerData”。

沒有進一步分析,我決定使用:

  const signinProvider = user.providerData[0].providerId;

就我而言,我們只使用 2 個提供商 google 和密碼。
我從“onAuthStateChanged”函數獲取用戶,如下所示:

import { fbAuth } from "./firebase";

fbAuth.onAuthStateChanged(function (user) {
    if (user) {
      console.log("authStateChanged:=====", user);
      useItFurther(user);
    } else {
      console.log("authStateChanged: no user logged in.");
      cleanUpAuthDetailsIfApplicable();
    }
  });

注意:我還沒有研究過為什么 providerData 是一個數組,該數組中還有什么,當該數組中有 1 個以上的對象時,序列可能是什么,等等。
就我而言,我們必須添加一個基於提供商的電子郵件驗證條件。 例如,對於特定域電子郵件地址,強制用戶使用特定提供商。

替代品

getProviders() 方法列表按最近用於登錄的提供程序排序。因此 getProviderData() 中的第一個元素是用戶用於登錄的方法。

FirebaseAuth.getInstance().getCurrentUser().getProviderId() 返回 firebase 的另一個原因是,無論用戶如何登錄,總是會創建一個支持 Firebase 帳戶。這有助於鏈接和取消鏈接用戶可能想要附加的帳戶多個憑據(但是您對 FirebaseUser 的看法沒有改變)。

正如提到這篇文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM