2017-01-18 12 views
2

Я использую Firebase Auth для моего приложения Swift iOS. Google рекомендует использовать Firebase Auth UI в качестве системы аутентификации «drop in», но он обрабатывает только начальный логин. Теперь я работаю над тем, чтобы разрешить пользователю делать изменения профиля, такие как электронная почта и пароль.Как работает Firebase Aut U UU с повторной аутентификацией?

документация для внесения этих изменений упоминается в нескольких местах, что некоторые изменения требуют, чтобы пользователь вошли в последнее время (см https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user):

Некоторые действия, такие безопасности чувствительных к удалению учетной записи, установив первичный адрес электронной почты и изменение пароля - требуется, чтобы пользователь недавно выполнил вход. Если вы выполните одно из этих действий, а пользователь уже давно зашел, действие завершится неудачно с ошибкой FIRAuthErrorCodeCredentialTooOld.

Прежде всего, не существует ошибки FIRAuthErrorCodeCredentialTooOld в любом месте API.

Во-вторых, документация предполагает использование reauthenticate(with:), чтобы решить эту проблему, с этим кодом образца:

let user = FIRAuth.auth()?.currentUser 
var credential: FIRAuthCredential 

// Prompt the user to re-provide their sign-in credentials 

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

Проблема заключается в том, что я использовал Firebase Auth UI, у меня нет пользовательского интерфейса для получения учетных данных пользователя.

Мое текущее мышление заключается в том, что я могу повторно аутентифицировать, представив тот же пользовательский интерфейс Firebase Auth, который используется для входа в систему при возникновении этой ошибки. Однако я не знаю, является ли это санкционированным способом для этого, или если он вообще будет работать, или если он будет продолжать работать в будущем. Я проверил базу кода Firebase Auth UI, и в любом месте нет ответа на reauthenticate(). Документация делает большой вызов вызова этого метода специально в случае этой ошибки, поэтому я запутался.

Если мне нужно создать полный пользовательский интерфейс для выполнения повторной аутентификации, в том числе нескольких поставщиков, то в чем смысл использования Firebase Auth UI?

ответ

1

Что касается кода ошибки, документация просто нуждается в обновлении. Код ошибки теперь называется FIRAuthErrorCode.errorCodeRequiresRecentLogin.

Теперь, с проблемой UI, с которой вы сталкиваетесь, почему бы не просто представить UIAlertController текстовое поле, которое пользователи могут использовать для ввода своих паролей для повторной аутентификации? Это, безусловно, намного проще (и удобнее для пользователя), чем создание всего контроллера представлений.

Вот довольно простой пример того, как вы можете повторно аутентификации пользователей, не проходя через столько неприятностей:

// initialize the UIAlertController for password confirmation 
let alert = UIAlertController(title: "", message: "Please, enter your password:", preferredStyle: UIAlertControllerStyle.alert) 
// add text field to the alert controller 
alert.addTextField(configurationHandler: { (textField) in 
    textField.placeholder = "Password" 
    textField.autocapitalizationType = .none 
    textField.autocorrectionType = .no 
    textField.isSecureTextEntry = true 
}) 
// delete button action 
alert.addAction(UIAlertAction(title: "Delete account", style: UIAlertActionStyle.destructive, handler: {action in 
    // retrieve textfield 
    let txtFld = alert.textFields![0] 
    // init the credentials (assuming you're using email/password authentication 
    let credential = FIREmailPasswordAuthProvider.credential(withEmail: (FIRAuth.auth()?.currentUser?.email)!, password: txtFld.text!) 
    FIRAuth.auth()?.currentUser?.reauthenticate(with: credential, completion: { (error) in 
     if error != nil { 
      // handle error - incorrect password entered is a possibility 
      return 
     } 

     // reauthentication succeeded! 
    }) 
})) 
// cancel reauthentication 
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: {action in })) 

// finally, present the alert controller 
self.present(alert, animated: true, completion: nil) 

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

РЕДАКТИРОВАТЬ: Обратите внимание, что приведенный выше код принудительно разворачивает электронную почту текущего пользователя, поэтому убедитесь, что у вас есть вход в систему на этом этапе или ваше приложение будет аварийно завершено.

+0

Конечно, но что, если пользователь вошел в систему с поставщиком, например, Facebook или Google? Нет никаких указаний на то, что эта ошибка возникает только при использовании электронной почты. –

+0

В этом случае вам сначала нужно запросить у пользователя метод входа. Вам, вероятно, понадобится правильный контроллер представления для этого не только контроллера предупреждений – ThunderStruct

+1

Спасибо, это в значительной степени то, что я ожидал.Итак, мой первоначальный вопрос остается: могу ли я просто использовать Firebase Auth UI снова для этой повторной аутентификации? Он не требует повторной проверки подлинности в любом месте. Но если это нормально, просто войдите снова, это тоже должно работать? Некоторые разъяснения от команды Firebase помогут. –

 Смежные вопросы

  • Нет связанных вопросов^_^