SwiftUI - 在 Firebase 上更新密码

Posted

技术标签:

【中文标题】SwiftUI - 在 Firebase 上更新密码【英文标题】:SwiftUI - Update password on Firebase 【发布时间】:2021-09-27 04:43:42 【问题描述】:

我正在尝试在 Firebase 上更新我的密码,但它还没有工作。希望你能帮我解决这个问题

表格

struct ChangePassword: View 
    @State var oldPassword: String = ""
    @State var newPassword: String = ""
    @State var confirmPassword : String = ""
    @ObservedObject var loginViewModel = LoginViewModel()
    var body: some View 
       ZStack 
        VStack 
            HStack 
                Text("Old Pw")
                    .poppinsRegularFont(size: 17)
                    .foregroundColor(Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))).opacity(1)
                SecureField("", text: $oldPassword)
                    .padding()
                    .font(Font.system(size: 15, weight: .medium, design: .serif))
                    .frame(width: UIScreen.main.bounds.width - 80,height: 48)
                    .background(
                        Color.black.opacity(0.1)
                    )
            
            .padding(.bottom,20)
            HStack 
                Text("New Pw")
                    .poppinsRegularFont(size: 17)
                    .foregroundColor(Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))).opacity(1)
                SecureField("", text: $newPassword)
                    .padding()
                    .font(Font.system(size: 15, weight: .medium, design: .serif))
                    .background(
                        Color.black.opacity(0.1)
                    )
            
            .padding(.bottom,20)
            HStack 
                Text("Confirm Pw")
                    .poppinsRegularFont(size: 17)
                    .foregroundColor(Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1))).opacity(1)
                SecureField("", text: $confirmPassword)
                    .padding()
                    .font(Font.system(size: 15, weight: .medium, design: .serif))
                    .background(
                        Color.black.opacity(0.1)
                    )
            
            
            Button(action: 
                loginViewModel.updatePassword(password: confirmPassword)
            ) 
                Text("Save")
            
        
       
    

函数更新密码

class LoginViewModel: ObservableObject 
 let userPassword = Auth.auth().currentUser
    var credential: AuthCredential?
    
    func updatePassword(password: String) 
        if let credential = credential 
            userPassword?.reauthenticate(with: credential )  error,_  in
                if error != nil 
                // An error happened.
               else 
                Auth.auth().currentUser?.updatePassword(to: password)  (error) in
                  // ...
                
              
            
        
    

我正在尝试在 Firebase 上更新我的密码,但它还没有工作。希望您能帮我解决这个问题.......................................

【问题讨论】:

一个叫'credential'的人从何而来? 您的 Auth.auth().currentUser?.updatePassword(to: password) 方法中一个名为“password”的人从何而来? 这是因为我自己阅读了文档。如果有不对的地方,请帮我改正 @ElTomato 我看它:firebase.google.com/docs/auth/ios/manage-users#swift 据我所知,您永远不会将 credential 传递给您的 LoginViewModel。究竟是什么问题?你已经调试过这个了吗? 【参考方案1】:

你不需要重新认证用户,请写下面的代码

Auth.auth().currentUser?.updatePassword(to: newPasswordTF.text!)  (error) in
            if let error = error as NSError? 
                
            
            // Password change sucussfully
            

          // ...
        

【讨论】:

感谢您的回答,但它有点不准确。来自 Firebase 文档 Re-authenticate a user,其中指出 一些安全敏感操作,例如删除帐户、设置主电子邮件地址和 更改密码要求用户最近登录 i> 并且在这些情况下,用户必须重新认证才能执行操作。不过,在用户最近通过身份验证的情况下,答案很好。但最好是安全而不是后悔并以崩溃告终。

以上是关于SwiftUI - 在 Firebase 上更新密码的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 中仅更新来自 Firebase 的新数据

在 Firebase 完成块中设置 @Published var 不更新 SwiftUI 视图

异步firebase调用后SwiftUI不更新变量

删除 SwiftUI 后 Firebase Firestore 不更新 UI

如何使用 SwiftUI 更新 Firebase 中的集合?

SwiftUI Firebase - 如何查询文档然后更新?