【问题标题】:Firebase Auth - get provider IDFirebase 身份验证 - 获取提供商 ID
【发布时间】:2017-01-10 12:56:26
【问题描述】:

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

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 当我登录推特时,一旦该代码抛出“Facebook”。提前致谢

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

【问题讨论】:

  • FIRAuth.auth()!.signOut() 没有成功吗?
  • @KhanXc 有效,但我认为这还不够。在 Android 中,它会导致您选择不同的 google 帐户的情况
  • 但是为什么我不能得到提供者?如果我在任何情况下都需要它。这是一个错误,或者我做错了什么

标签: ios firebase firebase-authentication swift3


【解决方案1】:
// 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 }

【讨论】:

    【解决方案2】:

    使用currentUser.providerData 可以为您提供一系列提供者,每个提供者都有自己的uid。该列表按用于登录的最新提供程序排序。因此currentUser.providerData 中的第一个元素是用户用于登录的方法。 所以currentUser.providerData[0].providerId会给你用户用来登录的方法。

    【讨论】:

    • (2021 年 11 月)对我来说,它在 providerData[0] 的 providerData[1] 处工作,它总是返回“firebase”
    【解决方案3】:

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

    Stringify result

    我终于找到了这样的Auth Provider

    currentUser.providerData[0].providerId
    

    干杯,使用您的代码:)

    【讨论】:

    • 当用户从匿名帐户转换为非匿名帐户(如 Google、Facebook 等)时,这不起作用(崩溃)。我还没有这个案例的解决方案!
    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        currentUser has a providerData property 提供有关特定提供商的信息。循环遍历 FIRAuth.auth()!.currentUser.providerData 将为您提供您正在寻找的 FIRUserInfo.providerID

        另请参阅有关 UID 的问题,它们处于类似情况:Firebase returns multiple IDs, Which is unique one?

        【讨论】:

          猜你喜欢
          • 2016-08-13
          • 1970-01-01
          • 1970-01-01
          • 2020-09-17
          • 2018-08-26
          • 2013-06-09
          • 1970-01-01
          • 2018-10-31
          • 1970-01-01
          相关资源
          最近更新 更多