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

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

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

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

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

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

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

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

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

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

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

    ./gradlew signingReport

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

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

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

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

      2. Google साइन-इन प्रदाता से वेब सर्वर क्लाइंट आईडी और रहस्य की प्रतिलिपि बनाएँ।

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

अपनी फायरबेस ऐप जानकारी के साथ प्ले गेम्स सेवाओं को कॉन्फ़िगर करें

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    dependencies {
        implementation 'com.google.android.gms:play-services-auth:21.0.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. अंत में, प्लेयर को प्ले गेम्स में साइन इन करने के लिए 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();
        }
    }
    

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

खिलाड़ी द्वारा प्ले गेम्स में साइन इन करने के बाद, आप फायरबेस से प्रमाणित करने के लिए ऑथ कोड का उपयोग कर सकते हैं।

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

  2. फिर, फायरबेस क्रेडेंशियल के लिए प्ले गेम्स सेवाओं से ऑथ कोड का आदान-प्रदान करें, और खिलाड़ी को प्रमाणित करने के लिए फायरबेस क्रेडेंशियल का उपयोग करें:

    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 पर कॉलबैक पंजीकृत करना पसंद कर सकते हैं।

फ़्यूचर पर कॉलबैक पंजीकृत करें

कुछ प्रोग्रामों में 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);
}

अगले कदम

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

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