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

Bạn có thể cho phép người dùng xác thực bằng 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 web vào ứng dụng của bạn bằng Firebase SDK để thực hiện quy trình đăng nhập từ đầu đến cuối. 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 Firebase, hãy chuyển đến phần Bảo mật > Xác thực.
  3. Trong thẻ Phương thức đăng nhập, hãy bật trình cung cấp dịch vụ đăng nhập Microsoft.
  4. Thêm Mã ứng dụng kháchMật khẩu ứng dụng khách từ 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 nhà cung cấp:
    1. Để đăng ký một ứng dụng Microsoft OAuth, hãy làm theo hướng dẫn trong phần Hướng dẫn nhanh: Đăng ký ứng dụng bằng điểm cuối Azure Active Directory phiên bản 2.0. Xin lưu ý rằng điểm cuối này hỗ trợ đăng nhập bằng tài khoản Microsoft cá nhân 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 làm 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 cho tất cả các lệnh gọi API.
  1. Thêm tệp tiêu đề Auth và App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
  2. Trong mã khởi tạo, 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. Lấy lớp firebase::auth::Auth cho firebase::App của bạn. Có 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 phiên bản FederatedOAuthProviderData được định cấu hình bằng mã nhận dạng 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 tham số OAuth tuỳ chỉnh bổ sung 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 thông số này là client_id, response_type, redirect_uri, state, scoperesponse_mode.

    Để chỉ cho phép người dùng từ 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 "tenant" trong đối tượng tham 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ề sự đồng ý và các quyền của Microsoft.

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

    // Construct a FederatedOAuthProvider for use in Auth methods.
    firebase::auth::FederatedOAuthProvider provider(provider_data);
    
  5. Xác thực bằng Firebase thông qua đố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 một khung hiển thị web mà 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ể đợi hoặc đăng ký một lệnh gọi lại trên Future.

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

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

  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 trình cung cấp Microsoft Azure Active Directory với người dùng hiện có bằng cách sử dụ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. Mẫu này có thể dùng để truy xuất thông tin đăng nhập mới cho các thao tác nhạy cảm đòi hỏi phải đă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ể đợi hoặc đăng ký một lệnh gọi lại trên 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 (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 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 Firebase Realtime DatabaseCloud 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 đó để 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();