我在应用程序中实现了一个按钮,该按钮允许用户使用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.
}
}
答案 0 :(得分:1)
要更改用户电子邮件而无需重新认证,您还可以利用Cloud Functions。行动的示例可能是:
admin.auth().updateUser(userId, { email: newEmail })
注意:此解决方案的安全性较差,因为未通过其他身份验证来验证用户的意图。因此,任何掌握用户设备的人都可以更改其电子邮件地址。
答案 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)
如果您使用电子邮件和密码来验证用户身份,则应执行以下操作。
之前,请不要忘记让您的班级中的当前用户并像这样导入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中所有具有相同功能的代码。