如何更改Firebase电子邮件

时间:2018-07-25 22:08:36

标签: ios swift firebase firebase-authentication

我在应用程序中实现了一个按钮,该按钮允许用户使用Firebase更改电子邮件。

 @IBAction func resetEmail(_ sender: Any) {
        let alertController = UIAlertController(title: "Change Email", message: "", preferredStyle: .alert)
        alertController.addTextField { (textField : UITextField!) -> Void in
            textField.placeholder = "Enter New Email Address"

              let saveAction = UIAlertAction(title: "Save", style: .default, handler: { (action : UIAlertAction!) -> Void in

            //Reset Email

                let currentUser = Auth.auth().currentUser
            if Auth.auth().currentUser != nil{
                currentUser?.updateEmail(to: textField.text!) { error in
                    if let error = error {
                        print(error)
                    } else {
                        print("CHANGED")
                        let user = Auth.auth().currentUser
                        let name = user?.displayName!
                        let ref = Database.database().reference().child("main").child("users_sen").child(name!).child("email")
                        ref.setValue(textField.text!)

                    }
                }
            }

            })


        alertController.addAction(saveAction)
        }
        self.present(alertController, animated: true, completion: {
            alertController.view.superview?.isUserInteractionEnabled = true
            alertController.view.superview?.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.alertClose(gesture:))))

        })
    }

但是,当我运行它时,我尝试更改电子邮件。它为我提供了 UserInfo = {NSLocalizedDescription =此操作敏感,需要最近的身份验证。重试此请求之前,请再次登录。,并告诉我重新登录以更改电子邮件。我如何避免这种情况。如何更改电子邮件而不重新登录。

这是我更改密码的方式

  // Password updated.
             let currentUser = Auth.auth().currentUser
            currentUser?.updatePassword(to: textField.text!) { error in
                if let error = error {

                } else {
                    // Password updated.
                    print("success")

                }
            }

            let userEmail = Auth.auth().currentUser?.email
            self.currentPassword = textField.text!

            let credential = EmailAuthProvider.credential(withEmail: userEmail!, password: textField.text!)

            currentUser?.reauthenticate(with: credential) { error in
                if let error = error {
                    // An error happened.
                } else {
                    // User re-authenticated.
                }
            }

3 个答案:

答案 0 :(得分:1)

要更改用户电子邮件而无需重新认证,您还可以利用Cloud Functions。行动的示例可能是:

  1. 创建一个接受用户访问令牌和新电子邮件地址作为参数的函数
  2. 在该函数中,验证访问令牌并从中获取用户ID
  3. 在函数中,调用 admin.auth().updateUser(userId, { email: newEmail })
  4. 从客户端调用新功能

注意:此解决方案的安全性较差,因为未通过其他身份验证来验证用户的意图。因此,任何掌握用户设备的人都可以更改其电子邮件地址。

答案 1 :(得分:0)

基于Firebase的documentation,在执行此类操作时,您需要重新认证用户。

  

重新认证用户一些对安全敏感的操作,例如   删除帐户,设置主要电子邮件地址并更改   密码-要求用户最近登录。如果执行   其中一项操作,而用户在不久前登录,该操作   失败并显示错误。发生这种情况时,请通过以下方式重新验证用户身份   从用户那里获取新的登录凭据并传递   重新验证WithCredential的凭据。

let user = Auth.auth().currentUser
let credential = EmailAuthProvider.credential(withEmail: "email", password: "password")

user?.reauthenticate(with: credential)
{ error in
   if let error = error {
      // An error happened.
   } else {
      // User re-authenticated.
      user?.updateEmail(to: "newemail")
      { error in

      }
   }
}   

答案 2 :(得分:0)

如果您使用电子邮件和密码来验证用户身份,则应执行以下操作。

  1. 您必须使用凭据重新认证用户
  2. 重新验证用户
  3. 更新电子邮件

之前,请不要忘记让您的班级中的当前用户并像这样导入Firebase:

public class Employee {

private Object Teacher;
...
private void readObject(java.io.ObjectInputStream in) throws Exception {
    Teacher = in.readObject();
 }
...
}

然后:

...
import Firebase
class Blabla {
...
var currentUser: User? {
   return Auth.auth().currentUser
 }

您无法直接获得 func updateUserEmail(newEmail: String, password: String) { // 1. Get the credential guard let currentEmail = currentUser?.email else {return} var credential = EmailAuthProvider.credential(withEmail: currentEmail, password: password) ,因此必须通过文本字段或其他方式向用户询问密码。

password

步骤1中所有具有相同功能的代码。