【问题标题】:Getting an error trying to reauthenticate user with Firebase尝试使用 Firebase 重新验证用户时出错
【发布时间】:2021-04-05 18:03:43
【问题描述】:

所以我的目标是让用户重新进行身份验证,然后能够更新他们的密码。所以现在我有一个警报控制器,当点击一个单元格时会显示它,并且在该警报中是 textFields 用于重新身份验证。

        var reauthEmailTextField = UITextField()
        var reauthPasswordTextField = UITextField()
        let credential: AuthCredential = EmailAuthProvider.credential(withEmail: reauthEmailTextField.text ?? "", password: reauthPasswordTextField.text ?? "")
        let reauthAlert = UIAlertController(title: "Reauthenticate", message: "In order for you to change your password, you must provide your sign-in credentials again.", preferredStyle: .alert)
        let submit = UIAlertAction(title: "Submit", style: .default) { (sub) in
            user.reauthenticate(with: credential) { (result, error) in
                guard error == nil else {
                    print("The user couldn't be reauthenticated. Email: \(reauthEmailTextField.text ?? "") Password:  \(reauthPasswordTextField.text ?? "")")
                    return
                } ...



     reauthAlert.addTextField { (reAuthEmail) in
            reauthEmailTextField = reAuthEmail
            reAuthEmail.placeholder = "Your Email"
            reAuthEmail.clearButtonMode = .whileEditing
        }
        
        reauthAlert.addTextField { (reAuthPass) in
            reauthPasswordTextField = reAuthPass
            reAuthPass.clearButtonMode = .whileEditing
            reAuthPass.placeholder = "Your Password"
            reAuthPass.isSecureTextEntry = true
        }
        
        reauthAlert.addAction(UIAlertAction(title: "Dismiss", style: .cancel))
        reauthAlert.addAction(submit)
        
        present(reauthAlert, animated: true, completion: nil)

现在,当用户成功重新验证时,它将关闭当前警报并显示新警报以实际更新用户密码。问题是,重新认证过程总是失败并且永远不会出现第二个警报。 print 语句确实打印出textFields 中的输入,所以我知道这与textFields 无关。我正在阅读一些关于重新身份验证的帖子,并将我的代码与其他代码进行比较,我确信我的语法正确,所以我真的无法理解重新身份验证不起作用的问题。有什么建议吗?

【问题讨论】:

  • 重新认证时的错误说明是什么?现在,你没有把它打印出来——你知道它在说什么吗?
  • 说密码无效或者用户没有密码,问题是我每次都用同一个密码登录,不明白怎么会无效。 @jnpdx

标签: swift firebase google-cloud-firestore firebase-authentication uialertcontroller


【解决方案1】:

您正在创建credential 对象之前用户有机会在文本字段中输入任何内容:

var reauthEmailTextField = UITextField()
var reauthPasswordTextField = UITextField()
let credential: AuthCredential = EmailAuthProvider.credential(withEmail: reauthEmailTextField.text ?? "", password: reauthPasswordTextField.text ?? "") //<-- Here

在这种情况下,您将总是为这两个值获得""

相反,您需要在submit 闭包捕获这些值:

let submit = UIAlertAction(title: "Submit", style: .default) { (sub) in

   //get text field values and build `credential` object here
   let credential: AuthCredential = EmailAuthProvider.credential(withEmail: reauthEmailTextField.text ?? "", password: reauthPasswordTextField.text ?? "")

   user.reauthenticate(with: credential) { (result, error) in
                guard error == nil else {
                    print("The user couldn't be reauthenticated. Email: \(reauthEmailTextField.text ?? "") Password:  \(reauthPasswordTextField.text ?? "")")
                    return
                } ...

【讨论】:

  • 在您发布它并发布我自己的答案时意识到了这一点,尽管谢谢。 @jnpdx
【解决方案2】:

由于某种原因,声明的定位导致了问题。我决定像这样修改方法:

  user.reauthenticate(with: EmailAuthProvider.credential(withEmail: reauthEmailTextField.text ?? "", password: reauthPasswordTextField.text ?? "")) { (result, error) in
                guard error == nil else {
                    print("The user couldn't be reauthenticated. Email: \(reauthEmailTextField.text ?? "") Password: \(reauthPasswordTextField.text ?? "")")
                    print("\(String(describing: error))")
                    return
                }

这可能不是最干净的方法,但如果鞋子合脚,请摇晃它。现在整个过程运行良好。

【讨论】:

    猜你喜欢
    • 2021-05-24
    • 1970-01-01
    • 2019-11-04
    • 2017-02-24
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多