אימות באמצעות שירותי משחקים של Google Play באמצעות C ++

תוכל להשתמש בשירותי Google Play משחקים כדי להיכנס לשחקנים למשחק אנדרואיד הבנוי ב- Firebase ונכתב ב- C ++. כדי להשתמש בשירותי Google Play משחקים, היכנס באמצעות Firebase, היכנס תחילה לשחקן באמצעות Google Play משחקים ובקש קוד אימות של OAuth 2.0 כשתעשה זאת. ואז, להעביר את קוד אימות כדי PlayGamesAuthProvider ליצור אישורים Firebase, שבו ניתן להשתמש כדי לאמת עם Firebase.

לפני שאתה מתחיל

לפני שתוכל להשתמש באימות Firebase , עליך:

  • רשום את פרויקט C ++ שלך והגדר אותו לשימוש ב- Firebase.

    אם פרויקט C ++ שלך כבר משתמש ב- Firebase, הוא כבר רשום ומוגדר עבור Firebase.

  • מוסיפים את Firebase C ++ SDK לפרויקט ++ C שלך.

שימו לב כי הוספת Firebase ל- C ++ שלך פרויקט כולל משימות הן Firebase הקונסולה וב C ++ לפרויקט פתוח (למשל, אתה מוריד קבצי config Firebase מהמסוף, ולאחר מכן להעביר אותם לתוך C ++ שלך פרויקט).

הגדר את פרויקט Firebase שלך

  1. אם עדיין לא עשה זאת, גדר טביעת אצבע SHA-1 של המשחק שלך הגדרות הדף של קונסולת Firebase.

    אתה יכול לקבל את חשיש SHA של תעודת החתימה שלך עם gradle signingReport הפקודה:

    ./gradlew signingReport

  2. הפעל את Google Play משחקים כספק כניסה:

    1. מצא את מזהה לקוח שרת האינטרנט של הפרויקט וסוד הלקוח שלך. מזהה לקוח שרת האינטרנט מזהה את פרויקט Firebase שלך ​​לשרתי האימות של Google Play.

      כדי למצוא ערכים אלה:

      1. פתח פרויקט Firebase שלך קונסולת Google APIs דף אישורים.
      2. במקטע מזהי לקוח OAuth 2.0, לפתוח את הלקוח אינטרנט (אוטומטי נוצר על ידי גוגל שירות) פרטים בעמוד. דף זה מפרט את מזהה לקוח ושרת הסוד שלך.
    2. ואז, בתוך קונסולת Firebase , פתח את קטע האימות.

    3. 'הכניסה דרך כרטיסיית שיטה, לאפשר כניסת משחקי Play ספק. יהיה עליך לציין את מזהה לקוח שרת האינטרנט של הפרויקט ואת סוד הלקוח, שקיבלת ממסוף ה- API.

  1. בשנות ה קונסולת Play Google , לפתוח את האפליקציה או ליצור אחד.

  2. במקטע לגדול, לחץ לשחק משחקי שירותים> Setup & Management> Configuration.

  3. לחץ על כן, המשחק שלי כבר משתמש ב- Google APIs, בחר את שם הפרויקט Firebase שלך מהרשימה, ולחץ על השתמש.

  4. בדף תצורת שירותי משחקי Play, לחץ על הוספת אישורים.

    1. בחר את סוג שרת משחק.
    2. בתחום לקוח OAuth, בחר מזהה לקוח האינטרנט של הפרויקט שלך. ודא שזהו אותו מזהה לקוח שציינת כשהפעלת כניסה למשחקי Play.
    3. שמור את השינויים שלך.
  5. עדיין בדף תצורת שירותי משחקי Play, לחץ על הוספת אישורים שוב.

    1. בחר את סוג אנדרואיד.
    2. בתחום לקוח OAuth, בחר מזהה לקוח אנדרואיד של הפרויקט שלך. (אם אינך רואה את מזהה לקוח Android שלך, הקפד להגדיר את טביעת האצבע SHA-1 של המשחק במסוף Firebase.)
    3. שמור את השינויים שלך.
  6. בדף בודקי, להוסיף את כתובות הדוא"ל של כל המשתמשים שצריכים להיות מסוגל להיכנס אל המשחק שלך לפני שאתה משחרר אותו בחנות Play.

