Firebase Auth - получить идентификатор провайдера

Я использую следующий код, чтобы определить поставщика аутентификации и правильно выйти из системы

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

Ответ 1

Поскольку пользователь может войти в свою учетную запись Firebase Authentication с несколькими поставщиками, идентификатор поставщика верхнего уровня теперь (как правило) будет Firebase.

Но у currentUser есть свойство providerData которое предоставляет информацию об определенных провайдерах. Цикл по FIRAuth.auth()!.currentUser.providerData даст вам FIRUserInfo.providerID который вы ищете.

См. Также этот вопрос о UID, которые находятся в аналогичной ситуации: Firebase возвращает несколько идентификаторов, который является уникальным?

Ответ 2

Решение 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)")
            }
        }
    }

Ответ 3

Для выхода из системы существует более простой способ:

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

В противном случае вы получите информацию о каждом поставщике независимо от того, вошел ли пользователь в систему.