SWIFT:对Firebase使用多重身份验证

时间:2020-03-03 22:43:09

标签: ios swift firebase-authentication facebook-login

我正在使用{strong>不同的身份验证方法(电子邮件/密码,facebook和google)和Swift

Firebase中进行项目开发

现在,当在应用程序中创建帐户的用户使用Facebook或google创建另一个帐户时,我发现很多问题。

对于 Google 用户ID 似乎没有变化,但是仅更改了他在应用中注册时设置的密码。 / p>

(这是第一个问题。我不希望使用Google登录名更改用户密码)

使用 Facebook ,如果我使用google登录,然后使用facebook登录,则登录失败,因为它找到了另一个具有相同电子邮件的用户,这是第二个问题..

我在网络上阅读了很多书,但我无法确切了解将 Facebook / Google avvoint连接到已经存在的帐户的单个步骤使用电子邮件/密码方法创建的应用...

我在这里也看到了许多关于stackover和Firebase文档的讨论,但我只是听不懂...

是否有人遇到过我的相同问题,或者知道如何通过逐步解释代码来解决该问题?也许有一些例子...

我感谢能帮助我的每个人

这是我的Google登录实现

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

在这一点上,建议激活访问方法“每个电子邮件地址多个帐户” ,以便为每个提供商使用一个帐户还是存在安全隐患?

0 个答案:

没有答案