具有移动代码的Firebase身份验证(电话身份验证)登录且代码已过期

0 ios firebase swift firebase-authentication

正确实施后,Firebase电话身份验证会为开发人员提供验证码,必须键入验证码以确认手机。

当您检查verificationIDFirebase提供的内容以及验证码时,您将得到验证并因此登录。

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

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")
}        
Run Code Online (Sandbox Code Playgroud)

现在,您需要发送验证码才能登录。

我得到verificationID并保存到UserDefaults

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

如何仅使用verificationIDfirebase生成的登录名?

我尝试了该方法:

Auth.auth().signIn(withCustomToken: UserDefaults.standard.string(forKey: "authVID") ?? "")
Run Code Online (Sandbox Code Playgroud)

但是firebase表示身份验证令牌无效。

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

Sag*_*han 5

首先,您需要调用该方法以验证手机号码。验证手机号码后,您将获得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")
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

现在调用签名方法。

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

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

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

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

并从AppDelegate的didFinishLaunchingWithOptions方法中调用上述方法。

我希望这能帮到您。