重新验证用户凭据 Swift

Posted

技术标签:

【中文标题】重新验证用户凭据 Swift【英文标题】:Re-authenticating User Credentials 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找到。

【问题讨论】:

【参考方案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 在本地保存用户密码。

以上是关于重新验证用户凭据 Swift的主要内容,如果未能解决你的问题,请参考以下文章

从未调用过 Swift 身份验证挑战 URLSession

在每次调用时重新验证 WCF UserNamePasswordValidator 上的凭据

OAuth 客户端凭据重新颁发访问令牌与刷新令牌

Android WebView 清除基本身份验证凭据

Swift 4 - 重新验证 FaceID

swift Swift - CloudKit - 提醒用户输入iCloud凭据