C++ के साथ Google Play गेम्स सेवाओं का उपयोग करके प्रमाणित करें

आप Firebase पर निर्मित और C++ में लिखे Android गेम में खिलाड़ियों को साइन इन करने के लिए Google Play गेम्स सेवाओं का उपयोग कर सकते हैं। Firebase के साथ Google Play गेम्स सेवाओं के साइन-इन का उपयोग करने के लिए, पहले Google Play गेम्स के साथ प्लेयर में साइन इन करें, और ऐसा करने पर OAuth 2.0 प्रमाणीकरण कोड का अनुरोध करें। फिर, Firebase क्रेडेंशियल जनरेट करने के लिए PlayGamesAuthProvider को प्रमाणन कोड पास करें, जिसका उपयोग आप Firebase के साथ प्रमाणित करने के लिए कर सकते हैं।

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

इससे पहले कि आप Firebase प्रमाणीकरण का उपयोग कर सकें, आपको निम्न की आवश्यकता होगी:

  • अपने C++ प्रोजेक्ट को पंजीकृत करें और इसे Firebase का उपयोग करने के लिए कॉन्फ़िगर करें।

    यदि आपका C++ प्रोजेक्ट पहले से ही Firebase का उपयोग करता है, तो यह पहले से पंजीकृत है और Firebase के लिए कॉन्फ़िगर किया गया है।

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

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

अपना फायरबेस प्रोजेक्ट सेट करें

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

    आप ग्रेडल signingReport कमांड के साथ अपने हस्ताक्षर प्रमाणपत्र का SHA हैश प्राप्त कर सकते हैं:

    ./gradlew signingReport

  2. साइन-इन प्रदाता के रूप में Google Play गेम्स को सक्षम करें:

    1. फायरबेस कंसोल में, प्रमाणीकरण अनुभाग खोलें।

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

      1. साइन इन विधि टैब के भीतर, Google साइन-इन प्रदाता को सक्षम करें।

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

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

अपनी Firebase ऐप्लिकेशन जानकारी के साथ Play गेम्स सेवाएं कॉन्फ़िगर करें

  1. Google Play कंसोल में, अपना Google Play ऐप खोलें या एक बनाएं।

  2. आगे बढ़ें अनुभाग में, Play गेम्स सेवाएं > सेटअप और प्रबंधन > कॉन्फ़िगरेशन क्लिक करें.

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

  4. Play गेम्स सेवाओं के कॉन्फ़िगरेशन पृष्ठ पर, क्रेडेंशियल जोड़ें पर क्लिक करें।

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

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

Play - गेम्स साइन-इन को अपने गेम में एकीकृत करें

इससे पहले कि आप खिलाड़ियों को अपने गेम में साइन इन कर सकें, आपको Google Play गेम्स साइन-इन को एकीकृत करना होगा।

C++ Android प्रोजेक्ट में Play गेम्स साइन-इन के लिए समर्थन जोड़ने का सबसे आसान और अनुशंसित तरीका Google साइन-इन C++ SDK का उपयोग करना है।

Google साइन-इन C++ SDK का उपयोग करके अपने गेम में Play गेम्स साइन-इन जोड़ने के लिए, निम्न कार्य करें:

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

  2. या तो Android Studio या gradlew build उपयोग करके staging/native/ डायरेक्टरी में निहित प्रोजेक्ट बनाएं।

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

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

    सीएमके

    आपकी शीर्ष-स्तरीय 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-निर्माण

    आपकी 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. अगला, जावा हेल्पर घटक शामिल करें, जो C++ SDK द्वारा आवश्यक है।

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

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

    और, अपने मॉड्यूल-स्तरीय build.gradle फ़ाइल में, सहायक घटक को एक निर्भरता के रूप में घोषित करें:

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:20.5.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. फिर, अपने गेम में, Play गेम्स साइन-इन का उपयोग करने और सर्वर प्रमाणीकरण कोड प्राप्त करने के लिए 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. अंत में, Play Games में खिलाड़ी को साइन इन करने के लिए 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();
        }
    }
    

फायरबेस के साथ प्रमाणित करें

जब खिलाड़ी Play Games में साइन इन कर लेता है, तो आप Firebase से प्रमाणित करने के लिए प्रमाणीकरण कोड का इस्तेमाल कर सकते हैं.

  1. प्ले गेम्स का उपयोग करके खिलाड़ी द्वारा सफलतापूर्वक साइन इन करने के बाद, खिलाड़ी के खाते के लिए प्रमाणीकरण कोड प्राप्त करें।

  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());
      }
    }
    के साथ प्रति अपडेट एक बार परिणामों की जांच कर सकते हैं।

    या, यदि आपका प्रोग्राम इवेंट संचालित है, तो आप फ्यूचर पर कॉलबैक दर्ज करना पसंद कर सकते हैं।

फ्यूचर पर कॉलबैक रजिस्टर करें

कुछ प्रोग्राम में 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::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 गेम्स आईडी से लिंक किया जाता है। यह नया खाता आपके फायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत है, और इसका उपयोग आपके प्रोजेक्ट में प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है।

अपने खेल में, आप उपयोगकर्ता के फायरबेस यूआईडी को 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();
}

आपके फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप auth चर से साइन-इन किए गए उपयोगकर्ता की विशिष्ट उपयोगकर्ता आईडी प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।

किसी उपयोगकर्ता की Play गेम्स प्लेयर जानकारी प्राप्त करने या Play गेम्स सेवाओं तक पहुँचने के लिए, Google Play गेम्स सेवाओं C++ SDK द्वारा प्रदान किए गए API का उपयोग करें।

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

auth->SignOut();