C++ के साथ Google Play गेम सेवाओं का इस्तेमाल करके पुष्टि करें

Google Play की गेम सेवाओं का इस्तेमाल करके, C++ में लिखे गए और Firebase पर बनाए गए Android गेम में खिलाड़ियों को साइन इन किया जा सकता है. Google Play की गेम सेवाओं का इस्तेमाल करके, Firebase में साइन इन करने के लिए, पहले खिलाड़ी को Google Play Games में साइन इन करें. इसके बाद, साइन इन करते समय OAuth 2.0 ऑथराइज़ेशन कोड का अनुरोध करें. इसके बाद, ऑथराइज़ेशन कोड को PlayGamesAuthProvider को पास करें, ताकि Firebase क्रेडेंशियल जनरेट किया जा सके. इस क्रेडेंशियल का इस्तेमाल, Firebase में पुष्टि करने के लिए किया जा सकता है.

शुरू करने से पहले

Firebase Authentication का इस्तेमाल करने से पहले, आपको ये काम करने होंगे:

  • अपने C++ प्रोजेक्ट को रजिस्टर करें और Firebase का इस्तेमाल करने के लिए इसे कॉन्फ़िगर करें.

    अगर आपके C++ प्रोजेक्ट में पहले से ही Firebase का इस्तेमाल किया जा रहा है, तो यह पहले से ही Firebase के लिए रजिस्टर और कॉन्फ़िगर किया गया है.

  • अपने C++ प्रोजेक्ट में Firebase C++ SDK जोड़ें.

ध्यान दें कि C++ प्रोजेक्ट को Firebase से जोड़ने के लिए, आपको Firebase कंसोल और खुले हुए C++ प्रोजेक्ट, दोनों में टास्क पूरे करने होंगे. उदाहरण के लिए, आपको कंसोल से Firebase कॉन्फ़िगरेशन फ़ाइलें डाउनलोड करनी होंगी. इसके बाद, उन्हें अपने C++ प्रोजेक्ट में ले जाना होगा.

अपना Firebase प्रोजेक्ट सेट अप करना

  1. अगर आपने अब तक अपने ऐप्लिकेशन का SHA-1 फ़िंगरप्रिंट नहीं दिया है, तो उसे दें.

    1. Firebase कंसोल में, सेटिंग > सामान्य टैब पर जाएं.

    2. नीचे की ओर स्क्रोल करके आपके ऐप्लिकेशन कार्ड पर जाएं. इसके बाद, अपना Android ऐप्लिकेशन चुनें और SHA सर्टिफ़िकेट फ़िंगरप्रिंट फ़ील्ड में अपना SHA-1 फ़िंगरप्रिंट जोड़ें.

    gradle signingReport कमांड का इस्तेमाल करके, अपने साइनिंग सर्टिफ़िकेट का SHA हैश पाया जा सकता है:

    ./gradlew signingReport

    अपने ऐप्लिकेशन के SHA फ़िंगरप्रिंट को पाने के तरीके के बारे में जानने के लिए, अपने क्लाइंट की पुष्टि करना लेख पढ़ें.

  2. साइन इन करने की सुविधा देने वाली कंपनी के तौर पर Google Play Games को चालू करने के लिए:

    1. Firebase console में, Security > Authentication पर जाएं.

    2. अपने प्रोजेक्ट का वेब सर्वर क्लाइंट आईडी और क्लाइंट सीक्रेट जनरेट करें और पाएं:

      1. साइन इन करने का तरीका टैब में, Google साइन-इन प्रोवाइडर को चालू करें.

      2. Google साइन-इन सेवा देने वाली कंपनी से, वेब सर्वर क्लाइंट आईडी और सीक्रेट कॉपी करें.

    3. साइन इन करने का तरीका टैब में, Play Gamesसाइन-इन प्रोवाइडर को चालू करें. इसके बाद, अपने प्रोजेक्ट का वेब सर्वर क्लाइंट आईडी और क्लाइंट सीक्रेट डालें. यह जानकारी आपको पिछले चरण में मिली थी.

