SwiftUI — Повторная проверка подлинности учетных данных пользователя (FireStore)

#swift #firebase #firebase-authentication

#swift #firebase #firebase-аутентификация

Вопрос:

Хорошо, итак, я посмотрел Онлайн и даже прочитал документы, предоставленные Google, однако, я просто не могу понять, где я ошибаюсь.

Я хочу изменить пароль учетной записи. Это мой код прямо сейчас:

 var credential: AuthCredential!

let user = Auth.auth().currentUser

VStack {
                Text("Enter new password").font(.caption).foregroundColor(Color(SYSTEM_FONT_COLOUR))
                       PasswordTextField(password: $changeLoginDetailsViewModel.newPassword)
                Spacer()
                SignInButton(action: {
                    self.user?.reauthenticate(with: self.credential) { (result, error) in
                        if let error = error {
                            print(error.localizedDescription)
                        }
                    }
                    self.changeLoginDetailsViewModel.changePassword()
                }, label: "Update Password")
            }
  

Каждый раз, когда я нажимаю на "Update password" кнопку, приложение выходит из строя. Это потому, что credential равно нулю. Итак, я провел свое исследование и нашел метод EmailAuthProvider() .
Итак, я добавил эту строку кода:

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

По этическим соображениям и наилучшей практике я не храню пароль пользователя в своей базе данных. Итак, как я могу получить доступ к паролю текущего пользователя? Без сохранения его?

Я думаю, я могу заставить пользователя ввести свой текущий пароль, который позволил бы повторную проверку подлинности, но есть ли способ, которым я могу это сделать, пока загружается представление? То есть им не требуется дважды нажимать кнопку обновления пароля? И для улучшения пользовательского интерфейса. Пользователь уже вошел в систему и не обязан входить в систему, если он не выйдет из системы.

Ответ №1:

Хорошо, поэтому, чтобы убедиться, что я всегда аутентифицировал пользователя, я потребовал, чтобы пользователь ввел свои учетные данные для входа, прежде чем даже получить возможность / просмотр обновить свои учетные данные.

Мое решение:

 Settings > Re-authentication view (explained to the user it's for security purposes) > Change password and e-mail view
  

Ответ №2:

Итак, как я могу получить доступ к паролю текущего пользователя? Без сохранения его?

Вы не можете. Аутентификация Firebase полностью управляет паролем и не предоставляет способа получить эту строку. Это может быть проблемой безопасности.

Если вы хотите разрешить пользователю изменять свой пароль, вы можете вызвать updatePassword() для объекта user. Вы заметите, что для этого не требуется текущий пароль. Тот факт, что пользователь уже вошел в систему, является доказательством того, что он владеет учетной записью. Я предлагаю также прочитать документацию по установке пароля пользователя.

Если дело, которое вы пытаетесь обработать, связано с забытым паролем, для этого существует другой процесс, отправив электронное письмо для сброса пароля.

Комментарии:

1. Я вызываю этот метод. Тем не менее, я получаю сообщение в консоли о том, что пользователю необходимо пройти повторную проверку подлинности. Это сообщение This operation is sensitive and requires recent authentication. Log in again before retrying this request. Поэтому мне нужно повторно подтвердить, что потребует либо от пользователя ввода своих учетных данных, либо я получу их сам.

2. Пожалуйста, отредактируйте вопрос, чтобы было более ясно, что происходит не так. Вы должны включить полное сообщение об ошибке и указать, какая строка кода вызвала его.