שלבו את כניסת Play Games למשחק שלכם

לפני שתוכל להיכנס לשחקנים למשחק שלך, עליך לשלב כניסה למשחקי Google Play.

הדרך הקלה מומלץ להוסיף תמיכה עבור Play Games הכניסה לפרויקט C ++ אנדרואיד היא להשתמש הכניסה של גוגל C ++ SDK .

כדי להוסיף כניסה למשחקי Play למשחק שלך באמצעות SDK C ++ כניסה של Google, בצע את הפעולות הבאות:

  1. Clone או להוריד את מאגר תוסף הכניסה של אחדות גוגל , אשר מכיל גם את ה- SDK C ++.

  2. לבנות את הפרויקט הכלול staging/native/ ספרייה, או באמצעות Android Studio או gradlew build .

    העותקים לבנות התפוקה שלה ל בשם ספרייה google-signin-cpp .

  3. כלול את ה- SDK C ++ של כניסה ל- Google בקובץ יצירת הקוד המקורי של המשחק שלך:

    CMake

    בשנת ברמה העליונה 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)
    

  4. לאחר מכן, כלול את רכיב העזר של Java, הנדרש על ידי SDK C ++.

    לשם כך, בפרויקט ברמה שלך build.gradle הקובץ, להוסיף את ספריית הפלט לבנות SDK כמאגר מקומי:

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

    וגם, במודול ברמה שלך build.gradle קובץ, להכריז על רכיב עוזר כתלות:

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:20.0.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')
    }
    
  5. ואז, במשחק שלך, גדר GoogleSignIn אובייקט לשחק שימוש משחקי כניסה וכדי לאחזר קוד אימות שרת:

    #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. לבסוף, קורא SignIn() כדי לחתום על השחקן כדי לשחק משחקים:

    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 משחקים, תוכל להשתמש בקוד האימות לאימות באמצעות Firebase.

  1. לאחר שהשחקן נכנס בהצלחה באמצעות Play משחקים, קבל קוד אימות לחשבון השחקן.

  2. לאחר מכן, החלף את קוד האימות משירותי Play Games עבור תעודת Firebase והשתמש באישור Firebase לאימות השחקן:

    firebase::auth::Credential credential =
        firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code);
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredential(credential);
    
  3. אם התוכנית שלך יש לולאה עדכון שפועל במתכונת קבועה (נניח ב 30 או 60 פעמים בשנייה), אתה יכול לבדוק את התוצאות פעם אחת בכל עדכון עם Auth::SignInWithCredentialLastResult :

    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredentialLastResult();
    if (result.status() == firebase::kFutureStatusComplete) {
      if (result.error() == firebase::auth::kAuthErrorNone) {
        firebase::auth::User* user = *result.result();
        printf("Sign in succeeded for `%s`\n", 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::User*> result =
      auth->CreateUserWithEmailAndPasswordLastResult();

  // `&my_program_context` is passed verbatim to OnCreateCallback().
  result.OnCompletion(OnCreateCallback, &my_program_context);
}
פונקציית callback יכול להיות גם למבדה, אם אתם מעדיפים.
void CreateUserUsingLambda(firebase::auth::Auth* auth) {
  // Callbacks work the same for any firebase::Future.
  firebase::Future<firebase::auth::User*> 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 שלך, וניתן להשתמש בו כדי לזהות משתמש בכל אפליקציה בפרויקט שלך.

במשחק שלך, אתה יכול לקבל את UID Firebase של המשתמש מן firebase::auth::User האובייקט:

firebase::auth::User* user = auth->current_user();
if (user != nullptr) {
  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 שלך לאחסון בענן אבטחה חוקי, אתה יכול לקבל את שנכנסים למערכת זיהוי המשתמש הייחודי של המשתמש מן auth משתנה, ולהשתמש בו כדי לקבוע אילו נתונים גישה יכול משתמש.

כדי לקבל מידע שחקן משחקי Play של משתמש או לשירותי משחקי Play הגישה, שימוש בממשקי ה- API שמספקות שירותי Google Play משחק C ++ SDK .

כדי לצאת מהחשבון משתמש, קוראים SignOut() :

auth->SignOut();