Firebase'de oluşturulan ve C++ dilinde yazılan bir Android oyununda kullanıcıların oturum açmak için Google Play Games hizmetlerini kullanabilirsiniz. Google Play Games hizmetlerinde Firebase ile oturum
açmak için öncelikle Google Play Games ile oynatıcıda oturum açın ve bir OAuth 2.0 kimlik doğrulama kodu isteyin. Ardından, Firebase
kimliğini doğrulamak için kullanabileceğiniz bir Firebase kimlik bilgisi oluşturmak için kimlik bilgisi kodunu
PlayGamesAuthProvider
adresine iletin.
Başlamadan önce
Firebase Authentication'ı kullanabilmek için şunları yapmanız gerekir:
C++ projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
C++ projeniz zaten Firebase'i kullanıyorsa Firebase için kaydedilmiş ve yapılandırılmış demektir.
Firebase C++ SDK'sını C++ projenize ekleyin.
Firebase'i C++ projenize eklemenin hem Firebase konsolundaki hem de açık C++ projenizdeki görevleri gerektirdiğini unutmayın (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip C++ projenize taşırsınız).
Firebase projenizi oluşturun
Henüz yapmadıysanız Firebase konsolunun Ayarlar sayfasında oyununuzun SHA-1 parmak izini ayarlayın.
gradle
signingReport
komutuyla imza sertifikanızın SHA karmasını alabilirsiniz:./gradlew signingReport
Google Play Games'i oturum açma sağlayıcısı olarak etkinleştirme:
Firebase konsolunda Kimlik Doğrulama bölümünü açın.
Projenizin web sunucusu istemci kimliğini ve istemci gizli anahtarını oluşturun ve edinin:
Oturum açma yöntemi sekmesinde Google oturum açma sağlayıcısını etkinleştirin.
Google oturum açma sağlayıcısından web sunucusu istemci kimliğini ve gizli anahtarını kopyalayın.
Oturum açma yöntemi sekmesinde Play Games oturum açma sağlayıcısını etkinleştirin ve projenizin son adımda aldığınız web sunucusu istemci kimliği ile istemci gizli anahtarını belirtin.
Firebase uygulama bilgilerinizle Play Games hizmetlerini yapılandırma
Google Play Console'da Google Play uygulamanızı açın veya bir uygulama oluşturun.
Büyüme bölümünde Play Games hizmetleri > Kurulum ve Yönetim > Yapılandırma'yı tıklayın.
Evet, oyunum zaten Google API'lerini kullanıyor'u tıklayın, listeden Firebase projenizi seçin ve Kullan'ı tıklayın.
Play Games hizmetleri 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 istemcisi kimliğini seçin. Bunun, 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.
Yine Play Games hizmetleri yapılandırma sayfasında 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 Firebase konsolunda oyununuzun SHA-1 parmak izini ayarladığınızdan emin olun.)
- Yaptığınız değişiklikleri kaydedin.
Test kullanıcıları sayfasında, oyununuzu Play Store'da yayınlamadan önce oyununuzda oturum açabilmesi gereken tüm kullanıcıların e-posta adreslerini ekleyin.
Play Games 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.
Bir C++ Android projesine Play Oyunlar'da oturum açma desteği 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ği eklemek için aşağıdakileri yapın:
C++ SDK'sını da içeren Google ile Oturum Açma Unity eklentisi deposunu klonlayın veya indirin.
Android Studio veya
gradlew build
kullanarakstaging/native/
dizininde bulunan projeyi derleyin.Derleme, çıkışını
google-signin-cpp
adlı bir dizine kopyalar.Google ile Oturum Açma C++ SDK'sını oyununuzun yerel kod oluşturma dosyasına ekleyin:
CMake
Üst düzey
CMakeLists.txt
dosyanı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-kurum
Android.mk
dosyanı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.
Bunun için proje düzeyindeki
build.gradle
dosyanıza, SDK derleme çıkış dizinini yerel depo olarak ekleyin:allprojects { repositories { // ... flatDir { dirs 'path/to/google-signin-cpp' } } }
Ayrıca modül düzeyindeki
build.gradle
dosyanızda yardımcı bileşeni bağımlılık olarak tanımlayın: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') }
Ardından, oyununuzda, Play Games oturum açma özelliğini kullanmak ve sunucu yetkilendirme kodu almak için bir
GoogleSignIn
nesnesi 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,
SignIn()
adlı oyuncunun Play Games'de oturum açmasını isteyin:Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();
SignIn()
tarafından döndürülen Gelecek çö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 ile 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 hizmetlerindeki yetkilendirme kodunu Firebase kimlik bilgisi ile değiştirin ve Firebase kimlik bilgisini kullanarak oyuncunun kimliğini doğrulayı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ı güncelleme başına bir kez kontrol etmek için
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()); } }
Programınız etkinliğe dayalıysa gelecek için bir geri çağırma kaydını da tercih edebilirsiniz.
Geleceğe yönelik bir geri arama kaydı oluşturun
Bazı programlarda, saniyede 30 veya 60 kez çağrılanUpdate
işlevleri bulunur.
Örneğin, birçok oyun bu modeli uygular. Bu programlar, eşzamansız çağrıları yoklamak için LastResult
işlevlerini çağırabilir.
Ancak, programınız etkinliğe dayalıysa geri çağırma işlevlerini kaydetmeyi tercih edebilirsiniz.
Gelecek tamamlandıktan sonra 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); }Geri çağırma işlevi isterseniz bir lambda da olabilir.
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ığında yeni bir kullanıcı hesabı oluşturulur ve kullanıcının Play Games kimliğine bağlanır. Bu yeni hesap Firebase projenizin bir parçası olarak depolanır ve projenizdeki her uygulamada bir 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, oturum açan kullanıcının auth
değişkeninden benzersiz kullanıcı kimliğini alabilir ve kullanıcının hangi verilere erişebileceğini kontrol etmek için bunu kullanabilirsiniz.
Kullanıcının Play Games oynatıcı 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()
numaralı telefonu arayın:
auth->SignOut();