Bạn có thể sử 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 cách sử dụng Firebase SDK.
Trước khi bắt đầu
- Thêm Firebase vào dự án C++.
- 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 thiết bị thực 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 các phương thức khác, vì quyền sở hữu số điện thoại có thể dễ dàng được chuyển giữa những 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 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 rủi ro 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 của bạn
Để cho phép người dùng đăng nhập 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 của mình:
- Trong bảng điều khiển Firebase, hãy chuyển đến phần Bảo mật > Xác thực.
- Trong thẻ Sign-in method (Phương thức đăng nhập), hãy bật nhà cung cấp dịch vụ đăng nhập Phone (Điện thoại).
-
Đặt chính sách cho 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 đặt chính sách về khu vực gửi tin nhắn SMS có thể giúp bảo vệ
ứng dụng của bạn khỏi hành vi sử dụng sai trái tin nhắn SMS. Đối với các dự án mới, chính sách mặc định không cho phép khu vực nào.
- Trong bảng điều khiển Firebase, hãy chuyển đến thẻ Security (Bảo mật) > Authentication (Xác thực) > Settings (Cài đặt).
- Trong mục Chính sách về khu vực gửi tin nhắn SMS, hãy thiết lập chính sách về khu vực gửi tin nhắn SMS.
Bắt đầu nhận thông báo APN (nền tảng của Apple)
Để sử dụng tính năng xác thực số điện thoại trên các nền tảng của Apple, ứng dụng của bạn phải có khả năng nhận thông báo APN từ Firebase. Khi bạn đăng nhập cho người dùng bằng số điện thoại của họ 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 APN để 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ỉ APN, hãy nhớ tạo một chứng chỉ trong Trung tâm thành viên dành cho nhà phát triển của Apple.
-
Trong bảng điều khiển Firebase, hãy chuyển đến phần
Cài đặt > Chung. Sau đó, hãy nhấp vào thẻ Cloud Messaging (Gửi thông báo qua đám mây). - Nhấp vào Tải chứng chỉ lên cho chứng chỉ phát triển, chứng chỉ phát hành chính thức 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
.p12và 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. Nhấp vào Lưu.
-
Trong bảng điều khiển Firebase, hãy chuyển đến phần
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 hiển thị cho người dùng 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 để đảm bảo tuân thủ các 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ọ biết 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à áp dụng mức phí tiêu chuẩn.
- Gọi
PhoneAuthProvider::VerifyPhoneNumber, truyền số điện thoại của người dùng vào đó. Khi bạn gọiclass PhoneListener : public PhoneAuthProvider::Listener { public: ~PhoneListener() override {} void OnVerificationCompleted(PhoneAuthCredential credential) override { // Auto-sms-retrieval or instant validation has succeeded (Android only). // There's no need for the end user to input the verification code manually. // `credential` can't be used instead of calling GetCredential(). } void OnVerificationFailed(const std::string& error) override { // Verification code not sent. } void OnCodeSent(const std::string& verification_id, const PhoneAuthProvider::ForceResendingToken& force_resending_token) override { // Verification code successfully sent via SMS. // Show the Screen to enter the Code. // Developer may want to save that verification_id along with other app states in case // the app is terminated before the user gets the SMS verification code. } }; PhoneListener phone_listener; PhoneAuhtOptions options; options.timeout_milliseconds = kAutoVerifyTimeOut; options.phone_number = phone_number; PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth); phone_provider->VerifyPhoneNumber(options, &phone_listener);
PhoneAuthProvider::VerifyPhoneNumber, Firebase,- (trên iOS) sẽ gửi thông báo đẩy không có âm thanh đến ứng dụng của bạn,
- gửi tin nhắn SMS chứa mã xác thực đến số điện thoại được chỉ định và chuyển 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 người dùng.
-
Lưu mã xác minh và khôi phục mã đó khi ứng dụng tải. Bằng cách này, bạn có thể đảm bảo rằng mình vẫn có 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 bất kỳ cách nào bạn muốn. Nếu bạn đang viết bằng khung C++ nhiều nền tảng, thì khung này sẽ cung cấp thông báo về việc chấm dứt và khôi phục ứng dụng. Trong các sự kiện này, bạn có thể lưu và khôi phục mã xác minh tương ứng.
Nếu lệnh gọi đến VerifyPhoneNumber dẫn đến việc OnCodeSent được gọi trên trình nghe, thì bạn có thể nhắc người dùng nhập mã xác minh khi họ nhận được mã đó trong tin nhắn SMS.
Mặt khác, nếu lệnh gọi đến VerifyPhoneNumber dẫn đến OnVerificationCompleted, 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 đối tượng PhoneAuthCredential từ mã xác minh và mã xác minh, sau đó truyền đối tượng đó đến Auth::SignInWithCredential.
- Lấy mã xác minh từ người dùng.
- Tạo đối tượng
Credentialtừ mã xác minh và mã xác minh.PhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- Đăng nhập người dùng bằng đối tượng
Credential:Future<User> future = auth_->SignInWithCredential(credential); future.OnCompletion( [](const Future<User*>& result, void*) { if (result.error() == kAuthErrorNone) { // Successful. // User is signed in. User user = *result.result(); // This should display the phone number. printf("Phone number: %s", user.phone_number().c_str()); // The phone number provider UID is the phone number itself. printf("Phone provider uid: %s", user.uid().c_str()); // The phone number providerID is 'phone' printf("Phone provider ID: %s", user.provider_id().c_str()); } else { // Error. printf("Sign in error: %s", result.error_message().c_str()); } }, nullptr);
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 của nhà cung cấp dịch vụ xác thực) mà người dùng đã dùng để đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase và có thể dùng để xác định 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 ứng dụng, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ đối tượng
firebase::auth::User:firebase::auth::User user = auth->current_user(); if (user.is_valid()) { std::string name = user.display_name(); std::string email = user.email(); std::string photo_url = user.photo_url(); // 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 firebase::auth::User::Token() instead. std::string uid = user.uid(); }
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, rồi dùng mã đó để 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 mình bằng nhiều nhà cung cấp dịch vụ xác thực bằng cách liên kết thông tin xác thực của nhà cung cấp dịch vụ xác thực với 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();