ios Firebase身份验证-获取提供商ID

rbl8hiat  于 2022-11-19  发布在  iOS
关注(0)|答案(7)|浏览(186)

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

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”。提前感谢
UPD:是的,我实际上可以在UserDefaults中存储auth提供程序,但可能是Firebase bug。我使用的是Firebase SDK 3.5.2

ivqmmu1c

ivqmmu1c1#

由于用户可以通过多个提供商登录到其Firebase身份验证帐户,因此顶级提供商ID现在(通常)为Firebase
但是currentUser有一个providerData属性,它提供了关于特定提供者的信息。在FIRAuth.auth()!.currentUser.providerData上循环会给予你要找的FIRUserInfo.providerID
另请参阅以下有关UID的问题,UID的情况类似:Firebase returns multiple IDs, Which is unique one?

e5nszbig

e5nszbig2#

Swift 4解决方案:

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)")
            }
        }
    }
rur96b6h

rur96b6h3#

我必须JSON.stringify(currentUser.providerData)才能看到它是如何组织的:
Stringify result
最后我找到了Auth Provider,如下所示:

currentUser.providerData[0].providerId

干杯,gl与您的代码:)

r7knjye2

r7knjye24#

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

dkqlctbz

dkqlctbz5#

// 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 { $0.providerID }
643ylb08

643ylb086#

要注销,有一种更简单的方法:

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

另一方面,如果要查找提供程序并确定用户是否通过该提供程序登录,请检查accessToken。要获取accessToken,需要提供给提供程序的特定提供程序示例。
我发现最好先在类中声明提供程序,方法如下:

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)")
        }
    }
}

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

pnwntuvh

pnwntuvh7#

2022简单Javascript解决方案(Firebase v8)

let signInMethod =
          firebase.auth().currentUser?.providerData[0]?.providerId;

相关问题