#ios #firebase #oauth #firebase-authentication
#iOS #firebase #oauth #firebase-аутентификация
Вопрос:
Я новичок в Firebase и iOS, и мне было интересно, знает ли кто-нибудь, как связать несколько поставщиков OAuth. Я следил за документами Firebase и попытался реализовать эту функцию:
func firebaseSignInWithLink(credential: FIRAuthCredential) {
FIRAuth.auth()?.signIn(with: credential, completion: { (user, error) in
if error != nil {
debugPrint("APP: there has been an error signing into firebase, perhaps another account with same email")
debugPrint("APP: (error)")
// if existing email, try linking
FIRAuth.auth()?.currentUser?.link(with: credential, completion: { (user, error) in
if error != nil {
debugPrint("APP: there has been an error signing into firebase")
debugPrint("APP: (error)")
}
else {
debugPrint("APP: successfully signed into firebase")
}
})
}
else {
debugPrint("APP: successfully signed into firebase")
}
})
}
FIRAuth.auth()?.currentUser?.link
Функция никогда не вызывается, несмотря на то, что была вызвана вышеупомянутая debugPrint("APP: (error)")
. Поскольку это не работает, я продолжаю получать сообщение об ошибке ниже:
Необязательно (Ошибка Domain=FIRAuthErrorDomain Code=17007 «Адрес электронной почты уже используется другой учетной записью». userInfo={NSLocalizedDescription= Адрес электронной почты уже используется другой учетной записью., error_name=ERROR_EMAIL_ALREADY_IN_USE, FIRAuthErrorUserInfoEmailKey=example@gmail.com })»
Будем признательны за любую помощь! Спасибо: D
Комментарии:
1. Я работаю над той же проблемой. Я еще не освоил это, но если у вас уже есть «CurrentUser» (что, я почти уверен, у вас есть), вам не следует вызывать sign-in, потому что электронная почта этого пользователя уже была связана с ДРУГИМ IDP при предыдущем входе в систему …. отсюда и ошибка, которую мы видим…
2. Я думаю, что меня смутило то, как мы можем получить объект CurrentUser, если пользователь не может войти в систему через OAuth, который вызвал ошибку. Должен ли пользователь пробовать все возможные методы аутентификации, пока он / она не выполнит успешный вход в систему и не получит объект CurrentUser, а затем должен снова войти в OAuth, чтобы связать их? :/
Ответ №1:
Я полагаю, что вы смущены инструкциями. В документации firebase говорится
Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:
- Войдите в систему пользователя, используя любого поставщика аутентификации или метод.
-
Завершите процесс входа для нового поставщика аутентификации вплоть до вызова одного из методов FIRAuth.signInWith, но не включая его. Например, получите идентификатор пользователя Google ID, Facebook access token или адрес электронной почты и пароль.
-
Получите FIRAuthCredential для нового поставщика аутентификации
Таким образом, вы не должны вызывать метод FIRAuth.signInWith. Я должен также указать, что вы хотите создать ссылку на существующую учетную запись, поэтому сначала вы должны были войти в систему, а затем вы можете связать ее. Вот почему у вас должен быть CurrentUser.
Ответ №2:
Это произошло из-за снятия флажка «Несколько учетных записей для каждого адреса электронной почты, задающего параметр firebase» в консоли firebase.
Комментарии:
1. Однако это приведет к настройке нового UID в auth… таким образом, будет существовать несколько учетных записей, а не только одна учетная запись с несколькими поставщиками. Это может вызвать проблемы, если вам требуется сохранение с использованием уникального UID для одного пользователя от нескольких поставщиков