使用 Firebase 身份验证,您可以通过向用户的电话发送短信来协助用户登录。用户可使用短信中包含的一次性代码进行登录。
本文介绍了如何使用 Firebase SDK 实现电话号码登录流程。
准备工作
-
您必须先将 Firebase Unity SDK(具体而言就是
FirebaseAuth.unitypackage
)添加至您的 Unity 项目中,然后才能使用 Firebase 身份验证。如需查找关于初始设置步骤的详细说明,请参阅将 Firebase 添加至您的 Unity 项目。
- 如果您尚未将您的应用与您的 Firebase 项目关联,请在 Firebase 控制台中进行关联。
对于 iOS 系统,请注意电话号码登录需要使用真机设备,在模拟器上无法实现。
安全考量
与其他可用的方法相比,仅使用电话号码进行身份验证的方式虽然便捷,但安全性较低,因为同一电话号码很容易流转给不同用户使用。此外,在具有多份用户个人资料的设备上,任何一位可以接收短信的用户都能使用该设备的电话号码登录帐号。
如果您在应用中使用电话号码登录机制,则应同时提供更安全的登录方法,并将使用电话号码登录的安全隐患告知用户。
为您的 Firebase 项目启用电话号码登录
要让用户能够通过短信登录,您必须先为 Firebase 项目启用电话号码登录功能,操作步骤如下:
- 在 Firebase 控制台中,打开身份验证部分。
- 在登录方法页面上,启用电话号码登录方法。
Firebase 的电话号码登录请求的配额非常充足,大多数应用都不会遇到配额问题。但是,如果您需要通过电话号码身份验证方式让数量非常多的用户登录,则可能需要升级您的定价方案。请参阅定价页面。
开始接收 APNs 通知(仅限 iOS)
要在 iOS 上使用电话号码身份验证,您的应用必须能够接收来自 Firebase 的 APNs 通知。当您首次让用户通过电话号码在设备上登录时,Firebase 身份验证会向设备发送一条静默推送通知,以验证电话号码登录请求是否来自您的应用(因此,无法在模拟器上使用电话号码登录)。
启用 APNs 通知以用于 Firebase 身份验证:
- 在 Xcode 中为您的项目启用推送通知。
将您的 APNs 证书上传到 Firebase。如果还没有 APNs 证书,请参阅配置 APNs SSL 证书。
-
在 Firebase 控制台中,在您的项目内依次选择齿轮图标、项目设置以及云消息传递标签。
-
选择开发证书和/或生产证书对应的上传证书按钮。二者需要至少上传一个。
-
请为每种证书选择 .p12 文件,并提供密码(如有)。确保此证书的软件包 ID 与您应用的软件包 ID 匹配。选择保存。
-
向用户的电话发送验证码
要启动电话号码登录流程,请向用户显示一个界面,要求其提供电话号码,然后调用 PhoneAuthProvider.VerifyPhoneNumber
,以请求 Firebase 通过短信向用户电话发送身份验证码:
-
获取用户的电话号码。
虽然相关的法律要求可能不尽相同,但为了避免用户不满,最佳做法是告知用户,如果他们选择使用电话登录,则可能会收到一条验证短信,并需按标准费率支付短信费用。
- 调用
PhoneAuthProvider.VerifyPhoneNumber
,并向其传递用户的电话号码。PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth); provider.VerifyPhoneNumber(phoneNumber, phoneAuthTimeoutMs, null, verificationCompleted: (credential) => { // Auto-sms-retrieval or instant validation has succeeded (Android only). // There is no need to input the verification code. // `credential` can be used instead of calling GetCredential(). }, verificationFailed: (error) => { // The verification code was not sent. // `error` contains a human readable explanation of the problem. }, codeSent: (id, token) => { // Verification code was successfully sent via SMS. // `id` contains the verification id that will need to passed in with // the code from the user when calling GetCredential(). // `token` can be used if the user requests the code be sent again, to // tie the two requests together. }, codeAutoRetrievalTimeout: (id) => { // Called when the auto-sms-retrieval has timed out, based on the given // timeout parameter. // `id` contains the verification id of the request that timed out. });
当您调用PhoneAuthProvider.VerifyPhoneNumber
时,- 在 iOS 中,Firebase 会向您的应用发送一条静默推送通知。
- Firebase 会向指定的电话号码发送一条包含验证码的短信,并将验证 ID 传递给您的完成函数。验证码和验证 ID 要同时具备,用户才能登录。
-
保存验证 ID,并在应用加载时将其还原。这样可确保即使您的应用在用户完成登录流程之前被终止(例如,用户切换到短信应用时),您仍然拥有有效的验证 ID。
您可以用任何方式留存验证 ID。一个简单的方法是使用
UnityEngine.PlayerPrefs
保存验证 ID。
如果传递至 codeSent
的回调函数被调用,那么您可以在用户收到验证码短信时提示用户输入验证码。
另一方面,如果 verificationCompleted
的回调函数被调用,则表示自动验证成功,您现在有了 Credential
并且可按下文所述的方式使用。
使用验证码让用户登录
在用户将短信中的验证码提供给您的应用之后,根据验证码和验证 ID 创建一个 Credential
对象并将此对象传递给 FirebaseAuth.SignInWithCredential
,以便让用户登录。
- 从用户处获取验证码。
- 根据验证码和验证 ID 创建
Credential
对象。Credential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- 使用
Credential
对象让用户登录:auth.SignInWithCredentialAsync(credential).ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception); return; } FirebaseUser newUser = task.Result; Debug.Log("User signed in successfully"); // This should display the phone number. Debug.Log("Phone number: " + newUser.PhoneNumber); // The phone number providerID is 'phone'. Debug.Log("Phone provider ID: " + newUser.ProviderId); });
后续步骤
在用户首次登录后,系统会创建一个新的用户帐号,并将其与该用户登录时使用的凭据(即用户名、密码、电话号码或者身份验证提供方信息)相关联。此新帐号存储在您的 Firebase 项目中,无论用户采用何种方式登录,您项目中的每个应用都可以使用此帐号来识别用户。
-
在您的应用中,您可以从
Firebase.Auth.FirebaseUser
对象中获取用户的个人基本信息:Firebase.Auth.FirebaseUser user = auth.CurrentUser; if (user != null) { string name = user.DisplayName; string email = user.Email; System.Uri photo_url = user.PhotoUrl; // The user's Id, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, if you // have one; use User.TokenAsync() instead. string uid = user.UserId; }
在您的 Firebase 实时数据库和 Cloud Storage 安全规则中,您可以从
auth
变量获取已登录用户的唯一用户 ID,然后利用此 ID 来控制用户可以访问哪些数据。
您可以通过将身份验证提供方凭据关联至现有用户帐号,让用户可以使用多个身份验证提供方登录您的应用。
要让用户退出帐号,请调用 SignOut()
:
auth.SignOut();