คุณสามารถใช้บริการ Google Play Games เพื่อลงชื่อเข้าใช้ผู้เล่นในเกม Android ที่สร้างบน Firebase และเขียนด้วยภาษา C++ หากต้องการใช้บริการ Google Play Games ลงชื่อเข้าใช้ด้วย Firebase ก่อนอื่นให้ลงชื่อเข้าใช้ผู้เล่นด้วย Google Play Games และขอรหัสรับรองความถูกต้อง OAuth 2.0 เมื่อคุณทำเช่นนั้น จากนั้น ส่งรหัสการตรวจสอบสิทธิ์ไปที่ PlayGamesAuthProvider
เพื่อสร้างข้อมูลรับรอง Firebase ซึ่งคุณสามารถใช้ตรวจสอบสิทธิ์กับ Firebase ได้
ก่อนที่คุณจะเริ่ม
ก่อนที่คุณจะสามารถใช้ Firebase Authentication คุณต้อง:
ลงทะเบียนโปรเจ็กต์ C++ ของคุณและกำหนดค่าให้ใช้ Firebase
หากโปรเจ็กต์ C++ ของคุณใช้ Firebase อยู่แล้ว แสดงว่ามีการลงทะเบียนและกำหนดค่าสำหรับ Firebase แล้ว
เพิ่ม Firebase C++ SDK ให้กับโปรเจ็กต์ C++ ของคุณ
โปรดทราบว่าการเพิ่ม Firebase ไปยังโปรเจ็กต์ C++ ของคุณเกี่ยวข้องกับงานทั้งใน คอนโซล Firebase และในโปรเจ็กต์ C++ ที่เปิดอยู่ (เช่น คุณดาวน์โหลดไฟล์การกำหนดค่า Firebase จากคอนโซล จากนั้นย้ายไฟล์เหล่านั้นไปยังโปรเจ็กต์ C++ ของคุณ)
ตั้งค่าโปรเจ็กต์ Firebase ของคุณ
หากคุณยังไม่ได้ตั้งค่า ให้ตั้งค่าลายนิ้วมือ SHA-1 ของเกมในหน้า การตั้งค่า ของคอนโซล Firebase
คุณสามารถรับแฮช SHA ของใบรับรองการลงนามของคุณด้วยคำสั่ง gradle
signingReport
:./gradlew signingReport
เปิดใช้งาน Google Play Games เป็นผู้ให้บริการลงชื่อเข้าใช้:
ในคอนโซล Firebase ให้เปิด ส่วน การตรวจสอบสิทธิ์
สร้างและรับ ID ไคลเอ็นต์เว็บเซิร์ฟเวอร์ของโปรเจ็กต์และรหัสลับไคลเอ็นต์:
ภายในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการลงชื่อเข้าใช้ Google
คัดลอกรหัสไคลเอ็นต์ของเว็บเซิร์ฟเวอร์และข้อมูลลับจากผู้ให้บริการลงชื่อเข้าใช้ Google
ภายใน แท็บวิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการลงชื่อเข้าใช้ Play Games และระบุรหัสไคลเอ็นต์ของเว็บเซิร์ฟเวอร์ของโปรเจ็กต์และรหัสลับไคลเอ็นต์ ซึ่งคุณได้รับในขั้นตอนสุดท้าย
กำหนดค่าบริการ Play Games ด้วยข้อมูลแอป Firebase ของคุณ
ใน Google Play Console ให้เปิดแอป Google Play ของคุณหรือสร้างขึ้นใหม่
ในส่วน ขยาย คลิก บริการเกมของ Play > การตั้งค่าและการจัดการ > การกำหนดค่า
คลิก ใช่ เกมของฉันใช้ Google API แล้ว เลือกโปรเจ็กต์ Firebase ของคุณจากรายการ จากนั้นคลิก ใช้
ในหน้าการกำหนดค่าบริการ Play Games ให้คลิก เพิ่มข้อมูลรับรอง
- เลือกประเภท เซิร์ฟเวอร์เกม
- ในช่อง ไคลเอ็นต์ OAuth ให้เลือกรหัสไคลเอ็นต์ของเว็บของโปรเจ็กต์ ตรวจสอบให้แน่ใจว่านี่เป็นรหัสไคลเอ็นต์เดียวกับที่คุณระบุเมื่อเปิดใช้งานการลงชื่อเข้าใช้ Play Games
- บันทึกการเปลี่ยนแปลงของคุณ
ยังอยู่ในหน้าการกำหนดค่าบริการ Play Games ให้คลิก เพิ่มข้อมูลรับรอง อีกครั้ง
- เลือกประเภท Android
- ในช่อง ไคลเอ็นต์ OAuth ให้เลือกรหัสไคลเอ็นต์ Android ของโปรเจ็กต์ (หากคุณไม่เห็นรหัสไคลเอ็นต์ Android ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าลายนิ้วมือ SHA-1 ของเกมในคอนโซล Firebase)
- บันทึกการเปลี่ยนแปลงของคุณ
ในหน้า ผู้ทดสอบ ให้เพิ่มที่อยู่อีเมลของผู้ใช้ที่ต้องการลงชื่อเข้าใช้เกมของคุณก่อนที่จะเผยแพร่บน Play Store
รวมการลงชื่อเข้าใช้ Play Games เข้ากับเกมของคุณ
ก่อนที่คุณจะสามารถลงชื่อเข้าใช้ผู้เล่นในเกมของคุณได้ คุณต้องผสานรวมการลงชื่อเข้าใช้ Google Play Games
วิธีที่ง่ายที่สุดและแนะนำในการเพิ่มการสนับสนุนสำหรับการลงชื่อเข้าใช้ Play Games ให้กับโปรเจ็กต์ C++ Android คือการใช้ Google Sign-in C++ SDK
หากต้องการเพิ่มการลงชื่อเข้าใช้ Play Games ให้กับเกมของคุณโดยใช้ Google Sign-in C++ SDK ให้ทำดังต่อไปนี้:
โคลนหรือดาวน์โหลด ที่เก็บปลั๊กอิน Google Sign-in Unity ซึ่งมี C++ SDK ด้วย
สร้างโปรเจ็กต์ที่อยู่ในไดเร็กทอรี
staging/native/
โดยใช้ Android Studio หรือgradlew build
บิลด์จะคัดลอกเอาต์พุตไปยังไดเร็กทอรีชื่อ
google-signin-cpp
รวม Google Sign-In C++ SDK ไว้ในไฟล์สร้างโค้ดเนทีฟของเกม:
ซีเมค
ในไฟล์
CMakeLists.txt
ระดับบนสุดของคุณ: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
ในไฟล์
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)
ถัดไป รวมส่วนประกอบตัวช่วย Java ซึ่ง C++ SDK กำหนดไว้
ในการดำเนินการดังกล่าว ในไฟล์
build.gradle
ระดับโปรเจ็กต์ของคุณ ให้เพิ่มไดเร็กทอรีเอาต์พุตของบิลด์ SDK เป็นที่เก็บข้อมูลในเครื่อง:allprojects { repositories { // ... flatDir { dirs 'path/to/google-signin-cpp' } } }
และในไฟล์
build.gradle
ระดับโมดูลของคุณ ให้ประกาศส่วนประกอบตัวช่วยเป็นการพึ่งพา:dependencies { implementation 'com.google.android.gms:play-services-auth:21.0.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') }
จากนั้นในเกมของคุณ ให้กำหนดค่าออบเจ็กต์
GoogleSignIn
เพื่อใช้การลงชื่อเข้าใช้ Play Games และดึงรหัสรับรองความถูกต้องของเซิร์ฟเวอร์:#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);
สุดท้าย โทร
SignIn()
เพื่อลงชื่อเข้าใช้ Play Games:Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();
เมื่ออนาคตที่ส่งกลับโดย
SignIn()
ได้รับการแก้ไข คุณสามารถรับรหัสรับรองความถูกต้องของเซิร์ฟเวอร์ได้จากผลลัพธ์: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(); } }
ตรวจสอบสิทธิ์กับ Firebase
หลังจากที่ผู้เล่นลงชื่อเข้าใช้ Play Games แล้ว คุณจะใช้รหัสการตรวจสอบสิทธิ์เพื่อตรวจสอบสิทธิ์กับ Firebase ได้
หลังจากที่ผู้เล่นลงชื่อเข้าใช้ Play Games สำเร็จแล้ว ให้รับรหัสรับรองความถูกต้องสำหรับบัญชีของผู้เล่น
จากนั้น แลกเปลี่ยนรหัสการตรวจสอบสิทธิ์จากบริการ Play Games เป็นข้อมูลรับรอง Firebase และใช้ข้อมูลรับรอง Firebase เพื่อตรวจสอบสิทธิ์ผู้เล่น:
firebase::auth::Credential credential = firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);
หากโปรแกรมของคุณมีลูปการอัปเดตที่ทำงานเป็นประจำ (เช่น 30 หรือ 60 ครั้งต่อวินาที) คุณสามารถตรวจสอบผลลัพธ์ได้หนึ่งครั้งต่อการอัพเดตด้วย
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()); } }
หรือหากโปรแกรมของคุณขับเคลื่อนด้วยเหตุการณ์ คุณอาจต้องการ ลงทะเบียนการโทรกลับในอนาคต
ลงทะเบียนการโทรกลับในอนาคต
บางโปรแกรมมีฟังก์ชันUpdate
ที่เรียกว่า 30 หรือ 60 ครั้งต่อวินาที ยกตัวอย่างหลายเกมที่ทำตามโมเดลนี้ โปรแกรมเหล่านี้สามารถเรียกใช้ฟังก์ชัน LastResult
เพื่อสำรวจการโทรแบบอะซิงโครนัส อย่างไรก็ตาม หากโปรแกรมของคุณขับเคลื่อนด้วยเหตุการณ์ คุณอาจต้องการลงทะเบียนฟังก์ชันการโทรกลับ ฟังก์ชั่นการโทรกลับจะถูกเรียกเมื่อเสร็จสิ้นอนาคต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); }ฟังก์ชันการเรียกกลับอาจเป็น lambda ได้หากต้องการ
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); }
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก บัญชีผู้ใช้ใหม่จะถูกสร้างขึ้นและเชื่อมโยงกับรหัส Play Games ของตน บัญชีใหม่นี้จัดเก็บไว้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase ของคุณ และสามารถใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ของคุณ
ในเกมของคุณ คุณสามารถรับ Firebase UID ของผู้ใช้ได้จากวัตถุ 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();
}
ในฐานข้อมูล Firebase Realtime และกฎความปลอดภัยของ Cloud Storage คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้ได้จากตัวแปร auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้
หากต้องการรับข้อมูลผู้เล่น Play Games ของผู้ใช้หรือเข้าถึงบริการ Play Games ให้ใช้ API ที่ได้รับจาก บริการ Google Play Games C++ SDK
หากต้องการออกจากระบบผู้ใช้ ให้โทร SignOut()
:
auth->SignOut();