अपने Firebase ऐप्लिकेशन की जानकारी के साथ Play Games services को कॉन्फ़िगर करें

  1. Google Play Console में जाकर, अपना Google Play ऐप्लिकेशन खोलें या नया ऐप्लिकेशन बनाएं.

  2. आगे बढ़ाएं सेक्शन में जाकर, Play Games services > सेटअप और मैनेजमेंट > कॉन्फ़िगरेशन पर क्लिक करें.

  3. हां, मेरा गेम पहले से Google API का इस्तेमाल करता है पर क्लिक करें. इसके बाद, सूची से अपना Firebase प्रोजेक्ट चुनें और इस्तेमाल करें पर क्लिक करें.

  4. Play Games services कॉन्फ़िगरेशन पेज पर, क्रेडेंशियल जोड़ें पर क्लिक करें.

    1. गेम सर्वर टाइप चुनें.
    2. OAuth क्लाइंट फ़ील्ड में, अपने प्रोजेक्ट का वेब क्लाइंट आईडी चुनें. पक्का करें कि यह वही क्लाइंट आईडी है जिसे आपने Play Games साइन-इन की सुविधा चालू करते समय डाला था.
    3. बदलावों को सेव करें.
  5. Play Games services कॉन्फ़िगरेशन पेज पर, क्रेडेंशियल जोड़ें पर फिर से क्लिक करें.

    1. Android टाइप चुनें.
    2. OAuth क्लाइंट फ़ील्ड में, अपने प्रोजेक्ट का Android क्लाइंट आईडी चुनें. (अगर आपको अपना Android क्लाइंट आईडी नहीं दिखता है, तो पक्का करें कि आपने Firebase कंसोल में अपने गेम का SHA-1 फ़िंगरप्रिंट सेट किया हो.)
    3. बदलावों को सेव करें.
  6. टेस्टर पेज पर, उन उपयोगकर्ताओं के ईमेल पते जोड़ें जिन्हें Play Store पर गेम रिलीज़ करने से पहले, उसमें साइन इन करने की अनुमति देनी है.

अपने गेम में Play Games में साइन इन करने की सुविधा को इंटिग्रेट करना

खिलाड़ियों को अपने गेम में साइन इन करने की सुविधा देने से पहले, आपको Google Play Games में साइन इन करने की सुविधा को इंटिग्रेट करना होगा.

C++ Android प्रोजेक्ट में Play की गेम सेवाओं के साइन-इन की सुविधा जोड़ने का सबसे आसान और सुझाया गया तरीका यह है कि Google Sign-in C++ SDK का इस्तेमाल किया जाए.

