Xác thực bằng Microsoft và C++

Bạn có thể cho phép người dùng xác thực với Firebase thông qua các nhà cung cấp OAuth như Microsoft Azure Active Directory bằng cách tích hợp tính năng Đăng nhập OAuth chung dựa trên nền tảng web vào ứng dụng bằng Firebase SDK để thực hiện quy trình đăng nhập toàn diện. Vì quy trình này yêu cầu sử dụng Firebase SDK dựa trên điện thoại, nên quy trình này chỉ được hỗ trợ trên các nền tảng Android và Apple.

Trước khi bắt đầu

  1. Thêm Firebase vào dự án C++.
  2. Trong bảng điều khiển của Firebase, hãy mở phần Xác thực.
  3. Trên thẻ Sign in method (Phương thức đăng nhập), hãy bật nhà cung cấp Microsoft.
  4. Thêm Mã ứng dụng kháchMật khẩu ứng dụng khách trong bảng điều khiển dành cho nhà phát triển của nhà cung cấp đó vào cấu hình của nhà cung cấp:
    1. Để đăng ký ứng dụng OAuth của Microsoft, hãy làm theo hướng dẫn trong bài viết Bắt đầu nhanh: Đăng ký ứng dụng có điểm cuối Azure Active Directory v2.0. Xin lưu ý rằng điểm cuối này hỗ trợ đăng nhập bằng tài khoản cá nhân của Microsoft cũng như tài khoản Azure Active Directory. Tìm hiểu thêm về Azure Active Directory phiên bản 2.0.
    2. Khi đăng ký ứng dụng với các nhà cung cấp này, hãy nhớ đăng ký miền *.firebaseapp.com cho dự án của bạn dưới dạng miền chuyển hướng cho ứng dụng.
  5. Nhấp vào Lưu.

Truy cập vào lớp firebase::auth::Auth

Lớp Auth là cổng vào cho tất cả lệnh gọi API.
  1. Thêm tệp tiêu đề Ứng dụng và Xác thực:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. Trong mã khởi động của bạn, hãy tạo một lớp firebase::App.
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. Mua lớp firebase::auth::Auth cho firebase::App của bạn. Có một mối liên kết một với một giữa AppAuth.
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

Xử lý quy trình đăng nhập bằng Firebase SDK

Để xử lý quy trình đăng nhập bằng Firebase SDK, hãy làm theo các bước sau:

  1. Tạo một thực thể của FederatedOAuthProviderData được định cấu hình bằng mã nhà cung cấp phù hợp với Microsoft.

    firebase::auth::FederatedOAuthProviderData
        provider_data(firebase::auth::MicrosoftAuthProvider::kProviderId);
    
  2. Không bắt buộc: Chỉ định các thông số OAuth tuỳ chỉnh khác mà bạn muốn gửi cùng với yêu cầu OAuth.

    // Prompt user to re-authenticate to Microsoft.
    provider_data.custom_parameters["prompt"] = "login";
    
    // Target specific email with login hint.
    provider_data.custom_parameters["login_hint"] =
        "user@firstadd.onmicrosoft.com";
    

    Để biết các tham số mà Microsoft hỗ trợ, hãy xem Tài liệu về OAuth của Microsoft. Xin lưu ý rằng bạn không thể truyền các tham số bắt buộc của Firebase bằng setCustomParameters(). Các tham số này là client_id, response_type, redirect_uri, state, scoperesponse_mode.

    Để chỉ cho phép người dùng thuộc một đối tượng thuê Azure AD cụ thể đăng nhập vào ứng dụng, bạn có thể sử dụng tên miền thân thiện của đối tượng thuê Azure AD hoặc giá trị nhận dạng GUID của đối tượng thuê đó. Bạn có thể thực hiện việc này bằng cách chỉ định trường "đối tượng thuê" trong đối tượng thông số tuỳ chỉnh.

    // Optional "tenant" parameter in case you are using an Azure AD tenant.
    // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com'
    // or "common" for tenant-independent tokens.
    // The default value is "common".
    provider_data.custom_parameters["tenant"] ="TENANT_ID";
    
  3. Không bắt buộc: Chỉ định các phạm vi OAuth 2.0 khác ngoài hồ sơ cơ bản mà bạn muốn yêu cầu từ nhà cung cấp dịch vụ xác thực.

    provider_data.scopes.push_back("mail.read");
    provider_data.scopes.push_back("calendars.read");
    

    Để tìm hiểu thêm, hãy tham khảo tài liệu về các quyền và sự đồng ý của Microsoft.

  4. Sau khi định cấu hình dữ liệu của nhà cung cấp, hãy sử dụng dữ liệu đó để tạo FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. Xác thực bằng Firebase bằng đối tượng nhà cung cấp dịch vụ Xác thực. Xin lưu ý rằng không giống như các thao tác FirebaseAuth khác, thao tác này sẽ kiểm soát giao diện người dùng của bạn bằng cách bật lên một chế độ xem web để người dùng có thể nhập thông tin đăng nhập của họ.

    Để bắt đầu quy trình đăng nhập, hãy gọi SignInWithProvider:

    firebase::Future<firebase::auth::AuthResult> result =
      auth->SignInWithProvider(provider_data);
    

    Sau đó, ứng dụng của bạn có thể chờ hoặc đăng ký một lệnh gọi lại trong Future.

    Bằng cách sử dụng mã truy cập OAuth, bạn có thể gọi API Microsoft Graph.

    Không giống như các nhà cung cấp khác được tính năng Xác thực Firebase hỗ trợ, Microsoft không cung cấp URL ảnh. Thay vào đó, dữ liệu nhị phân cho ảnh hồ sơ phải được yêu cầu thông qua API Microsoft Graph.

  6. Mặc dù các ví dụ trên tập trung vào quy trình đăng nhập, nhưng bạn cũng có thể liên kết nhà cung cấp Microsoft Azure Active Directory với người dùng hiện có bằng LinkWithProvider. Ví dụ: bạn có thể liên kết nhiều nhà cung cấp với cùng một người dùng để cho phép họ đăng nhập bằng một trong hai nhà cung cấp đó.

    firebase::Future<firebase::auth::AuthResult> result = user.LinkWithProvider(provider_data);
    
  7. Bạn có thể sử dụng cùng một mẫu với ReauthenticateWithProvider để truy xuất thông tin xác thực mới cho các hoạt động nhạy cảm yêu cầu đăng nhập gần đây.

    firebase::Future<firebase::auth::AuthResult> result =
      user.ReauthenticateWithProvider(provider_data);
    

    Sau đó, ứng dụng của bạn có thể chờ hoặc đăng ký một lệnh gọi lại trong Future.

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 (chẳng hạn như 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 đã đăng nhập. Tài khoản mới này được lưu trữ như một phần trong dự án Firebase và có thể được 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 các ứ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 Quy tắc bảo mật của Cloud Storage và Cơ sở dữ liệu theo thời gian thực của Firebase, 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 sử dụng mã này để kiểm soát những 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 thông qua nhiều 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 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 một người dùng, hãy gọi SignOut():

auth->SignOut();