簡體   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