Xác thực bằng Firebase bằng Số điện thoại và C++

Bạn có thể sử dụng tính năng Xác thực Firebase để đăng nhập 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

  1. Thêm Firebase vào C++ của bạn dự án.
  2. Nếu bạn chưa kết nối ứng dụng của mình với dự án Firebase, hãy thực hiện từ bảng điều khiển của Firebase.
  3. Tìm hiểu các yêu cầu về nền tảng để đăng nhập bằng số điện thoại:
    • Đăng nhập bằng số điện thoại chỉ dành cho nền tảng di động.
    • Trên iOS, đăng nhập bằng số điện thoại yêu cầu một 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

Xác thực chỉ dùng số điện thoại, mặc dù thuận tiện nhưng lại kém an toàn so với các phương thức hiện có khác, do sở hữu số điện thoại có thể dễ dàng chuyển giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều người dùng hồ sơ, 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 bạn sử dụng tính năng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, bạn sẽ cung cấp tính năng 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ề tính bảo mật đánh đổi khi sử dụng đă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

Để đăng nhập người dùng bằng SMS, trước tiên bạn phả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:

  1. Trong bảng điều khiển của Firebase, hãy mở phần Xác thực.
  2. Trên trang Phương thức đăng nhập, bật Số điện thoại đăng nhập.

Hạn mức yêu cầu đăng nhập bằng số điện thoại của Firebase đủ cao để hầu hết các ứng dụng sẽ không bị ảnh hưởng. Tuy nhiên, nếu bạn cần đăng nhập vào một lượng người dùng rất lớn khi xác thực qua điện thoại, bạn có thể phải nâng cấp gói giá. Xem trang giá.

Bắt đầu nhận thông báo APN (các nền tảng của Apple)

Để sử dụng phương thức 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 nhận được Thông báo APN từ Firebase. Khi bạn đăng nhập vào người dùng bằng điện thoại của họ số điện thoại lần đầu tiên trên thiết bị, tính năng Xác thực Firebase sẽ gửi một thông báo đẩy không có thông báo đến thiết bị để xác minh rằng yêu cầu đăng nhập bằng số điện thoại 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 để dùng với tính năng Xác thực Firebase:

  1. Trong Xcode, bật thông báo đẩy cho dự án của bạn.
  2. Tải chứng chỉ APN của bạn 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.

    1. Bên trong dự án của bạn trong bảng điều khiển của Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), sau đó chọn Gửi thông báo qua đám mây.

    2. Chọn 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. Ít nhất một là là bắt buộc.

    3. Đối với mỗi chứng chỉ, hãy chọn tệp .p12 rồi 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 đă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ọ cần 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:

  1. 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 tốt nhất là bạn nên làm theo và để đặt kỳ vọng cho người dùng, bạn nên cho họ biết rằng nếu họ sử dụng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và gửi có áp dụng cước phí.

  2. Gọi PhoneAuthProvider::VerifyPhoneNumber, truyền tới đó số điện thoại của họ.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(PhoneAuthCredential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can 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);
    
    Khi bạn gọi PhoneAuthProvider::VerifyPhoneNumber, Firebase,
    • (trên iOS) gửi thông báo đẩy im lặng đến ứng dụng của bạn,
    • gửi tin nhắn SMS chứa mã xác thực tới số điện thoại và chuyển mã xác minh vào hàm hoàn tất. Bạn cần cung cấp cả mã xác minh và mã xác minh để đăng nhập vào tài khoản của người dùng.
  3. Lưu mã xác minh và khôi phục khi ứng dụng của bạn tải xong. Bằng cách làm như vậ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 chấm dứt trước khi người dùng hoàn tất luồng đăng nhập (ví dụ: trong khi chuyển sang ứng dụng SMS).

    Bạn có thể duy trì mã xác minh này theo bất kỳ cách nào bạn muốn. Nếu bạn đang viết có khung C++ đa nền tảng, nên sẽ cung cấp thông báo cho ứng dụng việc chấm dứt và khôi phục. Trên các sự kiện này, bạn có thể lưu và khôi phục, mã xác minh.

Nếu lệnh gọi đến VerifyPhoneNumber dẫn đến OnCodeSent đang được gọi trên Trình nghe, bạn có thể nhắc người dùng nhập mã xác minh khi 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ì quy trình xác minh tự động đã thành công và giờ bạn sẽ có PhoneAuthCredential để sử dụng theo cách được mô tả bên dưới.

Đăng nhập 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 từ SMS hãy đăng nhập người dùng bằng cách tạo một PhoneAuthCredential đối tượng từ mã xác minh và mã xác minh rồi chuyển đối tượng đó đến Auth::SignInWithCredential.

  1. Nhận mã xác minh từ người dùng.
  2. Tạo đối tượng Credential từ mã xác minh rồi mã xác minh.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Đăng nhập vào 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à được 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 số hoặc thông tin của nhà cung cấp dịch vụ xác thực – người dùng đã đăng nhập. Thông tin mới này được lưu trữ như một phần của dự án Firebase và có thể được dùng để xác định một người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

  • Trong ứng dụng của mình, 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 Cơ sở dữ liệu theo thời gian thực của Firebase 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 duy nhất của người dùng đã đăng nhập từ biến auth, để kiểm soát loại 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 phương thức xác thực bằng cách liên kết thông tin đăng nhập 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 một người dùng, hãy gọi SignOut():

auth->SignOut();