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)")
}
}
}
В противном случае вы получите информацию о каждом поставщике независимо от того, вошел ли пользователь в систему.