【问题标题】:SwiftUI - Update password on FirebaseSwiftUI - 在 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”的人从何而来?
  • 这是因为我自己阅读了文档。如果有不对的地方,请帮我改正
  • 据我所知,您永远不会将 credential 传递给您的 LoginViewModel。究竟是什么问题?你已经调试过这个了吗?

标签: swift firebase swiftui firebase-authentication


【解决方案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> 并且在这些情况下,用户必须重新认证才能执行操作。不过,在用户最近通过身份验证的情况下,答案很好。但最好是安全而不是后悔并以崩溃告终。
猜你喜欢
  • 2019-02-04
  • 2021-04-11
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 1970-01-01
相关资源
最近更新 更多