Bạn có thể dùng Firebase Authentication để đăng nhập cho người dùng bằng cách gửi tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong tin nhắn SMS.
Tài liệu này mô tả cách triển khai quy trình đăng nhập bằng số điện thoại bằng Firebase SDK.
Trước khi bắt đầu
-
Trước khi có thể sử dụng Firebase Authentication, bạn cần thêm Firebase Unity SDK (cụ thể là
FirebaseAuth.unitypackage
) vào dự án Unity của mình.Xem hướng dẫn chi tiết về các bước thiết lập ban đầu này trong phần Thêm Firebase vào dự án Unity.
- Nếu bạn chưa kết nối ứng dụng với dự án Firebase, hãy thực hiện việc này trong bảng điều khiển Firebase.
- Tìm hiểu các yêu cầu về nền tảng đối với tính năng Đăng nhập bằng số điện thoại:
- Tính năng đăng nhập bằng số điện thoại chỉ dành cho nền tảng di động.
- Trên iOS, tính năng Đăng nhập bằng số điện thoại yêu cầu phải có thiết bị thực tế và sẽ không hoạt động trên trình mô phỏng.
Các mối lo ngại về bảo mật
Mặc dù thuận tiện, nhưng việc xác thực chỉ bằng số điện thoại sẽ kém an toàn hơn so với các phương thức khác hiện có, vì quyền sở hữu số điện thoại có thể dễ dàng chuyển giao giữa người dùng. Ngoài ra, trên các thiết bị có nhiều hồ sơ người dùng, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào một tài khoản bằng số điện thoại của thiết bị.
Nếu sử dụng phương thức đăng nhập dựa trên số điện thoại trong ứng dụng, bạn nên cung cấp phương thức này cùng với các phương thức đăng nhập an toàn hơn và thông báo cho người dùng về những điểm đánh đổi về bảo mật khi sử dụng phương thức đăng nhập bằng số điện thoại.
Bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase
Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật phương thức đăng nhập bằng số điện thoại cho dự án Firebase:
- Trong bảng điều khiển Firebase, hãy mở mục Xác thực.
- Trên trang Phương thức đăng nhập, hãy bật phương thức đăng nhập bằng Số điện thoại.
- Không bắt buộc: Trên trang Cài đặt, hãy đặt một chính sách về những khu vực mà bạn muốn cho phép hoặc từ chối gửi tin nhắn SMS. Việc thiết lập chính sách về khu vực gửi SMS có thể giúp bảo vệ ứng dụng của bạn khỏi hành vi sai trái qua SMS.
Bắt đầu nhận thông báo APNs (chỉ dành cho iOS)
Để sử dụng tính năng xác thực bằng số điện thoại trên iOS, ứng dụng của bạn phải có khả năng nhận thông báo APNs từ Firebase. Khi bạn đăng nhập cho người dùng bằng số điện thoại lần đầu tiên trên một thiết bị, Firebase Authentication sẽ gửi một thông báo đẩy thầm lặng đến thiết bị để xác minh rằng yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. (Vì lý do này, bạn không thể sử dụng tính năng đăng nhập bằng số điện thoại trên trình mô phỏng.)
Cách bật thông báo APNs để sử dụng với Firebase Authentication:
- Trong Xcode, hãy bật thông báo đẩy cho dự án của bạn.
Tải chứng chỉ APNs lên Firebase. Nếu bạn chưa có chứng chỉ APNs, hãy nhớ tạo một chứng chỉ trong Trung tâm thành viên của nhà phát triển Apple.
-
Trong dự án của bạn trên bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), rồi chọn thẻ Cloud Messaging (Nhắn tin qua đám mây).
-
Chọn nút Tải chứng chỉ lên cho chứng chỉ phát triển, chứng chỉ sản xuất hoặc cả hai. Bạn phải cung cấp ít nhất một giá trị.
-
Đối với mỗi chứng chỉ, hãy chọn tệp .p12 và cung cấp mật khẩu (nếu có). Đảm bảo mã nhận dạng gói cho chứng chỉ này khớp với mã nhận dạng gói của ứng dụng. Chọn Lưu.
-
Gửi mã xác minh đến điện thoại của người dùng
Để bắt đầu quy trình đăng nhập bằng số điện thoại, hãy cho người dùng thấy một giao diện nhắc họ cung cấp số điện thoại, sau đó gọi PhoneAuthProvider.VerifyPhoneNumber
để yêu cầu Firebase gửi mã xác thực đến điện thoại của người dùng qua SMS:
-
Lấy số điện thoại của người dùng.
Các yêu cầu pháp lý có thể khác nhau, nhưng theo phương pháp hay nhất và để đặt ra kỳ vọng cho người dùng, bạn nên thông báo cho họ rằng nếu sử dụng tính năng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và sẽ phải trả cước phí tiêu chuẩn.
- Gọi
PhoneAuthProvider.VerifyPhoneNumber
, truyền vào đó một PhoneAuthOptions chứa số điện thoại của người dùng. Khi bạn gọiPhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth); provider.VerifyPhoneNumber( new Firebase.Auth.PhoneAuthOptions { PhoneNumber = phoneNumber, TimeoutInMilliseconds = phoneAuthTimeoutMs, ForceResendingToken = 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
, Firebase,- (trên iOS), gửi một thông báo đẩy im lặng đến ứng dụng của bạn.
- Firebase sẽ gửi một tin nhắn SMS chứa mã xác thực đến số điện thoại đã chỉ định và truyền một mã xác minh đến hàm hoàn tất của bạn. Bạn sẽ cần cả mã xác minh và mã nhận dạng xác minh để đăng nhập cho người dùng.
-
Lưu mã xác minh và khôi phục mã này khi ứng dụng của bạn tải. Bằng cách này, bạn có thể đảm bảo rằng bạn vẫn có một mã xác minh hợp lệ nếu ứng dụng của bạn bị chấm dứt trước khi người dùng hoàn tất quy trình đăng nhập (ví dụ: trong khi chuyển sang ứng dụng SMS).
Bạn có thể duy trì mã xác minh theo cách bạn muốn. Một cách đơn giản là lưu mã xác minh bằng
UnityEngine.PlayerPrefs
.
Nếu lệnh gọi lại được truyền vào codeSent
được gọi, bạn có thể nhắc người dùng nhập mã xác minh khi họ nhận được mã này trong tin nhắn SMS.
Mặt khác, nếu lệnh gọi lại cho verificationCompleted
được gọi, thì quá trình xác minh tự động đã thành công và giờ đây, bạn sẽ có một PhoneAuthCredential
mà bạn có thể sử dụng như mô tả bên dưới.
Đăng nhập cho người dùng bằng mã xác minh
Sau khi người dùng cung cấp cho ứng dụng của bạn mã xác minh trong tin nhắn SMS, hãy đăng nhập cho người dùng bằng cách tạo một đối tượng PhoneAuthCredential
từ mã xác minh và mã xác minh rồi truyền đối tượng đó đến FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
.
- Lấy mã xác minh từ người dùng.
- Tạo một đối tượng
Credential
từ mã xác minh và mã nhận dạng xác minh.PhoneAuthCredential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- Đăng nhập người dùng bằng đối tượng
PhoneAuthCredential
:auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } FirebaseUser newUser = task.Result.User; 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); });
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin đăng nhập (tức là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp dịch vụ uỷ quyền) mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase của bạn và có thể dùng để xác định một người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập bằng cách nào.
-
Trong các ứng dụng, bạn có thể lấy thông tin cơ bản trong hồ sơ của người dùng từ đối tượng
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; }
Trong Firebase Realtime Database và Cloud Storage Quy tắc bảo mật, bạn có thể lấy mã nhận dạng người dùng riêng biệt của người dùng đã đăng nhập từ biến
auth
và dùng mã nhận dạng này để kiểm soát dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của bạn bằng nhiều trình cung cấp dịch vụ xác thực bằng cách liên kết thông tin đăng nhập của trình cung cấp dịch vụ xác thực với một tài khoản người dùng hiện có.
Để đăng xuất người dùng, hãy gọi
SignOut()
:
auth.SignOut();