正确实施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提供的令牌进行登录。
答案 0 :(得分: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")
}
当用户输入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
方法调用上述方法。
我希望这会对你有所帮助。
答案 1 :(得分:0)
实际上,这正是我所做的。问题是,在几分钟或一天之后,当我尝试使用相同的方法登录时:
Auth.auth().signIn(with: credential) { (user, error) in
Firebase返回告知凭证内使用的代码已过期:
错误域名= FIRAuthErrorDomain代码= 17051“短信代码已过期。请重新发送验证码再试一次。” UserInfo = {NSLocalizedDescription = SMS代码已过期。请重新发送验证码再试一次。,error_name = ERROR_SESSION_EXPIRED}
答案 2 :(得分:0)
电话身份验证并获取给定手机号码的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)
}
}