Firebase Auth UI如何处理重新认证?

时间:2017-01-18 05:59:21

标签: ios swift firebase firebase-authentication firebaseui

我在我的Swift iOS应用中使用Firebase Auth。 Google建议使用Firebase Auth UI作为"" drop in"身份验证系统,但它只处理初始登录。我现在正致力于允许用户更改个人资料,例如电子邮件和密码。

在某些地方提及进行这些更改的文档,某些更改要求用户最近登录(请参阅https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_user):

  

某些安全敏感操作(例如删除帐户,设置主电子邮件地址和更改密码)要求用户最近登录。如果您执行其中一项操作,并且用户登录时间过长之前,该操作因FIRAuthErrorCodeCredentialTooOld错误而失败。

首先,API中的任何地方都不会出现FIRAuthErrorCodeCredentialTooOld错误。

其次,文档建议使用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 UI来重新进行身份验证。但是,我不知道这是否是受制裁的方式,或者它是否会起作用,或者它是否会在将来继续发挥作用。我检查了Firebase Auth UI代码库,并且无法在任何地方调用reauthenticate()。该文档特别针对此错误调用此方法,因此我很困惑。

如果我需要构建一个完整的UI来执行重新认证,包括多个提供商,那么使用Firebase Auth UI的重点是什么?

1 个答案:

答案 0 :(得分:1)

关于错误代码,文档只需要更新。错误代码现在称为FIRAuthErrorCode.errorCodeRequiresRecentLogin

现在,就您所面临的用户界面问题而言,为什么不提供一个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)

每当您需要更改用户的电子邮件或删除其帐户时(密码重置根本不需要登录),请使用上面的代码段弹出一个警报控制器,他们可以在输入密码。

编辑:请注意,上面提供的代码强制解包当前用户的电子邮件,因此请确保您在该阶段登录用户,否则您的应用会崩溃。