Google Play Games Hizmetleri'ni C++ ile Kullanarak Kimlik Doğrulama

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

  1. 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

  2. Google Play Games'i oturum açma sağlayıcısı olarak etkinleştirme:

    1. Firebase konsolunda Kimlik Doğrulama bölümünü açın.

    2. Projenizin web sunucusu istemci kimliğini ve istemci gizli anahtarını oluşturun ve edinin:

      1. Oturum açma yöntemi sekmesinde Google oturum açma sağlayıcısını etkinleştirin.

      2. Google oturum açma sağlayıcısından web sunucusu istemci kimliğini ve gizli anahtarını kopyalayın.

    3. 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

  1. Google Play Console'da Google Play uygulamanızı açın veya bir uygulama oluşturun.

  2. Büyüme bölümünde Play Games hizmetleri > Kurulum ve Yönetim > Yapılandırma'yı tıklayın.

  3. Evet, oyunum zaten Google API'lerini kullanıyor'u tıklayın, listeden Firebase projenizi seçin ve Kullan'ı tıklayın.

  4. Play Games hizmetleri yapılandırma sayfasında Kimlik Bilgisi Ekle'yi tıklayın.

    1. Oyun sunucusu türünü seçin.
    2. 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.
    3. Yaptığınız değişiklikleri kaydedin.
  5. Yine Play Games hizmetleri yapılandırma sayfasında Kimlik Bilgisi Ekle'yi tekrar tıklayın.

    1. Android türünü seçin.
    2. 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.)
    3. Yaptığınız değişiklikleri kaydedin.
  6. 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:

  1. C++ SDK'sını da içeren Google ile Oturum Açma Unity eklentisi deposunu klonlayın veya indirin.

  2. Android Studio veya gradlew build kullanarak staging/native/ dizininde bulunan projeyi derleyin.

    Derleme, çıkışını google-signin-cpp adlı bir dizine kopyalar.

  3. 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)
    

  4. 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')
    }
    
  5. 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);
    
  6. 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.

  1. Oyuncu, Play Games'i kullanarak başarıyla oturum açtıktan sonra oyuncunun hesabı için bir yetkilendirme kodu alın.

  2. 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);
    
  3. 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ılan Update 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();