C++ দিয়ে Google Play Games পরিষেবা ব্যবহার করে প্রমাণীকরণ করুন

আপনি Firebase-এ নির্মিত এবং C++ এ লেখা একটি Android গেমে খেলোয়াড়দের সাইন ইন করতে Google Play Games পরিষেবা ব্যবহার করতে পারেন। Google Play Games পরিষেবাগুলি ব্যবহার করতে Firebase-এর সাথে সাইন-ইন করুন, প্রথমে Google Play Games-এর মাধ্যমে প্লেয়ারে সাইন-ইন করুন এবং যখন আপনি তা করবেন তখন একটি OAuth 2.0 auth কোডের অনুরোধ করুন৷ তারপর, একটি Firebase শংসাপত্র তৈরি করতে PlayGamesAuthProvider এ অনুমোদন কোডটি পাস করুন, যা আপনি Firebase-এর সাথে প্রমাণীকরণ করতে ব্যবহার করতে পারেন।

তুমি শুরু করার আগে

আপনি Firebase প্রমাণীকরণ ব্যবহার করার আগে, আপনাকে করতে হবে:

  • আপনার C++ প্রজেক্ট নিবন্ধন করুন এবং Firebase ব্যবহার করতে কনফিগার করুন।

    যদি আপনার C++ প্রোজেক্ট ইতিমধ্যেই Firebase ব্যবহার করে, তাহলে এটি ইতিমধ্যেই Firebase-এর জন্য নিবন্ধিত এবং কনফিগার করা আছে।

  • আপনার C++ প্রকল্পে Firebase C++ SDK যোগ করুন।

মনে রাখবেন যে আপনার C++ প্রজেক্টে Firebase যোগ করার জন্য Firebase কনসোল এবং আপনার খোলা C++ প্রজেক্টের উভয় কাজ জড়িত থাকে (উদাহরণস্বরূপ, আপনি কনসোল থেকে Firebase কনফিগার ফাইলগুলি ডাউনলোড করেন, তারপর সেগুলিকে আপনার C++ প্রকল্পে নিয়ে যান)।

আপনার Firebase প্রকল্প সেট আপ করুন

  1. আপনি যদি ইতিমধ্যেই না করে থাকেন তাহলে Firebase কনসোলের সেটিংস পৃষ্ঠায় আপনার গেমের SHA-1 ফিঙ্গারপ্রিন্ট সেট করুন।

    আপনি gradle signingReport কমান্ডের মাধ্যমে আপনার স্বাক্ষর শংসাপত্রের SHA হ্যাশ পেতে পারেন:

    ./gradlew signingReport

  2. একটি সাইন-ইন প্রদানকারী হিসাবে Google Play গেম সক্ষম করুন:

    1. Firebase কনসোলে, প্রমাণীকরণ বিভাগটি খুলুন।

    2. আপনার প্রজেক্টের ওয়েব সার্ভার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট তৈরি করুন এবং প্রাপ্ত করুন:

      1. সাইন ইন পদ্ধতি ট্যাবের মধ্যে, Google সাইন-ইন প্রদানকারী সক্ষম করুন৷

      2. ওয়েব সার্ভার ক্লায়েন্ট আইডি এবং Google সাইন-ইন প্রদানকারীর গোপনীয়তা অনুলিপি করুন।

    3. সাইন ইন পদ্ধতি ট্যাবের মধ্যে, প্লে গেমস সাইন-ইন প্রদানকারীকে সক্ষম করুন এবং আপনার প্রকল্পের ওয়েব সার্ভার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট গোপনীয়তা নির্দিষ্ট করুন, যা আপনি শেষ ধাপে পেয়েছেন।

