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

Bạn có thể sử dụng Xác thực Firebase để đăng nhập người dùng bằng cách gửi tin nhắn SMS tới đ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 luồng đăng nhập bằng số điện thoại bằng SDK Firebase.

Trước khi bắt đầu

  1. Thêm Firebase vào dự án C++ của bạ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 việc này từ bảng điều khiển Firebase .
  3. Hiểu các yêu cầu 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 thiết bị thực và sẽ không hoạt động trên trình mô phỏng.

Mối lo ngại về an ninh

Việc xác thực chỉ sử dụng số điện thoại tuy thuận tiện nhưng lại kém an toàn hơn các phương pháp hiện có khác vì việc sở hữu số điện thoại có thể dễ dàng được chuyển giao 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 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 nên 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ề những cân nhắc về bảo mật khi sử dụng tính năng đăng nhập bằng số điện thoại.

Bật đă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 phương thức đăng nhập Số điện thoại cho dự án Firebase của mình:

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

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 lớn người dùng bằng xác thực điện thoại, bạn có thể cần phải nâng cấp gói giá của mình. Xem trang định giá .

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

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

Để bật thông báo APN để sử dụng với 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 đảm bảo tạo một chứng chỉ trong Trung tâm thành viên 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 Firebase, hãy chọn biểu tượng bánh răng, chọn Cài đặt dự án rồi chọn tab Nhắn tin qua đám mây .

    2. Chọn nút Tải lên chứng chỉ cho chứng chỉ phát triển, chứng chỉ sản xuất của bạn hoặc cả hai. Ít nhất một là bắt buộc.

    3. Đố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 ID gói cho chứng chỉ này khớp với ID gói ứng dụng của bạn. Chọn Lưu .

Gửi mã xác minh tới đ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 giao diện nhắc họ cung cấp số điện thoại của mình, 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 bằng SMS:

  1. Lấy số điện thoại của người dùng.

    Các yêu cầu pháp lý khác nhau, nhưng theo phương pháp hay nhất và để đặt kỳ vọng cho người dùng, bạn nên thông báo cho họ rằng nếu họ 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 giá tiêu chuẩn.

  2. Gọi PhoneAuthProvider::VerifyPhoneNumber , chuyển tới số điện thoại của người dùng.
    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 tới ứ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 ID xác minh đến chức năng hoàn thành của bạn. Bạn sẽ cần cả mã xác minh và ID xác minh để đăng nhập người dùng.
  3. Lưu ID xác minh và khôi phục nó khi ứng dụng của bạn tải. Bằng cách đó, bạn có thể đảm bảo rằng mình vẫn có ID 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ì ID 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++ đa nền tảng, khung đó sẽ cung cấp thông báo về việc chấm dứt và khôi phục ứng dụng. Trong những sự kiện này, bạn có thể lưu và khôi phục ID xác minh tương ứng.

Nếu lệnh gọi tới VerifyPhoneNumber dẫn đến việc OnCodeSent được gọi trên Listener của bạn, 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 cuộc gọi tới VerifyPhoneNumber dẫn đến OnVerificationCompleted thì xác minh tự động đã thành công và bây giờ bạn sẽ có PhoneAuthCredential mà bạn có thể sử dụng như 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ừ tin nhắn SMS, hãy đăng nhập người dùng bằng cách tạo đối tượng PhoneAuthCredential từ mã xác minh và ID xác minh rồi chuyển đối tượng đó tới 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 và ID xác minh.
    PhoneAuthCredential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. Đă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);
    

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 xác thực—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ụ xác thực—mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định 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 Quy tắc bảo mật cơ sở dữ liệu thời gian thực và lưu trữ đám mây của Firebase, bạn có thể lấy ID người dùng duy nhất của người dùng đã đăng nhập từ biến auth và sử dụng nó để kiểm soát dữ liệu nào 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 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 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();