আপনি Firebase-এ নির্মিত এবং C++-এ লেখা একটি অ্যান্ড্রয়েড গেমে খেলোয়াড়দের সাইন ইন করতে Google Play Games পরিষেবা ব্যবহার করতে পারেন। Firebase-এর মাধ্যমে Google Play Games পরিষেবা ব্যবহার করে সাইন-ইন করতে, প্রথমে Google Play Games-এ খেলোয়াড়কে সাইন ইন করান এবং সেই সময়ে একটি OAuth 2.0 অথোরাইজেশন কোডের জন্য অনুরোধ করুন। তারপর, একটি Firebase ক্রেডেনশিয়াল তৈরি করার জন্য PlayGamesAuthProvider এ অথোরাইজেশন কোডটি পাঠান, যা আপনি Firebase-এর সাথে অথেন্টিকেট করতে ব্যবহার করতে পারবেন।
শুরু করার আগে
Firebase Authentication ব্যবহার করার আগে, আপনাকে নিম্নলিখিত বিষয়গুলো করতে হবে:
আপনার C++ প্রজেক্টটি রেজিস্টার করুন এবং Firebase ব্যবহারের জন্য কনফিগার করুন।
আপনার C++ প্রজেক্টে যদি আগে থেকেই Firebase ব্যবহার করা হয়, তাহলে এটি Firebase-এর জন্য ইতোমধ্যেই নিবন্ধিত এবং কনফিগার করা আছে।
আপনার C++ প্রজেক্টে Firebase C++ SDK যোগ করুন।
মনে রাখবেন যে, আপনার C++ প্রজেক্টে Firebase যোগ করার জন্য Firebase কনসোল এবং আপনার খোলা C++ প্রজেক্ট উভয় স্থানেই কাজ করতে হয় (উদাহরণস্বরূপ, আপনাকে কনসোল থেকে Firebase কনফিগারেশন ফাইলগুলো ডাউনলোড করতে হবে, তারপর সেগুলো আপনার C++ প্রজেক্টে স্থানান্তর করতে হবে)।
আপনার ফায়ারবেস প্রজেক্ট সেট আপ করুন
আপনার অ্যাপের SHA-1 ফিঙ্গারপ্রিন্টটি আগে থেকে নির্দিষ্ট করা না থাকলে, তা করে নিন।
Firebase কনসোলে, এখানে যান
> সাধারণ ট্যাব । নিচে স্ক্রল করে 'Your apps' কার্ডে যান, আপনার অ্যান্ড্রয়েড অ্যাপটি নির্বাচন করুন এবং 'SHA certificate fingerprints' ফিল্ডে আপনার SHA-1 ফিঙ্গারপ্রিন্ট যোগ করুন।
আপনি gradle
signingReportকমান্ডটি ব্যবহার করে আপনার সাইনিং সার্টিফিকেটের SHA হ্যাশ পেতে পারেন:./gradlew signingReport
আপনার অ্যাপের SHA ফিঙ্গারপ্রিন্ট কীভাবে পাবেন, সে সম্পর্কে বিস্তারিত জানতে ‘আপনার ক্লায়েন্ট প্রমাণীকরণ’ দেখুন।
সাইন-ইন প্রদানকারী হিসেবে Google Play Games সক্রিয় করুন:
Firebase কনসোলে, Security > Authentication- এ যান।
আপনার প্রোজেক্টের ওয়েব সার্ভার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট তৈরি ও সংগ্রহ করুন:
সাইন ইন পদ্ধতি ট্যাবে, গুগল সাইন-ইন প্রদানকারীকে সক্রিয় করুন।
গুগল সাইন-ইন প্রোভাইডার থেকে ওয়েব সার্ভার ক্লায়েন্ট আইডি এবং সিক্রেট কপি করুন।
সাইন ইন মেথড ট্যাবে, Play Games সাইন-ইন প্রোভাইডারটি সক্রিয় করুন এবং আপনার প্রোজেক্টের ওয়েব সার্ভার ক্লায়েন্ট আইডি ও ক্লায়েন্ট সিক্রেট উল্লেখ করুন, যা আপনি গত ধাপে পেয়েছিলেন।
আপনার Firebase অ্যাপের তথ্য দিয়ে Play Games services কনফিগার করুন
Google Play কনসোলে আপনার Google Play অ্যাপটি খুলুন অথবা একটি তৈরি করুন।
Grow সেকশনে, Play Games services > Setup & Management > Configuration- এ ক্লিক করুন।
‘হ্যাঁ, আমার গেমটি ইতিমধ্যেই গুগল এপিআই ব্যবহার করে’ বিকল্পে ক্লিক করুন, তালিকা থেকে আপনার ফায়ারবেস প্রজেক্টটি বেছে নিন এবং তারপরে ‘ ব্যবহার করুন’ বিকল্পে ক্লিক করুন।
Play Games services কনফিগারেশন পৃষ্ঠায়, ক্রেডেনশিয়াল যোগ করুন (Add Credential) বোতামে ক্লিক করুন।
- গেম সার্ভারের ধরন নির্বাচন করুন।
- OAuth ক্লায়েন্ট ফিল্ডে, আপনার প্রজেক্টের ওয়েব ক্লায়েন্ট আইডি নির্বাচন করুন। নিশ্চিত করুন যে এটি সেই একই ক্লায়েন্ট আইডি যা আপনি Play Games সাইন-ইন সক্রিয় করার সময় উল্লেখ করেছিলেন।
- আপনার পরিবর্তনগুলো সংরক্ষণ করুন।
Play Games services কনফিগারেশন পৃষ্ঠাতেই, আবার ক্রেডেনশিয়াল যোগ করুন (Add Credential) বোতামে ক্লিক করুন।
- অ্যান্ড্রয়েডের ধরন নির্বাচন করুন।
- OAuth ক্লায়েন্ট ফিল্ডে আপনার প্রোজেক্টের অ্যান্ড্রয়েড ক্লায়েন্ট আইডি নির্বাচন করুন। (যদি আপনি আপনার অ্যান্ড্রয়েড ক্লায়েন্ট আইডি দেখতে না পান, তবে নিশ্চিত হয়ে নিন যে আপনি Firebase কনসোলে আপনার গেমের SHA-1 ফিঙ্গারপ্রিন্ট সেট করেছেন।)
- আপনার পরিবর্তনগুলো সংরক্ষণ করুন।
টেস্টার পেজে, সেই সমস্ত ব্যবহারকারীদের ইমেল ঠিকানা যোগ করুন যাদের আপনার গেমটি Play Store প্রকাশ করার আগে গেমে সাইন ইন করার প্রয়োজন হবে।
আপনার গেমে প্লে গেমস সাইন-ইন সংযুক্ত করুন।
আপনার গেমে খেলোয়াড়দের সাইন ইন করানোর আগে, আপনাকে অবশ্যই গুগল প্লে গেমস সাইন-ইন সংযুক্ত করতে হবে।
একটি C++ অ্যান্ড্রয়েড প্রজেক্টে প্লে গেমস সাইন-ইন সাপোর্ট যোগ করার সবচেয়ে সহজ এবং প্রস্তাবিত উপায় হলো গুগল সাইন-ইন C++ SDK ব্যবহার করা।
Google Sign-in C++ SDK ব্যবহার করে আপনার গেমে Play Games সাইন-ইন যোগ করতে, নিম্নলিখিতগুলি করুন:
গুগল সাইন-ইন ইউনিটি প্লাগইন রিপোজিটরিটি ক্লোন বা ডাউনলোড করুন, যেটিতে সি++ এসডিকে-ও রয়েছে।
Android Studio অথবা
gradlew buildব্যবহার করেstaging/native/ডিরেক্টরিতে থাকা প্রজেক্টটি বিল্ড করুন।বিল্ডটি তার আউটপুট
google-signin-cppনামের একটি ডিরেক্টরিতে কপি করে।আপনার গেমের নেটিভ কোড মেক ফাইলে গুগল সাইন-ইন 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)এনডিকে-বিল্ড
আপনার
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)
এরপরে, জাভা হেল্পার কম্পোনেন্টটি অন্তর্ভুক্ত করুন, যা 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.5.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') }এরপর, আপনার গেমে, প্লে গেমস সাইন-ইন ব্যবহার করতে এবং একটি সার্ভার অথোরাইজেশন কোড সংগ্রহ করতে একটি
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);অবশেষে, প্লে গেমসে প্লেয়ারকে সাইন ইন করতে
SignIn()কল করুন:Future<GoogleSignIn::SignInResult> &future = gsi.SignIn();SignIn()দ্বারা ফেরত আসা Future-টি যখন resolve হয়, তখন আপনি ফলাফল থেকে সার্ভার অথেন্টিকেশন কোডটি পেতে পারেন: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::auth::Credential credential = firebase::auth::PlayGamesAuthProvider::GetCredential(server_auth_code); firebase::Future<firebase::auth::AuthResult> result = auth->SignInAndRetrieveDataWithCredential(credential);আপনার প্রোগ্রামে যদি একটি আপডেট লুপ থাকে যা নিয়মিত চলে (যেমন প্রতি সেকেন্ডে ৩০ বা ৬০ বার), তাহলে আপনি প্রতিটি আপডেটের পর একবার
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 ফাংশন থাকে যা প্রতি সেকেন্ডে ৩০ বা ৬০ বার কল করা হয়। উদাহরণস্বরূপ, অনেক গেম এই মডেল অনুসরণ করে। এই প্রোগ্রামগুলো অ্যাসিঙ্ক্রোনাস কল পোল করার জন্য 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); }
পরবর্তী পদক্ষেপ
কোনো ব্যবহারকারী প্রথমবার সাইন ইন করার পর, একটি নতুন ব্যবহারকারী অ্যাকাউন্ট তৈরি হয় এবং সেটি তার প্লে গেমস আইডির সাথে লিঙ্ক করা হয়। এই নতুন অ্যাকাউন্টটি আপনার ফায়ারবেস প্রজেক্টের অংশ হিসেবে সংরক্ষিত থাকে এবং আপনার প্রজেক্টের প্রতিটি অ্যাপে ব্যবহারকারীকে শনাক্ত করতে এটি ব্যবহার করা যেতে পারে।
আপনার গেমে, আপনি ` firebase::auth::User অবজেক্ট থেকে ব্যবহারকারীর ফায়ারবেস 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();
}
আপনার Firebase Realtime Database and Cloud Storage Security Rules-এ, আপনি auth ভেরিয়েবল থেকে সাইন-ইন করা ব্যবহারকারীর অনন্য ইউজার আইডি পেতে পারেন এবং এটি ব্যবহার করে একজন ব্যবহারকারী কোন ডেটা অ্যাক্সেস করতে পারবে তা নিয়ন্ত্রণ করতে পারেন।
কোনো ব্যবহারকারীর প্লে গেমস প্লেয়ারের তথ্য পেতে বা প্লে গেমস পরিষেবাগুলো অ্যাক্সেস করতে, গুগল প্লে গেমস সার্ভিসেস সি++ এসডিকে (Google Play Games services C++ SDK) দ্বারা প্রদত্ত এপিআইগুলো (APIs) ব্যবহার করুন।
কোনো ব্যবহারকারীকে সাইন আউট করতে, SignOut() কল করুন:
auth->SignOut();