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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

इससे पहले कि आप फायरबेस प्रमाणीकरण का उपयोग कर सकें, आपको यह करना होगा:

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

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

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

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

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

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

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

    ./gradlew signingReport

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

    1. अपने प्रोजेक्ट के वेब सर्वर क्लाइंट आईडी और क्लाइंट सीक्रेट का पता लगाएं। वेब सर्वर क्लाइंट आईडी आपके फ़ायरबेस प्रोजेक्ट को Google Play प्रमाणन सर्वर से पहचानती है।

      इन मूल्यों को खोजने के लिए:

      1. Google API कंसोल क्रेडेंशियल पेज में अपना फायरबेस प्रोजेक्ट खोलें।
      2. OAuth 2.0 क्लाइंट आईडी अनुभाग में, वेब क्लाइंट (Google सेवा द्वारा स्वतः निर्मित) विवरण पृष्ठ खोलें। यह पेज आपके वेब सर्वर क्लाइंट आईडी और सीक्रेट को सूचीबद्ध करता है।
    2. फिर, फायरबेस कंसोल में, प्रमाणीकरण अनुभाग खोलें।

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

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

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

  2. ग्रो सेक्शन में, Play Games services > Setup & Management > Configuration क्लिक करें।

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

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

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

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

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

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

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

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

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

  2. staging/native/ निर्देशिका में निहित प्रोजेक्ट बनाएं, या तो एंड्रॉइड स्टूडियो या gradlew build उपयोग करें।

    बिल्ड अपने आउटपुट को 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 फ़ाइल में, एसडीके बिल्ड आउटपुट डायरेक्टरी को स्थानीय रिपॉजिटरी के रूप में जोड़ें:

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

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

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:20.4.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. फिर, अपने गेम में, 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 - गेम्स के साथ खिलाड़ी के साइन इन करने के बाद, आप Firebase से प्रमाणित करने के लिए प्रमाणन कोड का उपयोग कर सकते हैं।

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

  2. फिर, Play - गेम्स सेवाओं के प्रमाणन कोड को 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());
      }
    }

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

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

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

अपने गेम में, आप उपयोगकर्ता के Firebase UID को 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();
}

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

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

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

auth->SignOut();