繁体   English   中英

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

[英]Firebase auth with mobile code (phone auth) sign in with code expired

正确实施后,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提供的令牌进行登录。

首先,您需要调用该方法以验证手机号码。 验证手机号码后,您将获得验证手机号码的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方法中调用上述方法。

我希望这能帮到您。

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

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

Firebase返回信息,表明凭证中使用的代码已过期:

错误域= FIRAuthErrorDomain代码= 17051“ SMS代码已过期。请重新发送验证码,然后重试。” UserInfo = {NSLocalizedDescription = SMS代码已过期。 请重新发送验证码,然后重试。,error_name = ERROR_SESSION_EXPIRED}

电话验证并获得给定手机号码的OTP并验证OTP

Auth.auth().settings!.isAppVerificationDisabledForTesting = false
        PhoneAuthProvider.provider().verifyPhoneNumber(textfieldPhoneNumber.text!,uiDelegate: nil) { (verificationID, error) in
            if error != nil {
                return
            }
            let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",verificationCode: self.verificationcode)
            Auth.auth().signInAndRetrieveData(with: credential) { (authData, error) in
                if ((error) != nil) {
                    return
                }
                if let user  = authData!.user as? User {
                    authData!.user.getIDToken(completion: { user, error in })
                    if error != nil {
                        return
                    }
                    let uid = user.uid
                    let RefereshToken = user.refreshToken
                    let token = user.phoneNumber
                    print(uid)
                    print(RefereshToken as Any)
                    print(token as Any)
                }

                print(User.self as Any)

            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM