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

Bir Android oyununda kullanıcıların oturum açmak için Google Play Games hizmetlerini kullanabilirsiniz Firebase'de oluşturuyorum. Google Play Games Hizmetleri oturum açma özelliğini kullanmak için için, önce oynatıcıda Google Play Games ile oturum açın ve OAuth 2.0 yetkilendirme kodu ekleyin. Ardından, Firebase kimlik bilgisi oluşturmak için PlayGamesAuthProvider Firebase ile kimlik doğrulama.

Başlamadan önce

Kullanmadan önce Firebase Authentication Yapmanız gerekenler:

  • C++ projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.

    C++ projeniz zaten Firebase'i kullanıyorsa zaten kayıtlıdır ve Firebase için yapılandırıldı.

  • Firebase C++ SDK'sını C++ projenize ekleyin.

ziyaret edin.

Firebase'i C++ projenize eklediğinizde, hem Firebase konsolunda ve açık C++ projenizde (örneğin, Konsoldaki Firebase yapılandırma dosyalarını C++ projenize taşıyın).

Firebase projenizi oluşturun

  1. Henüz yapmadıysanız Ayarlar sayfası Firebase konsolunda görebilirsiniz.

    Gradle ile imza sertifikanızın SHA karmasını alabilirsiniz signingReport komutu:

    ./gradlew signingReport

  2. Google Play Games sağlayıcısını oturum açma sağlayıcısı olarak etkinleştir:

    1. Firebase konsolunda Authentication bölümünü tıklayın.

    2. Projenizin web sunucusu istemci kimliğini ve istemcisini oluşturun ve edinin sır:

      1. Oturum açma yöntemi sekmesinde, Google ile oturum açma özelliğini etkinleştirin sağlar.

      2. Google ile oturum açma bilgilerinden web sunucusu istemci kimliğini ve gizli anahtarı kopyalayın sağlar.

    3. Oturum açma yöntemi sekmesinde Play Games hizmetini etkinleştirin oturum açma sağlayıcısını seçin ve projenizin web sunucusu istemci kimliğini ve istemci sırrı (gizli anahtarı) içerir.

Play Games services uygulamasını Firebase uygulama bilgilerinizle yapılandırın

  1. Google Play Konsolu, Google Play uygulamanızı açın veya bir uygulama oluşturun.

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

  3. Evet, oyunumda zaten Google API'leri kullanılıyor'u tıklayın, Firebase'inizi seçin projeyi seçin ve Kullan'ı tıklayın.

  4. Play Games services yapılandırma sayfasında şunu tıklayın: Kimlik Bilgisi Ekle.

    1. Oyun sunucusu türünü seçin.
    2. OAuth istemcisi alanında projenizin web istemcisi kimliğini seçin. Bunun, etkinleştirdiğiniz istemci kimliği ile aynı olduğundan emin olun. Play Games oturum açma.
    3. Yaptığınız değişiklikleri kaydedin.
  5. Play Games services yapılandırma sayfasındayken Tekrar Kimlik Bilgisi Ekleyin.

    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 oyununuzun Firebase konsolunda SHA-1 parmak izi.)
    3. Yaptığınız değişiklikleri kaydedin.
  6. Test kullanıcıları sayfasında, teste tabi tutulması gereken tüm kullanıcıların e-posta adreslerini Google Play Geliştirici Konsolu'nda yayınlamadan önce oyununuzda oturum Play Store.

Play Games oturum açma özelliğini oyununuza entegre etme

Oyuncuların oyununuzda oturum açabilmesi için öncelikle Google Play'i entegre etmeniz gerekir Oyunlarda oturum açma.

C++'a Play Games oturum açma desteği eklemenin en kolay ve önerilen yolu Android projesi 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 takip etmek için:

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

  2. staging/native/ dizininde bulunan projeyi oluşturmak için Android Studio veya gradlew build.

    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.

    Bunu yapmak için proje düzeyindeki build.gradle dosyanıza SDK derlemesini ekleyin çıkış dizinini de kullanabilirsiniz:

    allprojects {
        repositories {
            // ...
            flatDir {
                dirs 'path/to/google-signin-cpp'
            }
        }
    }
    

    Ayrıca modül düzeyindeki build.gradle dosyanızda yardımcı bileşeni tanımlayın bir örneği inceleyelim:

    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'i kullanmak için bir GoogleSignIn nesnesi yapılandırın oturum açın ve bir sunucu yetkilendirme kodu almak için:

    #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 sunucu kimlik doğrulamasını alabilirsiniz kod yazın:

    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'de oturum açtıktan sonra yetkilendirme kodunu kullanarak Firebase ile kimlik doğrulama.

  1. Oyuncu, Play Games'i kullanarak başarıyla oturum açtıktan sonra kimlik doğrulama alın oyuncunun hesabına ait kodu.

  2. Ardından, Play Games hizmetlerindeki yetkilendirme kodunu Firebase ile değiştirin ve oynatıcının 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);
    
  3. Programınızda düzenli olarak devam eden bir güncelleme döngüsü varsa (örneğin, 30 veya 60'ta) veya saniyede bir), sonuçları güncelleme başına bir defa 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 etkinliklere dayalıysa gelecek için bir geri çağırma kaydı yapın.

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 LastResult işlevleri kullanabilirsiniz. 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);
}
. İsterseniz geri çağırma işlevi de bir lambda 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 kendi Play Games kimliklerine bağladıkları hesaptır. Bu yeni hesap, şu bilgilerin bir parçası olarak saklanır: ve Firebase'deki tüm uygulamalarda bir kullanıcıyı tanımlamak için kullanılabilir. belirler.

Oyununuzda, kullanıcının Firebase UID'sini şuradan edinebilirsiniz: firebase::auth::User nesne:

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 şunları alabilirsiniz: oturum açmış kullanıcının auth değişkenindeki benzersiz kullanıcı kimliğini kullanarak Kullanıcının hangi verilere erişebileceğini kontrol etmek

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 kullanmalıdır.

Bir kullanıcının oturumunu kapatmak için SignOut() numaralı telefonu arayın:

auth->SignOut();