Firebase üzerinde oluşturulan ve C++ ile yazılan bir Android oyununda oyuncuların oturum açması için Google Play Games Hizmetleri'ni kullanabilirsiniz. Firebase ile Google Play Games Hizmetleri oturum açma özelliğini kullanmak için önce oyuncunun Google Play Games ile oturum açmasını sağlayın ve bunu yaparken bir OAuth 2.0 yetkilendirme kodu isteyin. Ardından, yetkilendirme kodunu PlayGamesAuthProvider işlevine ileterek Firebase kimlik bilgisi oluşturun. Bu kimlik bilgisini Firebase ile kimlik doğrulamak için kullanabilirsiniz.
Başlamadan önce
Firebase Authentication kullanabilmek için:
C++ projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
C++ projeniz zaten Firebase kullanıyorsa Firebase için kaydedilmiş ve yapılandırılmış demektir.
Firebase'i C++ projenize eklemenin hem Firebase konsolda hem de açık C++ projenizde görevler içerdiğini unutmayın (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip C++ projenize taşırsınız).
Firebase projenizi oluşturma
Henüz yapmadıysanız uygulamanızın SHA-1 parmak izini belirtin.
Firebase konsolunda
Ayarlar > Genel sekmesine gidin.Uygulamalarınız kartına gidin, Android uygulamanızı seçin ve SHA sertifikası parmak izleri alanına SHA-1 parmak izinizi ekleyin.
gradle
signingReportkomutuyla imzalama sertifikanızın SHA karmasını alabilirsiniz:./gradlew signingReport
Uygulamanızın SHA parmak izini alma hakkında ayrıntılı bilgi için İstemcinizin Kimliğini Doğrulama başlıklı makaleyi inceleyin.
Oturum açma hizmeti sağlayıcısı olarak Google Play Games'yı etkinleştirin:
Firebase konsolunda Güvenlik > Kimlik doğrulama'ya gidin.
Projenizin web sunucusu istemci kimliğini ve istemci gizli anahtarını oluşturup alın:
Oturum açma yöntemi sekmesinde Google oturum açma sağlayıcısını etkinleştirin.
Web sunucusu istemci kimliğini ve gizli anahtarını Google ile oturum açma sağlayıcısından kopyalayın.
Oturum açma yöntemi sekmesinde Play Games oturum açma sağlayıcısını etkinleştirin ve son adımda aldığınız proje web sunucunuzun istemci kimliğini ve istemci gizli anahtarını belirtin.
Play Games services'yı Firebase uygulama bilgilerinizle yapılandırın
Google Play Konsolu'nda Google Play uygulamanızı açın veya bir uygulama oluşturun.
Büyüme bölümünde Play Games services > Kurulum ve Yönetim > Yapılandırma'yı tıklayın.
Evet, oyunumda zaten Google API'leri kullanılıyor'u tıklayın, listeden Firebase projenizi seçin ve Kullan'ı tıklayın.
Play Games services yapılandırma sayfasında Kimlik bilgisi ekle'yi tıklayın.
- Oyun sunucusu türünü seçin.
- OAuth istemcisi alanında projenizin web istemci kimliğini seçin. Bu kimliğin, Play Games oturum açma özelliğini etkinleştirirken belirttiğiniz istemci kimliğiyle aynı olduğundan emin olun.
- Yaptığınız değişiklikleri kaydedin.
Hâlâ Play Games services yapılandırma sayfasındayken Kimlik bilgisi ekle'yi tekrar tıklayın.
- Android türünü seçin.
- OAuth istemcisi alanında projenizin Android istemci kimliğini seçin. (Android istemci kimliğinizi görmüyorsanız oyununuzun SHA-1 parmak izini Firebase konsolunda ayarladığınızdan emin olun.)
- Yaptığınız değişiklikleri kaydedin.
Test kullanıcıları sayfasında, oyununuzu Play Store'de yayınlamadan önce oyuna giriş yapması gereken kullanıcıların e-posta adreslerini ekleyin.
Play Games'de oturum açma özelliğini oyununuza entegre etme
Oyuncuların oyununuzda oturum açabilmesi için Google Play Games oturum açma özelliğini entegre etmeniz gerekir.
Play Games ile oturum açma desteğini C++ Android projesine eklemenin en kolay ve önerilen yolu Google ile Oturum Açma C++ SDK'sını kullanmaktır.
Google ile Oturum Açma C++ SDK'sını kullanarak oyununuza Play Games oturum açma özelliğini eklemek için aşağıdakileri yapın:
C++ SDK'sını da içeren Google ile Giriş Unity eklenti deposunu klonlayın veya indirin.
Android Studio veya
gradlew build'ı kullanarakstaging/native/dizininde bulunan projeyi oluşturun.Derleme, çıkışını
google-signin-cppadlı bir dizine kopyalar.Google ile oturum açma C++ SDK'sını oyununuzun yerel kod make dosyasına ekleyin:
CMake
Üst düzey
CMakeLists.txtdosyanızda: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.mkdosyanızda: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)
Ardından, C++ SDK'sı için gerekli olan Java yardımcı bileşenini ekleyin.
Bunu yapmak için proje düzeyindeki
build.gradledosyanıza SDK derleme çıkış dizinini yerel bir depo olarak ekleyin:allprojects { repositories { // ... flatDir { dirs 'path/to/google-signin-cpp' } } }Ayrıca, modül düzeyindeki
build.gradledosyanızda yardımcı bileşeni bağımlılık olarak bildirin:dependencies { implementation 'com.google.android.gms:play-services-auth:21.5.1' // 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') }Ardından, oyununuzda Play Games oturum açma özelliğini kullanmak ve sunucu yetkilendirme kodu almak için bir
GoogleSignInnesnesi yapılandırın:#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);Son olarak, oyuncunun Play Games'de oturum açmasını sağlamak için
SignIn()işlevini çağırın:Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();SignIn()tarafından döndürülen Future çözümlendiğinde sonuçtan sunucu kimlik doğrulama kodunu alabilirsiniz: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 ile kimlik doğrulama
Oyuncu Play Games ile oturum açtıktan sonra Firebase'de kimlik doğrulamak için yetkilendirme kodunu kullanabilirsiniz.
Oyuncu Play Games'i kullanarak başarıyla oturum açtıktan sonra oyuncunun hesabı için bir yetkilendirme kodu alın.
Ardından, Play Games Hizmetleri'nden alınan yetkilendirme kodunu bir Firebase kimlik bilgisiyle değiştirin ve oyuncunun kimliğini doğrulamak için Firebase kimlik bilgisini kullanın:
firebase::auth::Credential credential = firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);Programınızda düzenli olarak çalışan bir güncelleme döngüsü varsa (örneğin, saniyede 30 veya 60 kez) sonuçları
Auth::SignInAndRetrieveDataWithCredentialLastResultile güncelleme başına bir kez kontrol edebilirsiniz: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()); } }
Alternatif olarak, programınız etkinlik odaklıysa Future üzerinde geri çağırma kaydetmeyi tercih edebilirsiniz.
Future'da geri arama kaydetme
Bazı programlardaUpdate işlevler saniyede 30 veya 60 kez çağrılır.
Örneğin, birçok oyun bu modeli izler. Bu programlar, eşzamansız aramaları yoklamak için LastResult işlevlerini çağırabilir.
Ancak programınız etkinlik odaklıysa geri çağırma işlevlerini kaydetmeyi tercih edebilirsiniz.
Gelecek tamamlandığında bir geri çağırma işlevi çağrılır.
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); }
Sonraki adımlar
Kullanıcı ilk kez oturum açtıktan sonra yeni bir kullanıcı hesabı oluşturulur ve Play Games kimliğine bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanır ve projenizdeki her uygulamada kullanıcıyı tanımlamak için kullanılabilir.
Oyununuzda, kullanıcının Firebase UID'sini firebase::auth::User nesnesinden alabilirsiniz:
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 Database ve Cloud Storage güvenlik kurallarınızda, auth değişkeninden oturum açmış kullanıcının benzersiz kullanıcı kimliğini alabilir ve bunu, kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.
Kullanıcının Play Games oyuncu bilgilerini almak veya Play Games hizmetlerine erişmek için Google Play Games Hizmetleri C++ SDK'sı tarafından sağlanan API'leri kullanın.
Bir kullanıcının oturumunu kapatmak için SignOut() işlevini çağırın:
auth->SignOut();