【问题标题】:Re-authenticating User Credentials Swift重新验证用户凭据 Swift
【发布时间】:2016-11-10 05:27:31
【问题描述】:

我希望在允许用户更改登录信息之前重新对用户进行身份验证。但是,由于最近的 Firebase 更新,我发现文档毫无帮助。使用 this link 我生成了以下 authenticateUser() 函数。

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

    //prompt user to re-enter info

    user?.reauthenticateWithCredential(credential, completion: { (error) in
        if error != nil
        {
            self.displayAlertMessage("Error reauthenticating user")
        }
        else
        {
            //user reauthenticated successfully
        }
    })
}

但是,我不确定如何处理 FIRAuthCredential 类型的凭据变量,以便重新验证用户。这个类的文档可以在here找到。

【问题讨论】:

    标签: ios swift authentication firebase firebase-authentication


    【解决方案1】:

    获取FIRAuthCredential 对象取决于您要使用哪个提供程序重新进行身份验证。

    电子邮件:

    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    

    脸书:

    let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.currentAccessToken().tokenString)
    

    推特:

    let credential = TwitterAuthProvider.credential(withToken: session.authToken, secret: session.authTokenSecret)
    

    谷歌:

    let authentication = user.authentication
    let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken, accessToken: authentication.accessToken)
    

    【讨论】:

    • 我在电子邮件和密码字段中输入了什么?
    • 请注意,截至 2020 年,它已略微更新为:var credential = EmailAuthProvider.credential(withEmail: email, password: password)
    • @Shredder2794 OMG 非常感谢!!!我一直在寻找这个很长时间! :)
    【解决方案2】:

    在 Swift 4 和最新的 firebase 4 中,名称发生了一些变化,但原则仍然存在。为了您的方便:

        let eMail = EmailAuthProvider.credential(withEmail: "some@email.com", password: "somepassword")
        let fb = FacebookAuthProvider.credential(withAccessToken: "xxx")
        let g = GoogleAuthProvider.credential(withIDToken: "xxx", accessToken: "xxx")
        ...
    
        Auth.auth().currentUser?.reauthenticate(with: eMail, completion: {
            [weak self]
            (error) in
            ...
        })
    

    【讨论】:

    • 让 authentication = user.authentication 缺失,我们如何获得那个 HixField ?
    • 对不起,不明白你的问题。你能说得更具体点吗?
    • 我需要更改 Google 帐户的电子邮件地址。我正在使用需要 currentUser.reauthenticate() 的 currentUser.updateEmail() 函数但是我无法获取 GIDSignIn.sharedInstance().currentUser.authentication 来获取 IdToken 和 AccessToken。 GIDSignIn.sharedInstance().currentUser 返回 nil。我正在使用 FirebaseAuthUI 进行登录和注册。而我当前的用户 = Auth.auth().currentUser 没有身份验证属性
    • 我没有使用firebaseui,抱歉
    • 电话号码重新认证怎么样?
    【解决方案3】:

    Firebase 的 documentation 目前已过时。这是处理reauthenticate的正确方法。

    let user = Auth.auth().currentUser
    
    user?.reauthenticate(with: credential, completion: { (result, error) in
       if let err = error {
          //..read error message             
       } else {
          //.. go on              
       }
    })
    

    【讨论】:

    • 如何获取凭证的邮箱和密码?
    • @Clint 我想你问的是EmailAuthProvider,你可以使用let credential = EmailAuthProvider.credential(withEmail: "example@email.com", password: "myPassword")
    • 是的,我很抱歉,这是正确的。我是否应该在电子邮件中实际输入一些内容:“电子邮件”和密码:“密码”?
    • @Clint 如果您的应用需要登录,这将是用户的电子邮件和密码。如何保存/获取用户信息取决于您。使用reauthenticate 假设您过去已经对用户进行了身份验证。所以你应该已经有了邮箱和密码,否则你需要研究如何验证不是reauthenticate
    • @Clint 您可能需要再次向用户索取密码或开始使用 NSUserDefaults 在本地保存用户密码。
    猜你喜欢
    • 2020-12-18
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多