আপনার Firebase অ্যাপের তথ্য দিয়ে Play Games পরিষেবা কনফিগার করুন

  1. Google Play Console- এ, আপনার Google Play অ্যাপ খুলুন বা একটি তৈরি করুন।

  2. গ্রো বিভাগে, প্লে গেম পরিষেবাগুলি > সেটআপ এবং পরিচালনা > কনফিগারেশন ক্লিক করুন।

  3. হ্যাঁ ক্লিক করুন, আমার গেম ইতিমধ্যেই Google API ব্যবহার করছে , তালিকা থেকে আপনার ফায়ারবেস প্রকল্প নির্বাচন করুন এবং তারপর ব্যবহার করুন ক্লিক করুন।

  4. প্লে গেমস পরিষেবা কনফিগারেশন পৃষ্ঠায়, শংসাপত্র যোগ করুন ক্লিক করুন।

    1. গেম সার্ভারের ধরন নির্বাচন করুন।
    2. OAuth ক্লায়েন্ট ক্ষেত্রে, আপনার প্রকল্পের ওয়েব ক্লায়েন্ট আইডি নির্বাচন করুন। নিশ্চিত করুন যে এটি সেই একই ক্লায়েন্ট আইডি যা আপনি প্লে গেমস সাইন-ইন সক্ষম করার সময় নির্দিষ্ট করেছেন৷
    3. আপনার পরিবর্তন সংরক্ষণ করুন.
  5. এখনও প্লে গেম পরিষেবা কনফিগারেশন পৃষ্ঠায়, আবার শংসাপত্র যোগ করুন ক্লিক করুন৷

    1. অ্যান্ড্রয়েড টাইপ নির্বাচন করুন।
    2. OAuth ক্লায়েন্ট ক্ষেত্রে, আপনার প্রকল্পের Android ক্লায়েন্ট আইডি নির্বাচন করুন। (আপনি যদি আপনার অ্যান্ড্রয়েড ক্লায়েন্ট আইডি দেখতে না পান তবে নিশ্চিত হন যে আপনি Firebase কনসোলে আপনার গেমের SHA-1 ফিঙ্গারপ্রিন্ট সেট করেছেন।)
    3. আপনার পরিবর্তন সংরক্ষণ করুন.
  6. পরীক্ষক পৃষ্ঠায়, প্লে স্টোরে রিলিজ করার আগে আপনার গেমটিতে সাইন ইন করতে সক্ষম হওয়া প্রয়োজন এমন যেকোনো ব্যবহারকারীর ইমেল ঠিকানা যোগ করুন।

আপনার গেমে Play Games সাইন-ইন সংহত করুন

আপনি আপনার গেমে খেলোয়াড়দের সাইন ইন করার আগে, আপনাকে অবশ্যই Google Play Games সাইন-ইন সংহত করতে হবে।

একটি C++ Android প্রকল্পে Play Games সাইন-ইন করার জন্য সমর্থন যোগ করার সবচেয়ে সহজ এবং প্রস্তাবিত উপায় হল Google সাইন-ইন C++ SDK ব্যবহার করা।

Google সাইন-ইন C++ SDK ব্যবহার করে আপনার গেমে Play Games সাইন-ইন যোগ করতে, নিম্নলিখিতগুলি করুন:

  1. Google সাইন-ইন ইউনিটি প্লাগইন সংগ্রহস্থল ক্লোন বা ডাউনলোড করুন, যেটিতে C++ SDKও রয়েছে।

  2. staging/native/ ডিরেক্টরিতে থাকা প্রজেক্টটি তৈরি করুন, হয় Android স্টুডিও ব্যবহার করে বা 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 ফাইলে, একটি স্থানীয় সংগ্রহস্থল হিসাবে SDK বিল্ড আউটপুট ডিরেক্টরি যোগ করুন:

    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. তারপর, আপনার গেমে, প্লে গেমস সাইন-ইন ব্যবহার করতে এবং একটি সার্ভার প্রমাণীকরণ কোড পুনরুদ্ধার করতে একটি 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();
        }
    }
    

Firebase দিয়ে প্রমাণীকরণ করুন

প্লেয়ার প্লে গেমের সাথে সাইন ইন করার পরে, আপনি ফায়ারবেসের সাথে প্রমাণীকরণ করতে প্রমাণীকরণ কোড ব্যবহার করতে পারেন।

  1. প্লেয়ার প্লে গেমস ব্যবহার করে সফলভাবে সাইন ইন করার পরে, প্লেয়ারের অ্যাকাউন্টের জন্য একটি প্রমাণীকরণ কোড পান।

  2. তারপর, ফায়ারবেস শংসাপত্রের জন্য প্লে গেম পরিষেবাগুলি থেকে প্রমাণীকরণ কোড বিনিময় করুন এবং প্লেয়ারটিকে প্রমাণীকরণ করতে 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);
}

পরবর্তী পদক্ষেপ

একজন ব্যবহারকারী প্রথমবার সাইন ইন করার পরে, একটি নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করা হয় এবং তাদের প্লে গেম আইডির সাথে লিঙ্ক করা হয়। এই নতুন অ্যাকাউন্টটি আপনার Firebase প্রকল্পের অংশ হিসাবে সংরক্ষণ করা হয়েছে এবং আপনার প্রকল্পের প্রতিটি অ্যাপ জুড়ে একজন ব্যবহারকারীকে শনাক্ত করতে ব্যবহার করা যেতে পারে।

আপনার গেমে, আপনি firebase::auth::User অবজেক্ট থেকে ব্যবহারকারীর Firebase UID পেতে পারেন:

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 ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ব্যবহারকারী আইডি পেতে পারেন এবং ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারে তা নিয়ন্ত্রণ করতে এটি ব্যবহার করতে পারেন।

একজন ব্যবহারকারীর প্লে গেম প্লেয়ারের তথ্য পেতে বা প্লে গেম পরিষেবাগুলি অ্যাক্সেস করতে, Google Play গেম পরিষেবা C++ SDK দ্বারা প্রদত্ত API ব্যবহার করুন।

একজন ব্যবহারকারীকে সাইন আউট করতে, SignOut() কল করুন :

auth->SignOut();