Bạn có thể tích hợp Firebase Authentication với một hệ thống xác thực tuỳ chỉnh bằng cách sửa đổi máy chủ xác thực để tạo ra các mã thông báo đã ký tuỳ chỉnh khi người dùng đăng nhập thành công. Ứng dụng của bạn sẽ nhận được mã thông báo này và dùng mã thông báo đó để xác thực bằng Firebase.
Trước khi bắt đầu
- Thêm Firebase vào dự án C++.
- Lấy khoá máy chủ của dự án:
-
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ
Cài đặt > Tài khoản dịch vụ. - Ở cuối phần SDK của Firebase dành cho quản trị viên, hãy nhấp vào Generate New Private Key (Tạo khoá riêng tư mới).
- Cặp khoá công khai/riêng tư của tài khoản dịch vụ mới sẽ tự động lưu vào máy tính của bạn. Sao chép tệp này vào máy chủ xác thực.
-
Trong bảng điều khiển Firebase, hãy chuyển đến thẻ
Xác thực bằng Firebase
LớpAuth là cổng cho tất cả các lệnh gọi API.
- Thêm tệp tiêu đề Auth và App:
#include "firebase/app.h" #include "firebase/auth.h"
- 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__)
- Lấy lớp
firebase::auth::Authchofirebase::Appcủa bạn. Có mối liên kết một với một giữaAppvàAuth.firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
Auth::SignInWithCustomToken bằng mã thông báo từ máy chủ xác thực của bạn.
- Khi người dùng đăng nhập vào ứng dụng của bạn, hãy gửi thông tin đăng nhập của họ (ví dụ: tên người dùng và mật khẩu) đến máy chủ xác thực của bạn. Máy chủ của bạn sẽ kiểm tra thông tin đăng nhập và trả về một mã thông báo tuỳ chỉnh nếu thông tin đăng nhập đó hợp lệ.
- Sau khi nhận được mã thông báo tuỳ chỉnh từ máy chủ xác thực, hãy truyền mã thông báo đó đến
Auth::SignInWithCustomTokenđể đăng nhập người dùng:firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithCustomToken(custom_token);
- Nếu chương trình của bạn có một vòng lặp cập nhật chạy thường xuyên (chẳng hạn như 30 hoặc 60 lần mỗi giây), bạn có thể kiểm tra kết quả một lần cho mỗi lần cập nhật bằng
Auth::SignInWithCustomTokenLastResult: Hoặc nếu chương trình của bạn dựa trên sự kiện, bạn có thể muốn đăng ký một lệnh gọi lại trên Future.firebase::Future<firebase::auth::AuthResult> result = auth->SignInWithCustomTokenLastResult(); if (result.status() == firebase::kFutureStatusComplete) { if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::AuthResult auth_result = *result.result(); printf("Sign in succeeded for `%s`\n", auth_result.user.display_name().c_str()); } else { printf("Sign in failed with error '%s'\n", result.error_message()); } }
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 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
authvà 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();