SWIFT: использовать множественную аутентификацию с Firebase - PullRequest
0 голосов
/ 04 марта 2020

Я работаю над проектом в Swift с различными методами аутентификации (электронная почта / пароль, Facebook и Google) с Firebase

Теперь я нахожу много проблем, когда пользователь, который создал учетную запись в приложении, создает другую с помощью Facebook или Google ..

С Google кажется, что идентификатор пользователя не изменяется, но только меняет пароль , который он установил при регистрации в приложении

(это первая проблема .. Я бы не хотел, чтобы при входе в Google менялся пароль пользователя)

с Facebook Вместо этого, если я вхожу в систему с помощью Google, а затем вхожу в систему с помощью Facebook, регистрация не выполняется, поскольку он находит другого пользователя с таким же адресом электронной почты , и это вторая проблема ..

Я много читал в Интернете, но я не смог точно понять, как выполнить отдельные шаги для подключения Facebook / Google avvoint к учетная запись уже существует в приложение, созданное с использованием метода email / password ...

Я также видел много обсуждений здесь о стековере и документации Firebase , но я просто могу ' не понимаю ...

Есть ли кто-нибудь, у кого была такая же проблема или кто знает, как ее решить, объясняя шаги кода шаг за шагом? может быть, с некоторыми примерами ...

Я благодарю всех, кто может мне помочь

Это мой гугл-вход в реализацию

//MARK: - GOOGLE Sign In in Firebase

static func signInWithGoogle(user: GIDGoogleUser!, error: Error?) {
    if let error = error {
      print("\n ------- \n Autenticazione con GOOGLE Fallita:\(error) \n --------\n")
      return
    }

    guard let authentication = user.authentication else { return }

    let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)

      Auth.auth().signIn(with: credential) { (result, error) in
          if let error = error {
              print("\n ------- \n Creazione dell'User in Firebase con Google Fallita: \(error) \n---------\n")
              return
          }

        guard let uid = Auth.auth().currentUser?.uid else { return }
        saveUserStatusToKeychain(forKey: AuthKeychainKey.userLoggedIn, userLoggedIn: true)

        print(AuthManager.userLoggedIn())

          print("\n ------- \n Account Firebase con Google creato con ID:\(uid)) \n ------- \n" )

        print(user.profile.name,user.profile.familyName, user.profile.givenName, user.profile.email)

      }
}

———-

Это моя реализация входа в Facebook

static func signInWithFacebook(startController: UIViewController) {
        let loginManager = LoginManager()
        loginManager.logIn(permissions: [.publicProfile, .email], viewController: startController) { (result) in

        switch result {
                case .success(granted: _, declined: _, token: _):

                    guard let authToken = AccessToken.current?.tokenString else { return }

                    let credential = FacebookAuthProvider.credential(withAccessToken: authToken)

                    Auth.auth().signIn(with: credential) { (result, err) in
                        if err != nil {
                            print(err!)
                            return
                        }

                        print("login with facebook")

                       // guard Auth.auth().currentUser != nil else { return }
                        AuthManager.saveUserStatusToKeychain(forKey: AuthKeychainKey.userLoggedIn, userLoggedIn: true)

                        let navigationController = UINavigationController(rootViewController: HomeController())
                        navigationController.modalPresentationStyle = .fullScreen
                        navigationController.modalTransitionStyle = .crossDissolve
                        startController.present(navigationController, animated: true, completion: nil)
                    }

                    print("OK")
                case .cancelled: print("Operazione annullata dall'user")
                case .failed(let error) : print(error)
                }
        }
    }
    //MARK: - User Logout
    static func logout() {
        do {
            try Auth.auth().signOut()
            saveUserStatusToKeychain(forKey: AuthKeychainKey.userLoggedIn, userLoggedIn: false)

        } catch let signOutError as NSError {
            print ("Error signing out: %@", signOutError)
        }
    }

. На данный момент рекомендуется активировать метод доступа "Несколько учетных записей на один адрес электронной почты" , чтобы иметь одну учетную запись для каждого провайдера. или это угроза безопасности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...