Google Sign-in C++ SDK का इस्तेमाल करके, अपने गेम में Play Games की साइन-इन सुविधा जोड़ने के लिए, यह तरीका अपनाएं:

  1. Google Sign-in Unity प्लगिन रिपॉज़िटरी को क्लोन करें या डाउनलोड करें. इसमें C++ SDK टूल भी शामिल है.

  2. staging/native/ डायरेक्ट्री में मौजूद प्रोजेक्ट को Android Studio या gradlew build का इस्तेमाल करके बनाएं.

    बिल्ड, अपने आउटपुट को google-signin-cpp नाम की डायरेक्ट्री में कॉपी करता है.

  3. अपने गेम के नेटिव कोड मेक फ़ाइल में, Google Sign-in C++ SDK टूल को शामिल करें:

    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 हेल्पर कॉम्पोनेंट को शामिल करें. इसकी ज़रूरत C++ SDK टूल के लिए होती है.

    इसके लिए, अपने प्रोजेक्ट-लेवल की build.gradle फ़ाइल में, एसडीके के बिल्ड आउटपुट डायरेक्ट्री को लोकल रिपॉज़िटरी के तौर पर जोड़ें:

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

    इसके बाद, मॉड्यूल-लेवल की build.gradle फ़ाइल में, हेल्पर कॉम्पोनेंट को डिपेंडेंसी के तौर पर तय करें:

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:21.6.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. इसके बाद, अपने गेम में GoogleSignIn ऑब्जेक्ट को कॉन्फ़िगर करें, ताकि Play की गेम सेवाओं के साइन-इन का इस्तेमाल किया जा सके और सर्वर ऑथराइज़ेशन कोड को वापस पाया जा सके:

    #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. आखिर में, Play Games में प्लेयर को साइन इन करने के लिए SignIn() को कॉल करें:

    Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();
    

    SignIn() से मिले Future के हल होने पर, नतीजे से सर्वर ऑथराइज़ेशन कोड पाया जा सकता है:

    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 Games से साइन इन कर लेता है, तब आपके पास ऑथराइज़ेशन कोड का इस्तेमाल करके, Firebase से पुष्टि करने का विकल्प होता है.

  1. जब कोई खिलाड़ी Play Games का इस्तेमाल करके साइन इन कर लेता है, तब उसके खाते के लिए पुष्टि करने वाला कोड पाएं.

  2. इसके बाद, Play की गेम सेवाओं से मिले ऑथराइज़ेशन कोड को Firebase क्रेडेंशियल के लिए एक्सचेंज करें. साथ ही, Firebase क्रेडेंशियल का इस्तेमाल करके, खिलाड़ी की पुष्टि करें:

    firebase::auth::Credential credential =
        firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code);
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
  3. अगर आपके प्रोग्राम में अपडेट लूप है, जो नियमित तौर पर चलता है (जैसे, हर सेकंड में 30 या 60 बार), तो 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());
      }
    }

    इसके अलावा, अगर आपका प्रोग्राम इवेंट पर आधारित है, तो Future पर कॉलबैक रजिस्टर करें.

Future पर कॉलबैक रजिस्टर करना

कुछ प्रोग्राम में ऐसे Update फ़ंक्शन होते हैं जिन्हें हर सेकंड में 30 या 60 बार कॉल किया जाता है. उदाहरण के लिए, कई गेम इस मॉडल का इस्तेमाल करते हैं. ये प्रोग्राम, एसिंक्रोनस कॉल को पोल करने के लिए LastResult फ़ंक्शन को कॉल कर सकते हैं. हालांकि, अगर आपका प्रोग्राम इवेंट पर आधारित है, तो आपको कॉलबैक फ़ंक्शन रजिस्टर करने चाहिए. Future पूरा होने पर, कॉलबैक फ़ंक्शन को कॉल किया जाता है.
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);
}

अगले चरण

जब कोई उपयोगकर्ता पहली बार साइन इन करता है, तो उसका नया खाता बनता है. यह खाता, उसके Play Games आईडी से लिंक होता है. यह नया खाता, आपके Firebase प्रोजेक्ट के हिस्से के तौर पर सेव किया जाता है. इसका इस्तेमाल, आपके प्रोजेक्ट के हर ऐप्लिकेशन में किसी उपयोगकर्ता की पहचान करने के लिए किया जा सकता है.

अपने गेम में, उपयोगकर्ता का Firebase UID, firebase::auth::User ऑब्जेक्ट से पाया जा सकता है:

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 और Cloud Storage के सुरक्षा नियमों में, साइन इन किए हुए उपयोगकर्ता का यूनीक आईडी auth वैरिएबल से पाया जा सकता है. इसका इस्तेमाल यह कंट्रोल करने के लिए किया जा सकता है कि कोई उपयोगकर्ता किस डेटा को ऐक्सेस कर सकता है.

किसी उपयोगकर्ता की Play Games की प्लेयर जानकारी पाने या Play की गेम सेवाओं को ऐक्सेस करने के लिए, Google Play की गेम सेवाओं के C++ SDK टूल से मिले एपीआई का इस्तेमाल करें.

किसी उपयोगकर्ता को साइन आउट करने के लिए, SignOut() को कॉल करें:

auth->SignOut();