首页 文章

使用移动代码(手机验证)登录代码已过期的Firebase身份验证

提问于
浏览
0

Firebase手机验证正确实施后,为开发人员提供验证码,必须输入验证码才能确认手机 .

当您检查Firebase提供的 verificationID 以及验证码时,您将获得验证并因此登录 .

使用此方法,用户可以确认代码并登录:

let credential = PhoneAuthProvider.provider().credential(
    withVerificationID: verificationID,
    verificationCode: verificationCode)*

PhoneAuthProvider.provider().verifyPhoneNumber(self.phoneNum.text!, uiDelegate: nil) { (verificationID, error) in
    UserDefaults.standard.set(verificationID, forKey: "authVID")
}

现在,您需要将验证码发送到登录状态 .

我得到 verificationID 并将其保存到 UserDefaults .

但在那之后,当代码过期时,我无法继续登录,因为它再次要求我提供另一个验证码 .

如何仅使用firebase生成的 verificationID 进行登录?

我试过这个方法:

Auth.auth().signIn(withCustomToken: UserDefaults.standard.string(forKey: "authVID") ?? "")

但是firebase说认证令牌无效 .

我不知道我可以使用哪种方法只使用firebase提供的令牌进行登录 .

2 回答

  • 2

    首先,您需要调用该方法来验证手机号码 . 验证手机号码后,您将在已验证的手机号码上获得 OTP . 所以写下面的方法来验证手机号码 .

    PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate: nil) { (verificationID, error) in
      if let error = error {
         // Show alert here
         return
      }
      // Sign in using the verificationID and the code sent to the user
      // Here your can store your verificationID in user default and later used for sign in. Or pass this verification id to your next view controller for OTP verification.
        UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    }
    

    当用户输入 OTP 时,在 OTP 验证屏幕中,您可以创建以下凭据以进行登录 .

    verificationId - 我们存储在UserDefault verificationCode - OTP中,它们可通过移动消息获得 .

    // Get verification Id from User Default
    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    
    let credential = PhoneAuthProvider.provider().credential(
        withVerificationID: verificationID,
        verificationCode: verificationCode)
    

    现在调用签名方法 .

    Auth.auth().signIn(with: credential) { (user, error) in
      if let error = error {
        // ...
        return
      }
      // User is signed in
      // Here sign in completed.
      }
    }
    

    登录已完成,现在您可以导航到成功登录后将打开的屏幕 .

    要在应用程序重新打开时设置主屏幕,并且想要直接设置主屏幕,请编写以下代码 .

    func setInitialViewController() {
        if Auth.auth().currentUser != nil {
            // setup home screen
        } else {
            //Setup login screen
        }
    }
    

    并从AppDelegate的 didFinishLaunchingWithOptions 方法调用上面的方法 .

    我希望这能帮到您 .

  • 0

    实际上,这正是我所做的 . 问题是,在几分钟或一天后,当我尝试使用相同的方法登录时:

    Auth.auth().signIn(with: credential) { (user, error) in
    

    Firebase返回告知凭据内使用的代码已过期:

    错误域= FIRAuthErrorDomain代码= 17051“短信代码已过期 . 请重新发送验证码再试一次 . ” UserInfo = {NSLocalizedDescription =短信代码已过期 . 请重新发送验证码再试一次 . ,error_name = ERROR_SESSION_EXPIRED}

相关问题