Firebase Auth - 获取提供商 ID

Firebase Auth - get provider ID

我正在使用以下代码来检测身份验证提供程序并正确注销

static func logOut() {
    let auth = FIRAuth.auth()!
    let provider = auth.currentUser?.providerID
    switch provider! {
        case "Facebook": FBSDKLoginManager().logOut()
        case "Google": GIDSignIn.sharedInstance().signOut()
        case "Twitter": Twitter.sharedInstance().sessionStore.logOutUserID(TWTRAPIClient.withCurrentUser().userID!)
        default:
            print("Unknown provider ID: \(provider!)")
            return
    }
    try! auth.signOut()
}

但提供者始终是 "Firebase"。我究竟做错了什么? 0_o 一旦该代码在我登录 Twitter 时抛出 "Facebook"。提前致谢

更新:是的,我实际上可以在 UserDefaults 中存储身份验证提供程序,但也许这是 Firebase 错误。我正在使用 Firebase SDK 3.5.2

由于用户可以通过多个提供商登录其 Firebase 身份验证帐户,顶级提供商 ID 现在(通常)为 Firebase

但是 currentUser has a providerData property that provides information on the speciic providers. Looping over FIRAuth.auth()!.currentUser.providerData will give you the FIRUserInfo.providerID 您正在寻找。

另见关于 UID 的问题,情况类似:

Swift4解法:

   if let providerData = Auth.auth().currentUser?.providerData {
        for userInfo in providerData {
            switch userInfo.providerID {
            case "facebook.com":
                print("user is signed in with facebook")
            case "google.com":
                print("user is signed in with google")
            default:
                print("user is signed in with \(userInfo.providerID)")
            }
        }
    }

注销有一个更简单的方法:

let authUI = FUIAuth.defaultAuthUI()
do {
    try authUI?.signOut()
} catch let err {
    print(err);
}

另一方面,如果您想找到提供商并确定用户是否通过该提供商登录,请检查 accessToken。要获取 accessToken,您需要提供给提供者的特定提供者实例。

我发现最好先在 class 中声明您的供应商,方法如下:

lazy var facebookProvider = FUIFacebookAuth()
lazy var googleProvider = FUIGoogleAuth()

然后当您提供提供商时:

let providers: [FUIAuthProvider] = [ facebookProvider, googleProvider ]

当您需要特定提供者数据时:

if let providerData = Auth.auth().currentUser?.providerData {
    for userInfo in providerData {
        switch userInfo.providerID {
        case "facebook.com":
            if !facebookProvider.accessToken.isEmpty {
                print("user is signed in with facebook")
            }
        case "google.com":
            if !googleProvider.accessToken.isEmpty {
                 print("user is signed in with google")
            }
        default:
            print("user is signed in with \(userInfo.providerID)")
        }
    }
}

否则,无论用户是否实际登录,您都将获得每个提供商的信息。

我不得不JSON.stringify(currentUser.providerData) 为了看看它是如何组织的:

Stringify result

我终于找到了这样的 Auth Provider

currentUser.providerData[0].providerId

干杯,用你的代码 :)

使用 currentUser.providerData 为您提供提供者数组,每个提供者都有自己的 uid。该列表按最近用于登录的提供商排序。因此 currentUser.providerData 中的第一个元素是用户用于登录的方法。 因此 currentUser.providerData[0].providerId 将为您提供用户用于登录的方法。

// Provider Type
        struct AuthProviders {
        static let phone = "phone"
        static let facebook = "facebook.com"
        static let google = "google.com"
        static let apple = "apple.com"
    }


let providerIds = auth.currentUser?.providerData.map { [=10=].providerID }