如何确定用户是使用电子邮件和密码登录 Firebase 还是使用 google 登录?

How to determine if the user signed in to Firebase with email and password or with google sign in?

我正在为 Web 应用程序登录,我已经做到了,所以用户可以使用他们的电子邮件和密码手动登录或使用 google 登录。有没有办法确定他们使用了哪种方法?最好使用 Firebase 身份验证状态更改功能。

`firebase.auth().onAuthStateChanged(firebaseUser => {....`

我知道当您进入 Firebase 控制台日志时,您可以知道他们是如何登录的,但是有没有办法使用 JavaScript 代码来确定它?

使用 firebase.auth().currentUser.providerData 时:

可以使用currentUser来判断https://firebase.google.com/docs/reference/js/firebase.UserInfo

像这样:

firebase.auth().currentUser.providerData[0].providerId

希望对您有所帮助。

@mjrdnk 的回答是正确的,但需要注意的是,一个用户可以链接多个提供商。因此,使用 firebase.auth().currentUser.providerData[0].providerId 将始终产生相同的提供者,即使使用另一个链接的提供者进行登录也是如此。确定当前用于签名的提供者的最准确方法是检查 ID 令牌的字段:firebase.sign_in_provider

目前@mjdnk asnwer 已弃用,因为它总是给出第一个提供者而不是最后一个登录的提供者。

所以最近的解决方案是:

如前所述here

var uiConfig = {
        callbacks: {
          signInSuccessWithAuthResult: function(authResult, redirectUrl) {
            var providerId = authResult.additionalUserInfo.providerId;
            localStorage.setItem("firebaseProviderId", providerId)
            //...
          },
          //..
       }

并在页面中显示

firebase.auth().onAuthStateChanged(function (user) {
      if (user) {
        user.getIdToken().then(function (idToken) {

          $('#user').text(welcomeName + "(" + localStorage.getItem("firebaseProviderId")+ ")");
          $('#logged-in').show();
        }
    }
});

@mjrdnk 的回答是正确的,但是有些情况没有被回答覆盖,所以我发现这个解决方案在所有情况下(我已经测试过)都效果最好。

val user = firebaseAuth.currentUser

        user?.let {

        authProvider = when (it.providerData[it.providerData.size-1].providerId) {
            "phone" -> {
                ConnectedUser.LOGIN_PROVIDERS.PHONE
            }
            "password" -> {
                // Email and password
                ConnectedUser.LOGIN_PROVIDERS.EMAIL
            }
            else -> {
                ConnectedUser.LOGIN_PROVIDERS.UNKNOWN
            }
        }
.
.
.

精彩的信息来源:FirebaseUI for Auth

后面是一些提供商名称(有关更多信息,请参见上面的源代码):

ANONYMOUS_PROVIDER = "anonymous"
EMAIL_LINK_SIGN_IN_METHOD = "emailLink"
EMAIL_PASSWORD_SIGN_IN_METHOD = "password"
MICROSOFT_PROVIDER = "microsoft.com"
YAHOO_PROVIDER = "yahoo.com"
APPLE_PROVIDER = "apple.com"
PHONE = "phone"