Anda dapat menggunakan layanan Google Play Game untuk memproses login pemain ke game Android yang dibuat di Firebase dan ditulis dalam C ++. Untuk menggunakan fitur login layanan Google Play Game dengan Firebase, pertama-tama proses login pemain dengan Google Play Game, dan minta kode auth OAuth 2.0 saat melakukannya. Lalu, teruskan kode auth tersebut ke PlayGamesAuthProvider
untuk membuat kredensial Firebase, yang dapat Anda gunakan untuk mengautentikasi dengan Firebase.
Sebelum memulai
Sebelum dapat menggunakan Firebase Authentication, Anda perlu:
Mendaftarkan project C++ Anda dan mengonfigurasinya agar menggunakan Firebase.
Jika project C++ Anda telah menggunakan Firebase, berarti project tersebut telah terdaftar dan dikonfigurasi untuk Firebase.
Menambahkan Firebase C++ SDK ke project C++ Anda.
Perlu diperhatikan bahwa penambahan Firebase ke project C++ Anda memerlukan tindakan baik di Firebase console maupun di project C++ yang terbuka (misalnya, Anda mendownload file konfigurasi Firebase dari konsol, lalu memindahkannya ke project C++).
Menyiapkan project Firebase Anda
Jika belum melakukannya, setel sidik jari SHA-1 game Anda di halaman Settings pada Firebase console.
Anda bisa mendapatkan hash SHA sertifikat penandatanganan dengan perintah
signingReport
gradle:./gradlew signingReport
Aktifkan Google Play Games sebagai penyedia login:
Di Firebase console, buka bagian Authentication.
Buat dan dapatkan client ID dan rahasia klien server web project Anda:
Dalam tab Sign in method, aktifkan penyedia login Google.
Salin client ID dan rahasia server web dari penyedia login Google.
Dalam tab Sign in method, aktifkan penyedia login Play Games, lalu tentukan client ID dan rahasia klien server web project yang Anda dapatkan pada langkah terakhir.
Mengonfigurasi Play Games services dengan informasi aplikasi Firebase Anda
Di Google Play Console, buka aplikasi Google Play atau buat aplikasi.
Di bagian Grow, klik Play Games services > Penyiapan & Pengelolaan > Konfigurasi.
Klik Ya, game saya sudah menggunakan Google API, pilih project Firebase Anda dari daftar, lalu klik Use.
Di halaman konfigurasi Play Games services, klik Tambahkan Kredensial.
- Pilih jenis Game server.
- Di kolom klien OAuth, pilih client ID web project Anda. Pastikan ini adalah client ID yang sama dengan yang Anda tetapkan saat mengaktifkan login dengan Play Games.
- Simpan perubahan Anda.
Masih di halaman konfigurasi Play Games services, klik kembali Tambahkan Kredensial.
- Pilih jenis Android.
- Di kolom OAuth client, pilih client ID Android project Anda. (Jika client ID Android tidak muncul, pastikan Anda menyetel sidik jari SHA-1 game di Firebase console.)
- Simpan perubahan Anda.
Di halaman Penguji, tambahkan alamat email pengguna yang harus login ke game Anda sebelum game tersebut dirilis di Play Store.
Mengintegrasikan fitur login dengan Play Game ke game Anda
Agar pemain dapat login ke game Anda, Anda harus mengintegrasikan fitur login Google Play Game.
Cara termudah dan direkomendasikan untuk menambahkan dukungan login Play Game ke project C++ Android adalah dengan menggunakan Google Sign-in C++ SDK.
Untuk menambahkan fitur login Play Game ke game Anda menggunakan Google Sign-in C++ SDK, lakukan langkah berikut:
Clone atau download repositori plugin Google Sign-in Unity, yang juga berisi C++ SDK.
Build project yang terdapat di direktori
staging/native/
, baik menggunakan Android Studio ataugradlew build
.Build akan menyalin outputnya ke direktori yang diberi nama
google-signin-cpp
.Sertakan Google Sign-in C++ SDK dalam file pembuatan kode native game Anda:
CMake
Di file
CMakeLists.txt
level teratas:set(GSI_PACKAGE_DIR "/path/to/google-signin-cpp")
add_library(lib-google-signin-cpp STATIC IMPORTED) set_target_properties(lib-google-signin-cpp PROPERTIES IMPORTED_LOCATION ${GSI_PACKAGE_DIR}/lib/${ANDROID_ABI}/libgoogle-signin-cpp.a )
...
target_link_libraries( ... lib-google-signin-cpp)ndk-build
Di file
Android.mk
:include $(CLEAR_VARS) LOCAL_MODULE := google-signin-cpp GSI_SDK_DIR := /path/to/google-signin-cpp LOCAL_SRC_FILES := $(GSI_SDK_DIR)/lib/$(TARGET_ARCH_ABI)/libgoogle-signin-cpp.a LOCAL_EXPORT_C_INCLUDES := $(GSI_SDK_DIR)/include include $(PREBUILT_STATIC_LIBRARY)
Berikutnya, sertakan komponen Java helper yang diperlukan oleh C++ SDK.
Untuk melakukannya, di file
build.gradle
di level project, tambahkan direktori output build SDK sebagai repositori lokal:allprojects { repositories { // ... flatDir { dirs 'path/to/google-signin-cpp' } } }
Dan di file
build.gradle
di level modul, deklarasikan komponen helper sebagai dependensi:dependencies { implementation 'com.google.android.gms:play-services-auth:21.2.0' // Depend on the AAR built with the Google Sign-in SDK in order to add // the Java helper classes, which are used by the C++ library. compile(name:'google-signin-cpp-release', ext:'aar') }
Lalu di game Anda, konfigurasikan objek
GoogleSignIn
untuk menggunakan fitur login Play Game dan untuk mengambil kode autentikasi server:#include "google_signin.h" #include "future.h" using namespace google::signin; // ... GoogleSignIn::Configuration config = {}; config.web_client_id = "YOUR_WEB_CLIENT_ID_HERE"; config.request_id_token = false; config.use_game_signin = true; config.request_auth_code = true; GoogleSignIn gsi = GoogleSignIn(GetActivity(), GetJavaVM()); gsi.Configure(config);
Terakhir, panggil
SignIn()
untuk membuat pemain login ke Play Game:Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();
Saat Future yang ditampilkan oleh
SignIn()
di-resolve, Anda bisa mendapatkan kode autentikasi server dari hasil:if (!future.Pending()) { const GoogleSignIn::StatusCode status = static_cast<GoogleSignIn::StatusCode>(future.Status()); if (status == GoogleSignIn::kStatusCodeSuccess) { // Player successfully signed in to Google Play! Get auth code to // pass to Firebase const GoogleSignIn::SignInResult result = static_cast<GoogleSignIn::SignInResult>(future.Result()); const char* server_auth_code = result.User.GetServerAuthCode(); } }
Melakukan Autentikasi dengan Firebase
Setelah pemain login dengan Play Game, Anda dapat menggunakan kode autentikasi untuk melakukan autentikasi dengan Firebase.
Setelah pemain berhasil login menggunakan Play Game, dapatkan kode autentikasi untuk akun pemain tersebut.
Kemudian, tukarkan kode autentikasi dari layanan Play Game untuk mendapatkan kredensial Firebase, dan gunakan kredensial Firebase tersebut untuk mengautentikasi pemain:
firebase::auth::Credential credential = firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
Jika program Anda memiliki loop update yang berjalan secara teratur (misalnya 30 atau 60 kali per detik), Anda dapat memeriksa hasilnya satu kali per update dengan
Auth::SignInAndRetrieveDataWithCredentialLastResult
:firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredentialLastResult(); 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()); } }
Atau, jika program Anda dikendalikan oleh peristiwa, Anda bisa memilih untuk mendaftarkan callback pada Future.
Mendaftarkan callback pada Future
Beberapa program memiliki fungsiUpdate
yang dipanggil sebanyak 30 atau 60 kali per detik.
Misalnya, banyak game mengikuti model ini. Program ini dapat memanggil fungsi LastResult
untuk mengecek status panggilan asinkron.
Namun, jika program Anda dikendalikan oleh peristiwa, Anda dapat memilih untuk mendaftarkan fungsi callback.
Fungsi callback dipanggil setelah selesainya Future.
void OnCreateCallback(const firebase::Future<firebase::auth::User*>& result, void* user_data) { // The callback is called when the Future enters the `complete` state. assert(result.status() == firebase::kFutureStatusComplete); // Use `user_data` to pass-in program context, if you like. MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Important to handle both success and failure situations. if (result.error() == firebase::auth::kAuthErrorNone) { firebase::auth::User* user = *result.result(); printf("Create user succeeded for email %s\n", user->email().c_str()); // Perform other actions on User, if you like. firebase::auth::User::UserProfile profile; profile.display_name = program_context->display_name; user->UpdateUserProfile(profile); } else { printf("Created user failed with error '%s'\n", result.error_message()); } } void CreateUser(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // `&my_program_context` is passed verbatim to OnCreateCallback(). result.OnCompletion(OnCreateCallback, &my_program_context); }
void CreateUserUsingLambda(firebase::auth::Auth* auth) { // Callbacks work the same for any firebase::Future. firebase::Future<firebase::auth::AuthResult> result = auth->CreateUserWithEmailAndPasswordLastResult(); // The lambda has the same signature as the callback function. result.OnCompletion( [](const firebase::Future<firebase::auth::User*>& result, void* user_data) { // `user_data` is the same as &my_program_context, below. // Note that we can't capture this value in the [] because std::function // is not supported by our minimum compiler spec (which is pre C++11). MyProgramContext* program_context = static_cast<MyProgramContext*>(user_data); // Process create user result... (void)program_context; }, &my_program_context); }
Langkah berikutnya
Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan terhubung ke ID Play Game miliknya. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project.
Di game, Anda bisa mendapatkan UID Firebase pengguna dari objek firebase::auth::User
:
firebase::auth::User user = auth->current_user();
if (user.is_valid()) {
std::string playerName = user.displayName();
// 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();
}
Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik yang login dari variabel auth
, dan menggunakannya untuk mengontrol data yang dapat diakses pengguna.
Untuk mendapatkan informasi pemain Play Game milik pengguna atau untuk mengakses layanan Play Game, gunakan API yang diberikan oleh C++ SDK layanan Google Play Game.
Untuk memproses logout pengguna, panggil SignOut()
:
auth->SignOut();