অ্যাপ ইঞ্জিন ব্যবহারকারী পরিষেবা থেকে ক্লাউড আইডেন্টিটি প্ল্যাটফর্মে স্থানান্তর করুন (মডিউল 21)

1. ওভারভিউ

কোডল্যাবগুলির সার্ভারলেস মাইগ্রেশন স্টেশন সিরিজ (স্ব-গতিসম্পন্ন, হ্যান্ড-অন টিউটোরিয়াল) এবং সম্পর্কিত ভিডিওগুলির লক্ষ্য হল Google ক্লাউড সার্ভারহীন বিকাশকারীদের তাদের অ্যাপ্লিকেশনগুলিকে এক বা একাধিক মাইগ্রেশনের মাধ্যমে গাইড করে আধুনিকীকরণ করতে সাহায্য করা, প্রাথমিকভাবে উত্তরাধিকার পরিষেবাগুলি থেকে দূরে সরে যাওয়া৷ এটি করা আপনার অ্যাপগুলিকে আরও বহনযোগ্য করে তোলে এবং আপনাকে আরও বিকল্প এবং নমনীয়তা দেয়, যা আপনাকে ক্লাউড পণ্যগুলির একটি বিস্তৃত পরিসরের সাথে একীভূত করতে এবং অ্যাক্সেস করতে এবং আরও সহজে নতুন ভাষা প্রকাশগুলিতে আপগ্রেড করতে সক্ষম করে৷ প্রাথমিকভাবে প্রথম দিকের ক্লাউড ব্যবহারকারীদের উপর ফোকাস করার সময়, প্রাথমিকভাবে অ্যাপ ইঞ্জিন (স্ট্যান্ডার্ড এনভায়রনমেন্ট) ডেভেলপারদের, এই সিরিজটি ক্লাউড ফাংশন এবং ক্লাউড রানের মতো অন্যান্য সার্ভারহীন প্ল্যাটফর্মগুলিকে অন্তর্ভুক্ত করার জন্য যথেষ্ট বিস্তৃত, বা অন্য কোথাও প্রযোজ্য হলে।

এই কোডল্যাবের উদ্দেশ্য হল Python 2 অ্যাপ ইঞ্জিন ডেভেলপারদের দেখানো যে কিভাবে অ্যাপ ইঞ্জিন ব্যবহারকারীদের API/পরিষেবা থেকে ক্লাউড আইডেন্টিটি প্ল্যাটফর্মে (GCIP) স্থানান্তর করা যায়। ডেটাস্টোর অ্যাক্সেসের জন্য অ্যাপ ইঞ্জিন NDB থেকে ক্লাউড NDB- তে একটি অন্তর্নিহিত স্থানান্তর (প্রাথমিকভাবে মাইগ্রেশন মডিউল 2-এ অন্তর্ভুক্ত) পাশাপাশি পাইথন 3-এ আপগ্রেড করা হয়েছে।

মডিউল 20 মডিউল 1 নমুনা অ্যাপে ব্যবহারকারীদের API-এর ব্যবহার কীভাবে যুক্ত করতে হয় তা কভার করে। এই মডিউলে, আপনি সমাপ্ত মডিউল 20 অ্যাপটি নেবেন এবং এর ব্যবহার ক্লাউড আইডেন্টিটি প্ল্যাটফর্মে স্থানান্তর করবেন।

আপনি কিভাবে শিখবেন

আপনি কি প্রয়োজন হবে

সমীক্ষা

আপনি কিভাবে এই টিউটোরিয়াল ব্যবহার করবেন?

শুধুমাত্র এটি মাধ্যমে পড়ুন এটি পড়ুন এবং ব্যায়াম সম্পূর্ণ করুন

পাইথনের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

আপনি Google ক্লাউড পরিষেবাগুলি ব্যবহার করার সাথে আপনার অভিজ্ঞতাকে কীভাবে মূল্যায়ন করবেন?

নবজাতক মধ্যবর্তী দক্ষ

2. পটভূমি

অ্যাপ ইঞ্জিন ব্যবহারকারীদের পরিষেবা হল অ্যাপ ইঞ্জিন অ্যাপগুলির দ্বারা ব্যবহারের জন্য একটি ব্যবহারকারী প্রমাণীকরণ ব্যবস্থা৷ এটি তার পরিচয় প্রদানকারী হিসাবে Google সাইন-ইন প্রদান করে, অ্যাপে ব্যবহারের জন্য সুবিধাজনক লগইন এবং লগআউট লিঙ্ক প্রদান করে এবং অ্যাডমিন ব্যবহারকারীদের ধারণা এবং অ্যাডমিন-শুধু-কার্যকারিতা সমর্থন করে। অ্যাপ্লিকেশন পোর্টেবিলিটি উন্নত করতে, Google ক্লাউড লিগ্যাসি অ্যাপ ইঞ্জিন বান্ডিল পরিষেবাগুলি থেকে ক্লাউড স্বতন্ত্র পরিষেবাগুলিতে স্থানান্তরিত করার সুপারিশ করে, উদাহরণস্বরূপ, ব্যবহারকারী পরিষেবা থেকে ক্লাউড আইডেন্টিটি প্ল্যাটফর্মে , অন্যদের মধ্যে৷

আইডেন্টিটি প্ল্যাটফর্ম ফায়ারবেস প্রমাণীকরণের উপর ভিত্তি করে, এবং বহু-ফ্যাক্টর প্রমাণীকরণ, OIDC এবং SAML SSO সমর্থন, মাল্টি-টেন্যান্সি, 99.95% SLA এবং আরও অনেক কিছু সহ বেশ কয়েকটি এন্টারপ্রাইজ বৈশিষ্ট্য যুক্ত করে। এই পার্থক্যগুলি আইডেন্টিটি প্ল্যাটফর্ম এবং ফায়ারবেস প্রমাণীকরণ পণ্য তুলনা পৃষ্ঠাতেও হাইলাইট করা হয়েছে। উভয় পণ্যেই ব্যবহারকারীদের পরিষেবা দ্বারা প্রদত্ত কার্যকারিতার তুলনায় উল্লেখযোগ্যভাবে বেশি বৈশিষ্ট্য রয়েছে৷

এই মডিউল 21 কোডল্যাবটি অ্যাপের ব্যবহারকারীর প্রমাণীকরণকে ব্যবহারকারী পরিষেবা থেকে আইডেন্টিটি প্ল্যাটফর্ম বৈশিষ্ট্যগুলিতে স্যুইচ করে দেখায় যা মডিউল 20-এ প্রদর্শিত কার্যকারিতাকে সবচেয়ে ঘনিষ্ঠভাবে প্রতিফলিত করে। মডিউল 21 এছাড়াও ডেটাস্টোরে mi2gdu অ্যাক্সেসের জন্য অ্যাপ ইঞ্জিন NDB থেকে ক্লাউড NDB-তে স্থানান্তরিত করার বৈশিষ্ট্য রয়েছে। .

যদিও মডিউল 20 কোডটি পাইথন 2 নমুনা অ্যাপ হিসাবে "বিজ্ঞাপন" করা হয়েছে, উৎসটি নিজেই পাইথন 2 এবং 3 সামঞ্জস্যপূর্ণ, এবং এটি মডিউল 21-এ এখানে আইডেন্টিটি প্ল্যাটফর্মে (এবং ক্লাউড এনডিবি) স্থানান্তরিত হওয়ার পরেও সেভাবেই রয়ে গেছে। এটা সম্ভব Python 3 এ আপগ্রেড করার সময় ব্যবহারকারীদের পরিষেবা ব্যবহার করা চালিয়ে যান কারণ আইডেন্টিটি প্ল্যাটফর্মে স্থানান্তর করা ঐচ্ছিক। Python 3-এর মতো ২য়-প্রজন্মের রানটাইমে আপগ্রেড করার সময় কীভাবে বান্ডেল করা পরিষেবাগুলি ব্যবহার চালিয়ে যেতে হয় তা শিখতে মডিউল 17 কোডল্যাব এবং ভিডিওটি দেখুন।

এই টিউটোরিয়ালে নিম্নলিখিত পদক্ষেপগুলি রয়েছে:

  1. সেটআপ/প্রিওয়ার্ক
  2. কনফিগারেশন আপডেট করুন
  3. অ্যাপ্লিকেশন কোড পরিবর্তন করুন

3. সেটআপ/প্রিওয়ার্ক

এই বিভাগটি ব্যাখ্যা করে কিভাবে:

  1. আপনার ক্লাউড প্রকল্প সেট আপ করুন
  2. বেসলাইন নমুনা অ্যাপ্লিকেশন পান
  3. (পুনঃ) বেসলাইন অ্যাপ স্থাপন এবং যাচাই করুন
  4. নতুন Google ক্লাউড পরিষেবা/এপিআই সক্ষম করুন৷

এই পদক্ষেপগুলি নিশ্চিত করে যে আপনি কাজের কোড দিয়ে শুরু করছেন যা স্বতন্ত্র ক্লাউড পরিষেবাগুলিতে স্থানান্তরের জন্য প্রস্তুত৷

1. সেটআপ প্রকল্প

আপনি যদি মডিউল 20 কোডল্যাব সম্পন্ন করেন, তাহলে একই প্রকল্প (এবং কোড) পুনরায় ব্যবহার করুন। বিকল্পভাবে, একটি একেবারে নতুন প্রকল্প তৈরি করুন বা অন্য একটি বিদ্যমান প্রকল্প পুনরায় ব্যবহার করুন৷ প্রকল্পটির একটি সক্রিয় বিলিং অ্যাকাউন্ট এবং একটি সক্ষম অ্যাপ ইঞ্জিন অ্যাপ রয়েছে তা নিশ্চিত করুন৷ আপনার প্রোজেক্ট আইডি খুঁজুন এবং এই কোডল্যাবের সময় এটি ব্যবহার করুন এবং যখনই আপনি PROJ_ID ভেরিয়েবলের মুখোমুখি হন তখন এটি ব্যবহার করুন।

2. বেসলাইন নমুনা অ্যাপ পান

পূর্বশর্তগুলির মধ্যে একটি হল একটি কার্যকরী মডিউল 20 অ্যাপ ইঞ্জিন অ্যাপ, তাই হয় এর কোডল্যাবটি সম্পূর্ণ করুন (প্রস্তাবিত; উপরে লিঙ্ক) অথবা রেপো থেকে মডিউল 20 কোডটি অনুলিপি করুন। আপনি আপনার বা আমাদের ব্যবহার করুন না কেন, এখানেই আমরা শুরু করব ("স্টার্ট")। এই কোডল্যাব মডিউল 21 রেপো ফোল্ডারে ("FINISH") যা আছে তার সাথে সাদৃশ্যপূর্ণ কোডের সাথে উপসংহারে মাইগ্রেশনের মধ্য দিয়ে চলে।

মডিউল 20 রেপো ফোল্ডারটি অনুলিপি করুন। এটি নীচের আউটপুটের মতো হওয়া উচিত এবং আপনি যদি মডিউল 20 কোডল্যাব করেন তবে সম্ভবত একটি lib ফোল্ডার থাকতে পারে:

$ ls
README.md               appengine_config.py     templates
app.yaml                main.py                 requirements.txt

3. (পুনরায়) বেসলাইন অ্যাপ স্থাপন এবং যাচাই করুন

মডিউল 20 অ্যাপ স্থাপন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন:

  1. lib ফোল্ডারটি মুছে ফেলুন যদি একটি থাকে এবং pip install -t lib -r requirements.txt চালান এটি পুনরায় পূরণ করুন। আপনার যদি পাইথন 2 এবং 3 উভয়ই ইনস্টল থাকে তবে আপনাকে pip2 ব্যবহার করতে হতে পারে।
  2. নিশ্চিত করুন যে আপনি gcloud কমান্ড-লাইন টুলটি ইনস্টল এবং আরম্ভ করেছেন এবং এর ব্যবহার পর্যালোচনা করেছেন।
  3. আপনি জারি করা প্রতিটি gcloud কমান্ড দিয়ে আপনার PROJ_ID লিখতে না চাইলে, প্রথমে gcloud config set project PROJ_ID সহ ক্লাউড প্রকল্প সেট করুন।
  4. gcloud app deploy সাথে নমুনা অ্যাপটি স্থাপন করুন
  5. নিশ্চিত করুন যে অ্যাপটি ত্রুটি ছাড়াই প্রত্যাশিতভাবে চলছে। আপনি যদি মডিউল 20 কোডল্যাব সম্পূর্ণ করে থাকেন, তাহলে অ্যাপটি ব্যবহারকারীর লগইন তথ্য (ব্যবহারকারীর ইমেল, সম্ভাব্য "অ্যাডমিন ব্যাজ", এবং লগইন/লগআউট বোতাম) এবং সাম্প্রতিক ভিজিটগুলির সাথে শীর্ষে প্রদর্শন করে (নীচে চিত্রিত)।

907e64c19ef964f8.png

নিয়মিত ব্যবহারকারী হিসাবে সাইন-ইন করার ফলে ব্যবহারকারীর ইমেল ঠিকানা প্রদর্শিত হয় এবং "লগইন" বোতামটি "লগআউট" বোতামে পরিবর্তিত হয়:

ad7b59916b69a035.png

প্রশাসক ব্যবহারকারী হিসাবে সাইন-ইন করার ফলে ব্যবহারকারীর ইমেল ঠিকানাটি "(প্রশাসক)" এর পাশে প্রদর্শিত হয়:

867bcb3334149e4.png

4. নতুন Google ক্লাউড API/পরিষেবা সক্রিয় করুন

ভূমিকা

মডিউল 20 অ্যাপটি অ্যাপ ইঞ্জিন এনডিবি এবং ব্যবহারকারীদের এপিআই ব্যবহার করে, বান্ডেল করা পরিষেবাগুলির জন্য অতিরিক্ত সেটআপের প্রয়োজন হয় না, তবে স্বতন্ত্র ক্লাউড পরিষেবাগুলি করে, এবং আপডেট করা অ্যাপটি ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম এবং ক্লাউড ডেটাস্টোর উভয়কেই নিয়োগ করবে ( ক্লাউড এনডিবি ক্লায়েন্ট লাইব্রেরির মাধ্যমে) . উপরন্তু, অ্যাপ ইঞ্জিন প্রশাসক ব্যবহারকারীদের নির্ধারণ করার জন্য আমাদের প্রয়োজনের জন্য ক্লাউড রিসোর্স ম্যানেজার API- এর ব্যবহারও প্রয়োজন।

খরচ

  • অ্যাপ ইঞ্জিন এবং ক্লাউড ডেটাস্টোরে "সর্বদা বিনামূল্যে" স্তরের কোটা রয়েছে, এবং যতক্ষণ আপনি এই সীমার মধ্যে থাকবেন, এই টিউটোরিয়ালটি সম্পূর্ণ করার জন্য আপনাকে চার্জ করা উচিত নয়। এছাড়াও আরও বিশদ বিবরণের জন্য অ্যাপ ইঞ্জিন মূল্য নির্ধারণ পৃষ্ঠা এবং ক্লাউড ডেটাস্টোর মূল্য পৃষ্ঠাটি দেখুন৷
  • ক্লাউড আইডেন্টিটি প্ল্যাটফর্মের ব্যবহার মাসিক সক্রিয় ব্যবহারকারীর সংখ্যা (এমএইউ) বা প্রমাণীকরণ যাচাইকরণের উপর নির্ভর করে বিল করা হয়; "ফ্রি" এর কিছু সংস্করণ প্রতিটি ব্যবহারের মডেলের জন্য উপলব্ধ। আরো বিস্তারিত জানার জন্য এর মূল্য পৃষ্ঠা দেখুন। উপরন্তু, অ্যাপ ইঞ্জিন এবং ক্লাউড ডেটাস্টোরের জন্য বিলিং প্রয়োজন হলেও, GCIP-এর ব্যবহার নিজে থেকে বিলিং সক্ষম করার প্রয়োজন হয় না যতক্ষণ না আপনি এর যন্ত্রবিহীন দৈনিক কোটা অতিক্রম না করেন, তাই ক্লাউড প্রকল্পগুলির জন্য এটি বিবেচনা করুন যেগুলিতে বিলিং-প্রয়োজনীয় ক্লাউড জড়িত নয় APIs/পরিষেবা।
  • ক্লাউড রিসোর্স ম্যানেজার API-এর ব্যবহার তার মূল্য পৃষ্ঠা প্রতি বেশিরভাগ অংশের জন্য বিনামূল্যে।

ব্যবহারকারীরা আপনার পছন্দের উপর নির্ভর করে ক্লাউড কনসোল বা কমান্ড-লাইন থেকে ( gcloud কমান্ডের মাধ্যমে, ক্লাউড SDK এর অংশ) ক্লাউড এপিআই সক্ষম করে। ক্লাউড ডেটাস্টোর এবং ক্লাউড রিসোর্স ম্যানেজার এপিআই দিয়ে শুরু করা যাক।

ক্লাউড কনসোল থেকে

ক্লাউড কনসোলে API ম্যানেজারের লাইব্রেরি পৃষ্ঠায় (সঠিক প্রকল্পের জন্য) যান এবং অনুসন্ধান বার ব্যবহার করে একটি API অনুসন্ধান করুন। c7a740304e9d35b.png

এই API গুলি সক্ষম করুন:

প্রতিটি API-এর জন্য আলাদাভাবে সক্ষম বোতাম খুঁজুন এবং ক্লিক করুন—আপনাকে বিলিং তথ্যের জন্য অনুরোধ করা হতে পারে। উদাহরণস্বরূপ, এখানে রিসোর্স ম্যানেজার API-এর জন্য পৃষ্ঠা রয়েছে:

fc7bd8f4c49d12e5.png

বোতামটি সক্ষম হয়ে গেলে পরিচালনায় পরিবর্তিত হয় (সাধারণত কয়েক সেকেন্ড পরে):

8eca12d6cc7b45b0.png

একইভাবে ক্লাউড ডেটাস্টোর সক্ষম করুন:

83811599b110e46b.png

কমান্ড লাইন থেকে

যদিও কনসোল থেকে API সক্রিয় করা দৃশ্যত তথ্যপূর্ণ, কিছু কমান্ড-লাইন পছন্দ করে। আপনি একবারে যেকোন সংখ্যক API সক্রিয় করতে সক্ষম হওয়ার অতিরিক্ত বোনাস পাবেন। ক্লাউড ডেটাস্টোর এবং ক্লাউড রিসোর্স ম্যানেজার এপিআই উভয়ই সক্ষম করতে এই কমান্ডটি ইস্যু করুন এবং অপারেশন সম্পূর্ণ হওয়ার জন্য অপেক্ষা করুন, যেমনটি এখানে চিত্রিত হয়েছে:

$ gcloud services enable cloudresourcemanager.googleapis.com datastore.googleapis.com
Operation "operations/acat.p2-aaa-bbb-ccc-ddd-eee-ffffff" finished successfully.

আপনাকে বিলিং তথ্যের জন্য অনুরোধ করা হতে পারে।

উপরের কমান্ডে ব্যবহৃত প্রতিটি API-এর জন্য "URLs" কে API পরিষেবার নাম বলা হয়, এবং সেগুলি প্রতিটি API-এর জন্য লাইব্রেরি পৃষ্ঠার নীচে পাওয়া যেতে পারে। আপনি যদি আপনার নিজের অ্যাপের জন্য অন্যান্য ক্লাউড API সক্ষম করতে চান, তাহলে আপনি তাদের সংশ্লিষ্ট API পৃষ্ঠাগুলিতে তাদের নিজ নিজ পরিষেবার নাম খুঁজে পেতে পারেন। এই কমান্ডটি আপনি সক্ষম করতে পারেন এমন APIগুলির জন্য সমস্ত পরিষেবার নাম তালিকাভুক্ত করে:

gcloud services list --available --filter="name:googleapis.com"

ক্লাউড কনসোলে হোক বা কমান্ড-লাইনে, একবার আপনি উপরের পদক্ষেপগুলি সম্পূর্ণ করার পরে, আমাদের নমুনা এখন সেই APIগুলি অ্যাক্সেস করতে সক্ষম। পরবর্তী পদক্ষেপগুলি হল ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম সক্ষম করা এবং প্রয়োজনীয় কোড পরিবর্তন করা৷

ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম সক্ষম এবং সেটআপ করুন (কেবলমাত্র ক্লাউড কনসোল)

ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম হল একটি মার্কেটপ্লেস পরিষেবা কারণ এটি Google ক্লাউডের বাইরের কোনো সম্পদের সাথে সংযোগ করে বা তার উপর নির্ভর করে, উদাহরণস্বরূপ, Firebase প্রমাণীকরণ । এই সময়ে, আপনি শুধুমাত্র ক্লাউড কনসোল থেকে মার্কেটপ্লেস পরিষেবাগুলি সক্ষম করতে পারেন৷ নীচের পদক্ষেপগুলি অনুসরণ করুন:

  1. ক্লাউড মার্কেটপ্লেসে ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম পৃষ্ঠায় যান এবং সেখানে সক্ষম বোতামে ক্লিক করুন। অনুরোধ করা হলে Firebase প্রমাণীকরণ থেকে আপগ্রেড করুন—এটি করা অতিরিক্ত বৈশিষ্ট্যগুলিকে আনলক করে, যেমন পূর্বে ব্যাকগ্রাউন্ড বিভাগে বর্ণিত। এখানে মার্কেটপ্লেস পৃষ্ঠাটি সক্ষম বোতামটি হাইলাইট করছে: 28475f1c9b29de69.png
  2. একবার আইডেন্টিটি প্ল্যাটফর্ম সক্ষম হয়ে গেলে, আপনাকে স্বয়ংক্রিয়ভাবে পরিচয় প্রদানকারী পৃষ্ঠায় নিয়ে যাওয়া হতে পারে। যদি না হয়, সেখানে পেতে এই সুবিধাজনক লিঙ্ক ব্যবহার করুন. fc2d92d42a5d1dd7.png
  3. Google Auth প্রদানকারী সক্ষম করুন৷ যদি কোন প্রদানকারী সেট আপ করা না থাকে, তাহলে একটি প্রদানকারী যোগ করুন ক্লিক করুন এবং Google নির্বাচন করুন। আপনি যখন এই স্ক্রিনে ফিরে আসবেন, তখন Google এন্ট্রি চালু করা উচিত। Google হল একমাত্র প্রমাণীকরণ প্রদানকারী যা আমরা এই টিউটোরিয়ালে অ্যাপ ইঞ্জিন ব্যবহারকারী পরিষেবাটিকে হালকা Google সাইন-ইন পরিষেবা হিসাবে মিরর করতে ব্যবহার করছি৷ আপনার নিজের অ্যাপ্লিকেশানগুলিতে, আপনি অতিরিক্ত প্রমাণ প্রদানকারী সক্ষম করতে পারেন৷
  4. যখন আপনি Google এবং অন্যান্য কাঙ্খিত প্রমাণীকরণ প্রদানকারীকে নির্বাচন এবং সেট আপ করেন, তখন অ্যাপ্লিকেশন সেটআপের বিবরণে ক্লিক করুন এবং নিশ্চিতকরণ ডায়ালগ উইন্ডো থেকে, ওয়েব ট্যাবে config অবজেক্টে apiKey এবং authDomain কপি করুন, উভয়কে নিরাপদে সংরক্ষণ করুন৷ কেন এটা সব কপি না? এই ডায়ালগের স্নিপেটটি হার্ডকোড এবং তারিখযুক্ত, তাই শুধুমাত্র সবচেয়ে গুরুত্বপূর্ণ বিটগুলি সংরক্ষণ করুন এবং আরও সমসাময়িক ফায়ারবেস প্রমাণীকরণ ব্যবহারের সাথে আমাদের কোডে ব্যবহার করুন৷ একবার আপনি মানগুলি অনুলিপি করে সেগুলিকে নিরাপদ কোথাও সংরক্ষণ করার পরে, সমস্ত প্রয়োজনীয় সেটআপ সম্পূর্ণ করে বন্ধ বোতামে ক্লিক করুন৷ bbb09dcdd9be538e.png

4. কনফিগারেশন আপডেট করুন

কনফিগারেশনের আপডেটের মধ্যে রয়েছে বিভিন্ন কনফিগারেশন ফাইল পরিবর্তন করার পাশাপাশি অ্যাপ ইঞ্জিনের সমতুল্য তৈরি করা কিন্তু ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম ইকোসিস্টেমের মধ্যে।

appengine_config.py

  • Python 3 এ আপগ্রেড করলে, appengine_config.py মুছুন
  • যদি আইডেন্টিটি প্ল্যাটফর্মে আধুনিকীকরণের পরিকল্পনা করা হয় কিন্তু পাইথন 2-এ থাকে তবে ফাইলটি মুছে ফেলবেন না। পরিবর্তে, আমরা পাইথন 2 ব্যাকপোর্টের সময় পরে এটি আপডেট করব।

requirements.txt

মডিউল 20 এর requirements.txt ফাইল শুধুমাত্র ফ্লাস্ক তালিকাভুক্ত। মডিউল 21 এর জন্য, নিম্নলিখিত প্যাকেজগুলি যুক্ত করুন:

requirements.txt এর বিষয়বস্তু এখন এইরকম হওয়া উচিত:

flask
google-auth
google-cloud-ndb
google-cloud-resource-manager
firebase-admin

app.yaml

  • Python 3-এ আপগ্রেড করার অর্থ হল app.yaml ফাইলটিকে সরল করা। রানটাইম নির্দেশিকা ব্যতীত সমস্ত কিছু সরান, এবং এটিকে Python 3-এর বর্তমান সমর্থিত সংস্করণে সেট করুন৷ উদাহরণটি বর্তমানে সংস্করণ 3.10 ব্যবহার করে৷
  • আপনি যদি পাইথন 2-এর সাথে থাকেন তবে এখনও এখানে কোনো পদক্ষেপ নেবেন না।

আগে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

মডিউল 20 নমুনা অ্যাপটিতে স্ট্যাটিক ফাইল হ্যান্ডলার নেই। আপনার অ্যাপ্লিকেশানগুলি যদি করে তবে সেগুলি অক্ষত রেখে দিন৷ আপনি চাইলে আপনার সমস্ত স্ক্রিপ্ট হ্যান্ডলারগুলিকে সরিয়ে দিতে পারেন বা যতক্ষণ না আপনি তাদের হ্যান্ডেলগুলিকে auto পরিবর্তন করেন ততক্ষণ রেফারেন্সের জন্য সেগুলিকে সেখানে রেখে দিতে পারেন, যেমন app.yaml মাইগ্রেশন গাইডে বর্ণিত হয়েছে৷ এই পরিবর্তনগুলির সাথে, Python 3-এর জন্য আপডেট করা app.yaml সহজ করা হয়েছে:

পরে:

runtime: python310

অন্যান্য কনফিগারেশন আপডেট

পাইথন 2 তে থাকা বা পাইথন 3 এ পোর্ট করা হোক না কেন, আপনার যদি একটি lib ফোল্ডার থাকে তবে এটি মুছুন।

5. অ্যাপ্লিকেশন কোড পরিবর্তন করুন

এই বিভাগে ক্লাউড আইডেন্টিটি প্ল্যাটফর্মের সাথে অ্যাপ ইঞ্জিন ব্যবহারকারী পরিষেবার ব্যবহার প্রতিস্থাপন করে প্রধান অ্যাপ্লিকেশন ফাইল, main.py এর আপডেটগুলি বৈশিষ্ট্যযুক্ত৷ মূল অ্যাপ্লিকেশন আপডেট করার পরে, আপনি ওয়েব টেমপ্লেট, templates/index.html আপডেট করবেন।

আমদানি এবং সূচনা আপডেট করুন

আমদানি আপডেট এবং অ্যাপ্লিকেশন সংস্থান শুরু করার জন্য নীচের পদক্ষেপগুলি অনুসরণ করুন:

  1. আমদানির জন্য, ক্লাউড এনডিবি দিয়ে অ্যাপ ইঞ্জিন NDB প্রতিস্থাপন করুন।
  2. ক্লাউড এনডিবি-র সাথে, ক্লাউড রিসোর্স ম্যানেজারও আমদানি করুন।
  3. আইডেন্টিটি প্ল্যাটফর্ম Firebase Auth-এর উপর ভিত্তি করে, তাই Firebase অ্যাডমিন SDK আমদানি করুন।
  4. ক্লাউড এপিআই-এর জন্য একটি API ক্লায়েন্ট ব্যবহার করা প্রয়োজন, তাই ফ্লাস্ক শুরু করার ঠিক নীচে ক্লাউড এনডিবি-র জন্য এটি শুরু করুন।

ক্লাউড রিসোর্স ম্যানেজার প্যাকেজটি এখানে ইম্পোর্ট করা হলেও, আমরা অ্যাপ ইনিশিয়ালাইজেশনের পরবর্তী পর্যায়ে এটি ব্যবহার করব। নীচে মডিউল 20 থেকে আমদানি এবং সূচনা এবং তারপরে উপরের পরিবর্তনগুলি বাস্তবায়নের জন্য বিভাগগুলি কীভাবে দেখা উচিত তা অনুসরণ করে:

আগে:

from flask import Flask, render_template, request
from google.appengine.api import users
from google.appengine.ext import ndb

app = Flask(__name__)

পরে:

from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb, resourcemanager
from firebase_admin import auth, initialize_app

# initialize Flask and Cloud NDB API client
app = Flask(__name__)
ds_client = ndb.Client()

অ্যাপ ইঞ্জিন অ্যাডমিন ব্যবহারকারীদের জন্য সমর্থন

অ্যাপটিতে যোগ করার জন্য দুটি উপাদান রয়েছে যা অ্যাডমিন ব্যবহারকারীদের স্বীকৃতি সমর্থন করে:

  • _get_gae_admins() — প্রশাসক ব্যবহারকারীদের সমন্বিত সেট; একবার ফোন করে সেভ করেছিলাম
  • is_admin() — সাইন-ইন করা ব্যবহারকারী অ্যাডমিন ব্যবহারকারী কিনা তা পরীক্ষা করে; যে কোন ব্যবহারকারী লগইন কল

ইউটিলিটি ফাংশন, _get_gae_admins() , বর্তমান ক্লাউড IAM অনুমতি-নীতি আনতে রিসোর্স ম্যানেজার API-কে কল করে। মঞ্জুরি-নীতি কোন প্রিন্সিপালকে (মানব ব্যবহারকারী, পরিষেবা অ্যাকাউন্ট ইত্যাদি) কী ভূমিকা দেওয়া হবে তা সংজ্ঞায়িত করে এবং প্রয়োগ করে৷ সেটআপ অন্তর্ভুক্ত:

  • ক্লাউড প্রজেক্ট আইডি ( PROJ_ID ) আনা হচ্ছে
  • একটি রিসোর্স ম্যানেজার API ক্লায়েন্ট তৈরি করা হচ্ছে ( rm_client )
  • অ্যাপ ইঞ্জিন প্রশাসক ভূমিকাগুলির একটি (শুধু পঠনযোগ্য) সেট তৈরি করা ( _TARGETS )

রিসোর্স ম্যানেজারের ক্লাউড প্রকল্প আইডি প্রয়োজন, তাই google.auth.default() আমদানি করুন এবং প্রকল্প আইডি পেতে সেই ফাংশনটিতে কল করুন। এই কলটিতে একটি প্যারামিটার রয়েছে যা দেখতে একটি URL এর মতো কিন্তু এটি একটি OAuth2 অনুমতির সুযোগ ৷ ক্লাউডে অ্যাপ্লিকেশন চালানোর সময়, উদাহরণস্বরূপ, একটি Compute Engine VM বা App Engine অ্যাপে, একটি ডিফল্ট পরিষেবা অ্যাকাউন্ট সরবরাহ করা হয় যার বিস্তৃত সুবিধা রয়েছে৷ ন্যূনতম বিশেষাধিকারের সর্বোত্তম অনুশীলনের সাথে তাল মিলিয়ে, আমরা আপনার নিজস্ব ব্যবহারকারী-পরিচালিত পরিষেবা অ্যাকাউন্ট তৈরি করার পরামর্শ দিই৷

API কলগুলির জন্য, সঠিকভাবে কাজ করার জন্য প্রয়োজনীয় ন্যূনতম স্তরে আপনার অ্যাপ্লিকেশানগুলির পরিধি আরও কমিয়ে আনা ভাল৷ আমরা যে রিসোর্স ম্যানেজার এপিআই কল করব তা হল get_iam_policy() যা পরিচালনা করার জন্য নিম্নলিখিত সুযোগগুলির মধ্যে একটি প্রয়োজন :

  • https://www.googleapis.com/auth/cloud-platform
  • https://www.googleapis.com/auth/cloud-platform.read-only
  • https://www.googleapis.com/auth/cloudplatformprojects
  • https://www.googleapis.com/auth/cloudplatformprojects.readonly

নমুনা অ্যাপের অনুমতি-নীতিতে শুধুমাত্র পঠনযোগ্য অ্যাক্সেস প্রয়োজন। এটি নীতি পরিবর্তন করে না বা পুরো প্রকল্পে অ্যাক্সেসের প্রয়োজন হয় না। অর্থাৎ অ্যাপটির প্রথম তিনটি অনুমতির প্রয়োজন নেই। শেষটি হল যা প্রয়োজন, এবং আমরা নমুনা অ্যাপের জন্য এটিই প্রয়োগ করছি।

ফাংশনের মূল অংশটি অ্যাডমিন ব্যবহারকারীদের একটি খালি সেট তৈরি করে ( admins ), get_iam_policy() এর মাধ্যমে allow_policy আনয়ন করে এবং অ্যাপ ইঞ্জিন অ্যাডমিনের ভূমিকার জন্য বিশেষভাবে খুঁজছেন এর সমস্ত বাইন্ডিংয়ের মাধ্যমে লুপ করে:

  • roles/viewer
  • roles/editor
  • roles/owner
  • roles/appengine.appAdmin

প্রাপ্ত প্রতিটি লক্ষ্য ভূমিকার জন্য, এটি কোন ব্যবহারকারীদের সেই ভূমিকার অন্তর্গত তা সমন্বিত করে, তাদেরকে অ্যাডমিন ব্যবহারকারীদের সামগ্রিক সেটে যুক্ত করে। এটি এই অ্যাপ ইঞ্জিন ইনস্ট্যান্সের জীবনের জন্য একটি ধ্রুবক ( _ADMINS ) হিসাবে পাওয়া এবং ক্যাশে করা সমস্ত অ্যাডমিন ব্যবহারকারীদের ফেরত দিয়ে শেষ হয়৷ আমরা শীঘ্রই যে কল আসছে দেখতে পাবেন.

ক্লাউড এনডিবি এপিআই main.py ( _get_gae_admins() ) ds_client

def _get_gae_admins():
    'return set of App Engine admins'
    # setup constants for calling Cloud Resource Manager API
    _, PROJ_ID = default(  # Application Default Credentials and project ID
            ['https://www.googleapis.com/auth/cloudplatformprojects.readonly'])
    rm_client = resourcemanager.ProjectsClient()
    _TARGETS = frozenset((     # App Engine admin roles
            'roles/viewer',
            'roles/editor',
            'roles/owner',
            'roles/appengine.appAdmin',
    ))

    # collate users who are members of at least one GAE admin role (_TARGETS)
    admins = set()                      # set of all App Engine admins
    allow_policy = rm_client.get_iam_policy(resource='projects/%s' % PROJ_ID)
    for b in allow_policy.bindings:     # bindings in IAM allow-policy
        if b.role in _TARGETS:          # only look at GAE admin roles
            admins.update(user.split(':', 1).pop() for user in b.members)
    return admins

যখন ব্যবহারকারীরা অ্যাপটিতে লগইন করেন, তখন নিম্নলিখিতগুলি ঘটে:

  1. একজন ব্যবহারকারী Firebase-এ সাইন ইন করার পর ওয়েব টেমপ্লেট থেকে দ্রুত চেক করা হয়।
  2. যখন টেমপ্লেটে auth স্টেট পরিবর্তন হয়, তখন /is_admin এ একটি Ajax-শৈলী fetch() কল করা হয় যার হ্যান্ডলার হল পরবর্তী ফাংশন, is_admin()
  3. Firebase ID টোকেনটি POST বডিতে is_admin() তে পাস করা হয়, যা এটিকে হেডার থেকে বের করে দেয় এবং এটিকে যাচাই করার জন্য Firebase অ্যাডমিন SDK-কে কল করে। এটি একটি বৈধ ব্যবহারকারী হলে, তাদের ইমেল ঠিকানা বের করুন এবং এটি একজন প্রশাসক ব্যবহারকারী কিনা তা পরীক্ষা করুন৷
  4. বুলিয়ান ফলাফলটি সফল 200 হিসাবে টেমপ্লেটে ফিরে আসে।

_get_gae_admins() এর ঠিক পরে main.pyis_admin() যোগ করুন :

@app.route('/is_admin', methods=['POST'])
def is_admin():
    'check if user (via their Firebase ID token) is GAE admin (POST) handler'
    id_token = request.headers.get('Authorization')
    email = auth.verify_id_token(id_token).get('email')
    return {'admin': email in _ADMINS}, 200

ব্যবহারকারী পরিষেবা থেকে উপলব্ধ কার্যকারিতা প্রতিলিপি করার জন্য উভয় ফাংশনের সমস্ত কোড প্রয়োজন, বিশেষত এটি is_current_user_admin() ফাংশন। মডিউল 20-এ এই ফাংশন কলটি সমস্ত ভারী-উত্তোলন করেছে, মডিউল 21 এর বিপরীতে যেখানে আমরা একটি প্রতিস্থাপন সমাধান প্রয়োগ করি। ভাল খবর হল যে অ্যাপটি আর একটি অ্যাপ ইঞ্জিন-শুধুমাত্র পরিষেবার উপর নির্ভরশীল নয়, যার অর্থ আপনি আপনার অ্যাপগুলিকে ক্লাউড রান বা অন্যান্য পরিষেবাগুলিতে সরাতে পারেন৷ উপরন্তু, আপনি শুধুমাত্র _TARGETS এ কাঙ্খিত ভূমিকাগুলিতে স্যুইচ করে আপনার নিজের অ্যাপগুলির জন্য "প্রশাসক ব্যবহারকারী" এর সংজ্ঞা পরিবর্তন করতে পারেন যেখানে অ্যাপ ইঞ্জিন প্রশাসক ভূমিকার জন্য ব্যবহারকারী পরিষেবা হার্ডকোড করা হয়েছে৷

Firebase Auth শুরু করুন এবং অ্যাপ ইঞ্জিন অ্যাডমিন ব্যবহারকারীদের ক্যাশে করুন

ফ্লাস্ক অ্যাপটি আরম্ভ করা হয়েছে এবং ক্লাউড এনডিবি এপিআই ক্লায়েন্ট তৈরি করা হয়েছে এবং ক্লাউড এনডিবি এপিআই ক্লায়েন্ট তৈরি করা হয়েছে সেই জায়গার কাছে আমরা শীর্ষে ফায়ারবেস প্রমাণীকরণ শুরু করতে পারতাম, কিন্তু সমস্ত অ্যাডমিন কোড সংজ্ঞায়িত না হওয়া পর্যন্ত এটির প্রয়োজন ছিল না, যেখানে আমরা এখন আছি। একইভাবে, এখন যে _get_gae_admins() সংজ্ঞায়িত করা হয়েছে, অ্যাডমিন ব্যবহারকারীদের তালিকা ক্যাশে করতে এটিকে কল করুন।

is_admin() এর ফাংশন বডির নীচে এই লাইনগুলি যোগ করুন :

# initialize Firebase and fetch set of App Engine admins
initialize_app()
_ADMINS = _get_gae_admins()

ডেটা মডেল আপডেট দেখুন

Visit ডেটা মডেল পরিবর্তন হয় না। ডেটাস্টোর অ্যাক্সেসের জন্য ক্লাউড NDB API ক্লায়েন্ট কনটেক্সট ম্যানেজার, ds_client.context() এর সুস্পষ্ট ব্যবহার প্রয়োজন। কোডে, এর মানে হল আপনি ব্লক with পাইথনের ভিতরে store_visit() এবং fetch_visits() উভয়েই ডেটাস্টোর কলগুলিকে মোড়ানো। এই আপডেটটি মডিউল 2-এর অনুরূপ। নিম্নরূপ পরিবর্তনগুলি করুন:

আগে:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    return Visit.query().order(-Visit.timestamp).fetch(limit)

পরে:

class Visit(ndb.Model):
    'Visit entity registers visitor IP address & timestamp'
    visitor   = ndb.StringProperty()
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def store_visit(remote_addr, user_agent):
    'create new Visit entity in Datastore'
    with ds_client.context():
        Visit(visitor='{}: {}'.format(remote_addr, user_agent)).put()

def fetch_visits(limit):
    'get most recent visits'
    with ds_client.context():
        return Visit.query().order(-Visit.timestamp).fetch(limit)

ব্যবহারকারী লগইন যুক্তিকে ওয়েব টেমপ্লেটে সরান

অ্যাপ ইঞ্জিন ব্যবহারকারী পরিষেবাটি সার্ভার-সাইড যেখানে ফায়ারবেস প্রমাণ এবং ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম প্রধানত ক্লায়েন্ট-সাইড। ফলস্বরূপ, মডিউল 20 অ্যাপের বেশিরভাগ ব্যবহারকারী ব্যবস্থাপনা কোড মডিউল 21 ওয়েব টেমপ্লেটে চলে যায়।

main.py এ, ওয়েব কনটেক্সট টেমপ্লেটে পাঁচটি প্রয়োজনীয় ডেটা পাস করে, তালিকাভুক্ত প্রথম চারটি ব্যবহারকারীর ব্যবস্থাপনার সাথে যুক্ত এবং ব্যবহারকারী সাইন-ইন করেছেন কি না তার উপর নির্ভর করে ভিন্ন:

  • who — সাইন-ইন করলে ব্যবহারকারীর ইমেল বা অন্যথায় ব্যবহারকারী
  • admin(প্রশাসন) ব্যাজ যদি সাইন-ইন করা ব্যবহারকারী একজন প্রশাসক হন
  • signলগইন বা লগআউট বোতাম দেখান
  • link — সাইন-ইন বা সাইন-ইন-আউট লিঙ্ক বোতামে ক্লিক করুন
  • visits — সাম্প্রতিক পরিদর্শন

আগে:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)

    # put together users context for web template
    user = users.get_current_user()
    context = {  # logged in
        'who':   user.nickname(),
        'admin': '(admin)' if users.is_current_user_admin() else '',
        'sign':  'Logout',
        'link':  '/_ah/logout?continue=%s://%s/' % (
                      request.environ['wsgi.url_scheme'],
                      request.environ['HTTP_HOST'],
                  ),  # alternative to users.create_logout_url()
    } if user else {  # not logged in
        'who':   'user',
        'admin': '',
        'sign':  'Login',
        'link':  users.create_login_url('/'),
    }

    # add visits to context and render template
    context['visits'] = visits  # display whether logged in or not
    return render_template('index.html', **context)

সমস্ত ব্যবহারকারী ব্যবস্থাপনা ওয়েব টেমপ্লেটে চলে যাচ্ছে, তাই আমাদের কাছে শুধুমাত্র ভিজিট বাকি আছে, মূল হ্যান্ডলারকে আমরা মডিউল 1 অ্যাপে যা ছিল তা ফিরিয়ে আনছি:

পরে:

@app.route('/')
def root():
    'main application (GET) handler'
    store_visit(request.remote_addr, request.user_agent)
    visits = fetch_visits(10)
    return render_template('index.html', visits=visits)

ওয়েব টেমপ্লেট আপডেট করুন

পূর্ববর্তী বিভাগ থেকে সমস্ত আপডেট টেমপ্লেটের মত দেখতে কেমন? প্রধানত টেমপ্লেটে চলমান অ্যাপ থেকে Firebase Auth-এ ব্যবহারকারীর ব্যবস্থাপনা সরানো এবং সেই সমস্ত কোডের একটি আংশিক পোর্ট যা আমরা JavaScript-এ সরিয়ে নিয়েছি। আমরা main.py বেশ খানিকটা সঙ্কুচিত দেখেছি, তাই templates/index.html এ অনুরূপ বৃদ্ধি আশা করুন।

আগে:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
</head>
<body>
<p>
Welcome, {{ who }} <code>{{ admin }}</code>
<button id="logbtn">{{ sign }}</button>
</p><hr>

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

<script>
document.getElementById("logbtn").onclick = () => {
    window.location.href = '{{ link }}';
};
</script>
</body>
</html>

নীচের বিষয়বস্তু দিয়ে সম্পূর্ণ ওয়েব টেমপ্লেট প্রতিস্থাপন করুন:

পরে:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>

<script type="module">
// import Firebase module attributes
import {
        initializeApp
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-app.js";
import {
        GoogleAuthProvider,
        getAuth,
        onAuthStateChanged,
        signInWithPopup,
        signOut
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-auth.js";

// Firebase config:
// 1a. Go to: console.cloud.google.com/customer-identity/providers
// 1b. May be prompted to enable GCIP and upgrade from Firebase
// 2. Click: "Application Setup Details" button
// 3. Copy: 'apiKey' and 'authDomain' from 'config' variable
var firebaseConfig = {
        apiKey: "YOUR_API_KEY",
        authDomain: "YOUR_AUTH_DOMAIN",
};

// initialize Firebase app & auth components
initializeApp(firebaseConfig);
var auth = getAuth();
var provider = new GoogleAuthProvider();
//provider.setCustomParameters({prompt: 'select_account'});

// define login and logout button functions
function login() {
    signInWithPopup(auth, provider);
};

function logout() {
    signOut(auth);
};

// check if admin & switch to logout button on login; reset everything on logout
onAuthStateChanged(auth, async (user) => {
    if (user && user != null) {
        var email = user.email;
        who.innerHTML = email;
        logbtn.onclick = logout;
        logbtn.innerHTML = "Logout";
        var idToken = await user.getIdToken();
        var rsp = await fetch("/is_admin", {
                method: "POST",
                headers: {Authorization: idToken}
        });
        var data = await rsp.json();
        if (data.admin) {
            admin.style.display = "inline";
        }
    } else {
        who.innerHTML = "user";
        admin.style.display = "none";
        logbtn.onclick = login;
        logbtn.innerHTML = "Login";
    }
});
</script>
</head>

<body>
<p>
Welcome, <span id="who"></span> <span id="admin"><code>(admin)</code></span>
<button id="logbtn"></button>
</p><hr>

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

<script>
var who    = document.getElementById("who");
var admin  = document.getElementById("admin");
var logbtn = document.getElementById("logbtn");
</script>
</body>
</html>

এই এইচটিএমএল বডিতে অনেকগুলি উপাদান রয়েছে, তাই আসুন একবারে এক টুকরো নিয়ে নিই।

ফায়ারবেস আমদানি

এইচটিএমএল ডকুমেন্টের শিরোনামে থাকা অবস্থায়, একবার পৃষ্ঠার শিরোনাম অতিক্রম করে, প্রয়োজনীয় Firebase উপাদানগুলি আমদানি করুন৷ ফায়ারবেস উপাদানগুলি দক্ষতার জন্য এখন একাধিক মডিউলে বিভক্ত। Firebase আরম্ভ করার কোডটি প্রধান Firebase অ্যাপ মডিউল থেকে আমদানি করা হয় যখন যে ফাংশনগুলি Firebase প্রমাণীকরণ পরিচালনা করে, Google একটি প্রমাণ প্রদানকারী হিসাবে, সাইন ইন এবং আউট করে এবং প্রমাণীকরণ অবস্থা পরিবর্তন "কলব্যাক" সবই Firebase প্রমাণীকরণ মডিউল থেকে আমদানি করা হয়:

<!doctype html>
<html>
<head>
<title>VisitMe Example</title>

<script type="module">
// import Firebase module attributes
import {
        initializeApp
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-app.js";
import {
        GoogleAuthProvider,
        getAuth,
        onAuthStateChanged,
        signInWithPopup,
        signOut
} from "https://www.gstatic.com/firebasejs/9.10.0/firebase-auth.js";

ফায়ারবেস কনফিগারেশন

এর আগে এই টিউটোরিয়ালের আইডেন্টিটি প্ল্যাটফর্ম সেটআপ অংশের সময়, আপনি অ্যাপ্লিকেশন সেটআপ বিশদ ডায়ালগ থেকে apiKey এবং authDomain সংরক্ষণ করেছিলেন। এই পরবর্তী বিভাগে firebaseConfig ভেরিয়েবলে সেই মানগুলি যোগ করুন। আরও বিশদ নির্দেশাবলীর একটি লিঙ্ক মন্তব্যে দেওয়া হয়েছে:

// Firebase config:
// 1a. Go to: console.cloud.google.com/customer-identity/providers
// 1b. May be prompted to enable GCIP and upgrade from Firebase
// 2. Click: "Application Setup Details" button
// 3. Copy: 'apiKey' and 'authDomain' from 'config' variable
var firebaseConfig = {
        apiKey: "YOUR_API_KEY",
        authDomain: "YOUR_AUTH_DOMAIN",
};

ফায়ারবেস ইনিশিয়ালাইজেশন

পরবর্তী বিভাগটি এই কনফিগারেশন তথ্য দিয়ে Firebase শুরু করে।

// initialize Firebase app & auth components
initializeApp(firebaseConfig);
var auth = getAuth();
var provider = new GoogleAuthProvider();
//provider.setCustomParameters({prompt: 'select_account'});

এটি একটি প্রমাণ প্রদানকারী হিসাবে Google ব্যবহার করার ক্ষমতা সেট করে এবং আপনার ব্রাউজার সেশনে শুধুমাত্র একটি Google অ্যাকাউন্ট নিবন্ধিত থাকলেও অ্যাকাউন্ট নির্বাচককে দেখানোর জন্য একটি মন্তব্য-আউট বিকল্প প্রদান করে। অন্য কথায়, যখন আপনার একাধিক অ্যাকাউন্ট থাকে, তখন আপনাকে এই "অ্যাকাউন্ট-পিকার" হিসাবে প্রত্যাশিতভাবে উপস্থাপন করা হয়: a38369389b7c4c7e.png যাইহোক, সেশনে শুধুমাত্র একজন ব্যবহারকারী থাকলে, লগইন প্রক্রিয়া স্বয়ংক্রিয়ভাবে সম্পূর্ণ হয় কোনো ব্যবহারকারীর ইন্টারঅ্যাকশন ছাড়াই। (পপআপটি প্রদর্শিত হয় তারপর অদৃশ্য হয়ে যায়।) আপনি কাস্টম প্যারামিটার লাইনে মন্তব্য না করে একজন ব্যবহারকারীর জন্য (বনাম অবিলম্বে অ্যাপে লগ ইন করা) দেখানোর জন্য অ্যাকাউন্ট-পিকার ডায়ালগটিকে জোর করতে পারেন। যদি সক্ষম করা থাকে, এমনকি একক-ব্যবহারকারী লগইনও অ্যাকাউন্ট-পিকার নিয়ে আসে: b75624cb68d94557.png

লগইন এবং লগআউট ফাংশন

কোডের পরবর্তী লাইনগুলি লগইন বা লগআউট বোতাম ক্লিকের জন্য ফাংশন তৈরি করে:

// define login and logout button functions
function login() {
    signInWithPopup(auth, provider);
};

function logout() {
    signOut(auth);
};

সাইন-ইন এবং সাইন-আউট অ্যাকশন

এই <script> ব্লকের শেষ প্রধান বিভাগটি হল এমন একটি ফাংশন যা প্রতিটি প্রমাণীকরণ পরিবর্তনের জন্য বলা হয় (সাইন-ইন বা সাইন-আউট)।

// check if admin & switch to logout button on login; reset everything on logout
onAuthStateChanged(auth, async (user) => {
    if (user && user != null) {
        var email = user.email;
        who.innerHTML = email;
        logbtn.onclick = logout;
        logbtn.innerHTML = "Logout";
        var idToken = await user.getIdToken();
        var rsp = await fetch("/is_admin", {
                method: "POST",
                headers: {Authorization: idToken}
        });
        var data = await rsp.json();
        if (data.admin) {
            admin.style.display = "inline";
        }
    } else {
        who.innerHTML = "user";
        admin.style.display = "none";
        logbtn.onclick = login;
        logbtn.innerHTML = "Login";
    }
});
</script>
</head>

একটি "ব্যবহারকারী লগ ইন" টেমপ্লেট প্রসঙ্গ বনাম একটি "ব্যবহারকারী লগ আউট" প্রসঙ্গ পাঠাতে হবে কিনা তা নির্ধারণ করে মডিউল 20-এর কোডটি এখানে স্থানান্তরিত হয়েছে। যদি ব্যবহারকারী সফলভাবে লগ ইন করে, নিম্নলিখিত ক্রিয়াগুলিকে ট্রিগার করে উপরের শর্তসাপেক্ষ ফলাফলটি true হয়:

  1. ব্যবহারকারীর ইমেল ঠিকানা প্রদর্শনের জন্য সেট করা আছে.
  2. লগইন বোতামটি লগআউটে পরিবর্তিত হয়।
  3. (admin) অ্যাডমিন ব্যবহারকারী ব্যাজ দেখাতে হবে কিনা তা নির্ধারণ করতে /is_admin এ একটি Ajax-স্টাইল কল করা হয়।

ব্যবহারকারী লগ আউট করলে, ব্যবহারকারীর সমস্ত তথ্য পুনরায় সেট করতে else ধারাটি কার্যকর করা হয়:

  1. ব্যবহারকারীর নাম ব্যবহারকারী হিসাবে সেট করা হয়েছে
  2. কোনো অ্যাডমিন ব্যাজ সরানো হয়েছে
  3. লগআউট বোতাম আবার লগইন এ পরিবর্তিত হয়েছে

টেমপ্লেট ভেরিয়েবল

শিরোনাম বিভাগ শেষ হওয়ার পরে, মূল অংশটি টেমপ্লেট ভেরিয়েবল দিয়ে শুরু হয় যা HTML উপাদান দ্বারা প্রতিস্থাপিত হয় যা প্রয়োজন অনুসারে পরিবর্তিত হয়:

  1. প্রদর্শিত ব্যবহারকারীর নাম
  2. (admin) প্রশাসক ব্যাজ (যদি প্রযোজ্য হয়)
  3. লগইন বা লগআউট বোতাম
<body>
<p>
Welcome, <span id="who"></span> <span id="admin"><code>(admin)</code></span>
<button id="logbtn"></button>
</p><hr>

সাম্প্রতিক ভিজিট এবং HTML এলিমেন্ট ভেরিয়েবল

অতি সাম্প্রতিক ভিজিট কোড পরিবর্তন হয় না, এবং চূড়ান্ত <script> ব্লক HTML উপাদানগুলির জন্য পরিবর্তনশীল সেট করে যা ঠিক উপরে তালিকাভুক্ত সাইন-ইন এবং সাইন-আউটের জন্য পরিবর্তিত হয়:

<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
    <li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>

<script>
var who    = document.getElementById("who");
var admin  = document.getElementById("admin");
var logbtn = document.getElementById("logbtn");
</script>
</body>
</html>

এটি অ্যাপ ইঞ্জিন এনডিবি এবং ব্যবহারকারীদের এপিআই থেকে ক্লাউড এনডিবি এবং আইডেন্টিটি প্ল্যাটফর্মে স্যুইচ করার পাশাপাশি পাইথন 3-তে আপগ্রেড করার জন্য অ্যাপ্লিকেশন এবং ওয়েব টেমপ্লেটে প্রয়োজনীয় পরিবর্তনগুলি সমাপ্ত করে। আপনার নতুন মডিউল 21 নমুনা অ্যাপে আসার জন্য অভিনন্দন! আমাদের সংস্করণ মডিউল 21b রেপো ফোল্ডারে পর্যালোচনার জন্য উপলব্ধ।

কোডল্যাবের পরবর্তী অংশটি ঐচ্ছিক (*) এবং শুধুমাত্র সেইসব ব্যবহারকারীদের জন্য যাদের অ্যাপগুলিকে অবশ্যই Python 2-এ থাকতে হবে, যা আপনাকে একটি কার্যকরী Python 2 মডিউল 21 অ্যাপে পৌঁছানোর জন্য প্রয়োজনীয় পদক্ষেপের মাধ্যমে নেতৃত্ব দেবে।

6. *পাইথন 2 ব্যাকপোর্ট

এই ঐচ্ছিক বিভাগটি এমন ডেভেলপারদের জন্য যারা আইডেন্টিটি প্ল্যাটফর্ম মাইগ্রেশন করছেন কিন্তু যাদের অবশ্যই Python 2 রানটাইমে চলতে হবে। এটি আপনার জন্য উদ্বেগ না হলে, এই বিভাগটি এড়িয়ে যান।

মডিউল 21 অ্যাপের একটি কার্যকরী পাইথন 2 সংস্করণ তৈরি করতে, আপনার নিম্নলিখিতগুলি প্রয়োজন:

  1. রানটাইম প্রয়োজনীয়তা : পাইথন 2 সমর্থনকারী কনফিগারেশন ফাইল এবং পাইথন 3 অসঙ্গতি এড়াতে প্রধান অ্যাপ্লিকেশনে প্রয়োজনীয় পরিবর্তন
  2. ছোটো লাইব্রেরি পরিবর্তন: রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরিতে কিছু প্রয়োজনীয় বৈশিষ্ট্য যোগ করার আগে পাইথন 2 বাতিল করা হয়েছিল। ফলস্বরূপ, সেই অনুপস্থিত কার্যকারিতা অ্যাক্সেস করার জন্য আপনার একটি বিকল্প উপায় প্রয়োজন।

কনফিগারেশন দিয়ে শুরু করে এখন সেই পদক্ষেপগুলো নেওয়া যাক।

appengine_config.py পুনরুদ্ধার করুন

এই টিউটোরিয়ালের আগে, আপনাকে appengine_config.py মুছে ফেলার জন্য নির্দেশিত করা হয়েছিল কারণ এটি Python 3 অ্যাপ ইঞ্জিন রানটাইম দ্বারা ব্যবহৃত হয় না। Python 2-এর জন্য, শুধুমাত্র এটিকে সংরক্ষণ করা আবশ্যক নয়, মডিউল 20 appengine_config.py অন্তর্নির্মিত 3rd-পার্টি লাইব্রেরিগুলির ব্যবহার সমর্থন করার জন্য আপডেট করা প্রয়োজন, যেমন grpcio এবং setuptools । যখনই আপনার অ্যাপ ইঞ্জিন অ্যাপটি ক্লাউড এনডিবি এবং ক্লাউড রিসোর্স ম্যানেজারের মতো ক্লাউড ক্লায়েন্ট লাইব্রেরি ব্যবহার করে তখনই এই প্যাকেজগুলির প্রয়োজন হয়৷

আপনি সেই প্যাকেজগুলিকে মুহূর্তের জন্য app.yaml এ যোগ করবেন, কিন্তু আপনার অ্যাপকে সেগুলি অ্যাক্সেস করার জন্য, setuptools থেকে pkg_resources.working_set.add_entry() ফাংশনটি কল করতে হবে। এটি অনুলিপি করা (স্ব-বান্ডিল বা বিক্রেতা) lib ফোল্ডারে ইনস্টল করা তৃতীয় পক্ষের লাইব্রেরিগুলিকে অন্তর্নির্মিত লাইব্রেরির সাথে যোগাযোগ করতে সক্ষম করে।

এই পরিবর্তনগুলি কার্যকর করতে আপনার appengine_config.py ফাইলে নিম্নলিখিত আপডেটগুলি প্রয়োগ করুন:

আগে:

from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)

setuptools এবং grpcio এর ব্যবহার সমর্থন করার জন্য একা এই কোডটি যথেষ্ট নয়। আরও কয়েকটি লাইন প্রয়োজন, তাই appengine_config.py আপডেট করুন যাতে এটি এইরকম দেখায়:

পরে:

import pkg_resources
from google.appengine.ext import vendor

# Set PATH to your libraries folder.
PATH = 'lib'
# Add libraries installed in the PATH folder.
vendor.add(PATH)
# Add libraries to pkg_resources working set to find the distribution.
pkg_resources.working_set.add_entry(PATH)

ক্লাউড ক্লায়েন্ট লাইব্রেরিগুলিকে সমর্থন করার জন্য প্রয়োজনীয় পরিবর্তনগুলির আরও বিশদ বিবরণ স্থানান্তরিত বান্ডেল করা পরিষেবার ডকুমেন্টেশনে পাওয়া যাবে৷

app.yaml

appengine_config.py এর মতই, app.yaml ফাইলটিকে অবশ্যই Python 2 সমর্থন করে এমন একটি ফাইলে ফিরিয়ে আনতে হবে। আসুন আসল মডিউল 20 app.yaml দিয়ে শুরু করা যাক:

আগে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

পূর্বে উল্লিখিত setuptools এবং grpcio ছাড়াও, ক্লাউড স্টোরেজ ক্লায়েন্ট লাইব্রেরি ব্যবহার করার জন্য একটি নির্ভরতা (স্পষ্টভাবে আইডেন্টিটি প্ল্যাটফর্ম মাইগ্রেশনের সাথে সম্পর্কিত নয়) রয়েছে এবং এর জন্য আরেকটি বিল্ট-ইন 3য়-পার্টি প্যাকেজ প্রয়োজন, ssl । একটি নতুন libraries বিভাগে তিনটিই যোগ করুন, সেই প্যাকেজগুলির "সর্বশেষ" উপলব্ধ সংস্করণ নির্বাচন করে, app.yaml এ:

পরে:

runtime: python27
threadsafe: yes
api_version: 1

handlers:
- url: /.*
  script: main.app

libraries:
- name: grpcio
  version: latest
- name: setuptools
  version: latest
- name: ssl
  version: latest

requirements.txt

মডিউল 21-এর জন্য, আমরা Python 3 requirements.txtGoogle Auth , Cloud NDB , ক্লাউড রিসোর্স ম্যানেজার এবং Firebase অ্যাডমিন SDK যোগ করেছি। পাইথন 2 এর পরিস্থিতি আরও জটিল:

  • রিসোর্স ম্যানেজার API নমুনা অ্যাপের জন্য প্রয়োজনীয় অনুমতি-নীতি কার্যকারিতা প্রদান করে। দুর্ভাগ্যবশত এই সমর্থনটি এখনও ক্লাউড রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরির চূড়ান্ত পাইথন 2 সংস্করণে উপলব্ধ ছিল না। (এটি শুধুমাত্র পাইথন 3 সংস্করণে উপলব্ধ।)
  • ফলস্বরূপ, API থেকে এই বৈশিষ্ট্যটি অ্যাক্সেস করার একটি বিকল্প উপায় প্রয়োজন। সমাধান হল API-এর সাথে যোগাযোগের জন্য নিম্ন-স্তরের Google APIs ক্লায়েন্ট লাইব্রেরি ব্যবহার করা। এই ক্লায়েন্ট লাইব্রেরিতে স্যুইচ করতে, google-cloud-resource-manager নিম্ন-স্তরের google-api-python-client প্যাকেজ দিয়ে প্রতিস্থাপন করুন।
  • যেহেতু Python 2 সূর্যাস্ত হয়েছে , মডিউল 21 সমর্থনকারী নির্ভরতা গ্রাফের জন্য নির্দিষ্ট সংস্করণে নির্দিষ্ট প্যাকেজ লক করা প্রয়োজন। Python 3 app.yaml এ নির্দিষ্ট না থাকলেও কিছু প্যাকেজ অবশ্যই কল করা হবে।

আগে:

flask

মডিউল 20 requirements.txt দিয়ে শুরু করে, একটি কার্যকরী মডিউল 21 অ্যাপের জন্য এটিকে নিম্নলিখিতগুলিতে আপডেট করুন:

পরে:

grpcio==1.0.0
protobuf<3.18.0
six>=1.13.0
flask
google-gax<0.13.0
google-api-core==1.31.1
google-api-python-client<=1.11.0
google-auth<2.0dev
google-cloud-datastore==1.15.3
google-cloud-firestore==1.9.0
google-cloud-ndb
google-cloud-pubsub==1.7.0
firebase-admin

নির্ভরতা পরিবর্তনের সাথে সাথে প্যাকেজ এবং সংস্করণ নম্বরগুলি রেপোতে আপডেট করা হবে, তবে এই app.yaml এই লেখার সময় একটি কার্যকরী অ্যাপের জন্য যথেষ্ট।

অন্যান্য কনফিগারেশন আপডেট

আপনি যদি এই কোডল্যাবে আগে থেকে lib ফোল্ডারটি মুছে না থাকেন তবে এখনই তা করুন। সদ্য-আপডেট করা requirements.txt এর সাথে, lib এ এই প্রয়োজনীয়তাগুলি ইনস্টল করতে এই পরিচিত কমান্ডটি জারি করুন:

pip install -t lib -r requirements.txt  # or pip2

যদি আপনার ডেভেলপমেন্ট সিস্টেমে Python 2 এবং 3 উভয়ই ইনস্টল থাকে, তাহলে আপনাকে pip এর পরিবর্তে pip2 ব্যবহার করতে হতে পারে।

অ্যাপ্লিকেশন কোড পরিবর্তন করুন

সৌভাগ্যবশত, বেশিরভাগ প্রয়োজনীয় পরিবর্তনগুলি কনফিগারেশন ফাইলগুলিতে রয়েছে। এপিআই অ্যাক্সেস করার জন্য রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরির পরিবর্তে নিম্ন-স্তরের Google API ক্লায়েন্ট লাইব্রেরি ব্যবহার করার জন্য অ্যাপ্লিকেশন কোডে একমাত্র পরিবর্তন প্রয়োজন। templates/index.html ওয়েব টেমপ্লেটে কোন আপডেটের প্রয়োজন নেই।

আমদানি এবং সূচনা আপডেট করুন

রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরি ( google.cloud.resourcemanager ) কে Google APIs ক্লায়েন্ট লাইব্রেরি ( googleapiclient.discovery ) দিয়ে প্রতিস্থাপন করুন, যেমনটি নীচের চিত্রিত হয়েছে:

আগে:

from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb, resourcemanager
from firebase_admin import auth, initialize_app

পরে:

from flask import Flask, render_template, request
from google.auth import default
from google.cloud import ndb
from googleapiclient import discovery
from firebase_admin import auth, initialize_app

অ্যাপ ইঞ্জিন অ্যাডমিন ব্যবহারকারীদের জন্য সমর্থন

নিম্ন-স্তরের ক্লায়েন্ট লাইব্রেরির ব্যবহার সমর্থন করার জন্য _get_gae_admins() -এ কয়েকটি পরিবর্তন প্রয়োজন। আসুন প্রথমে কি পরিবর্তন হচ্ছে তা নিয়ে আলোচনা করি তারপর আপডেট করার জন্য আপনাকে সমস্ত কোড দিন।

Python 2 কোডের জন্য শংসাপত্র এবং google.auth.default() থেকে প্রত্যাবর্তিত প্রজেক্ট আইডি উভয়ই ব্যবহার করা প্রয়োজন। শংসাপত্রগুলি পাইথন 3 এ ব্যবহার করা হয় না, তাই এটি একটি জেনেরিক আন্ডারস্কোর ( _ ) ডামি ভেরিয়েবলের জন্য বরাদ্দ করা হয়েছিল। যেহেতু এটি পাইথন 2 সংস্করণের জন্য প্রয়োজন, তাই আন্ডারস্কোরটিকে CREDS এ পরিবর্তন করুন। এছাড়াও, একটি রিসোর্স ম্যানেজার API ক্লায়েন্ট তৈরি করার পরিবর্তে, আপনি একটি API পরিষেবা শেষ পয়েন্ট তৈরি করবেন, একটি API ক্লায়েন্টের ধারণার অনুরূপ, তাই আমরা একই পরিবর্তনশীল নাম ( rm_client ) রাখছি। একটি পার্থক্য হল যে একটি পরিষেবার শেষপয়েন্ট চালু করার জন্য শংসাপত্র প্রয়োজন ( CREDS )।

এই পরিবর্তনগুলি নীচের কোডে প্রতিফলিত হয়:

আগে:

_, PROJ_ID = default(  # Application Default Credentials and project ID
        ['https://www.googleapis.com/auth/cloudplatformprojects.readonly'])
rm_client = resourcemanager.ProjectsClient()

পরে:

CREDS, PROJ_ID = default(  # Application Default Credentials and project ID
        ['https://www.googleapis.com/auth/cloud-platform'])
rm_client = discovery.build('cloudresourcemanager', 'v1', credentials=CREDS)

অন্য পার্থক্য হল যে রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরি মঞ্জুরি-পলিসি অবজেক্টগুলি ফেরত দেয় যা ডটেড-অ্যাট্রিবিউট নোটেশন ব্যবহার করে যখন নিম্ন-স্তরের ক্লায়েন্ট লাইব্রেরি পাইথন অভিধান প্রদান করে যেখানে বর্গাকার বন্ধনী ( [ ] ) ব্যবহার করা হয়, উদাহরণস্বরূপ, binding.role ব্যবহার করুন নিম্ন-স্তরের লাইব্রেরির জন্য রিসোর্স ম্যানেজার ক্লায়েন্ট লাইব্রেরি বনাম binding['role'] । প্রাক্তনটি "আন্ডারস্কোর_সেপারেটেড" নামগুলি ব্যবহার করে বনাম নিম্ন-স্তরের লাইব্রেরি "ক্যামেলকেসড" নামগুলিকে পছন্দ করে এবং এপিআই প্যারামিটারে পাস করার জন্য কিছুটা ভিন্ন উপায়।

এই ব্যবহারের পার্থক্যগুলি নীচে দেখানো হয়েছে:

আগে:

allow_policy = rm_client.get_iam_policy(resource='projects/%s' % PROJ_ID)
for b in allow_policy.bindings:     # bindings in IAM allow-policy
    if b.role in _TARGETS:          # only look at GAE admin roles
        admins.update(user.split(':', 1).pop() for user in b.members)

পরে:

allow_policy = rm_client.projects().getIamPolicy(resource=PROJ_ID).execute()
for b in allow_policy['bindings']:  # bindings in IAM allow-policy
    if b['role'] in _TARGETS:       # only look at GAE admin roles
        admins.update(user.split(':', 1).pop() for user in b['members'])

এই সমস্ত পরিবর্তনগুলি একসাথে রেখে, Python 3 _get_gae_admins() এই সমতুল্য Python 2 সংস্করণ দিয়ে প্রতিস্থাপন করুন:

def _get_gae_admins():
    'return set of App Engine admins'
    # setup constants for calling Cloud Resource Manager API
    CREDS, PROJ_ID = default(  # Application Default Credentials and project ID
            ['https://www.googleapis.com/auth/cloud-platform'])
    rm_client = discovery.build('cloudresourcemanager', 'v1', credentials=CREDS)
    _TARGETS = frozenset((     # App Engine admin roles
            'roles/viewer',
            'roles/editor',
            'roles/owner',
            'roles/appengine.appAdmin',
    ))

    # collate users who are members of at least one GAE admin role (_TARGETS)
    admins = set()                      # set of all App Engine admins
    allow_policy = rm_client.projects().getIamPolicy(resource=PROJ_ID).execute()
    for b in allow_policy['bindings']:  # bindings in IAM allow-policy
        if b['role'] in _TARGETS:       # only look at GAE admin roles
            admins.update(user.split(':', 1).pop() for user in b['members'])
    return admins

is_admin() ফাংশনের কোনো আপডেটের প্রয়োজন নেই কারণ এটি _get_gae_admins() এর উপর নির্ভর করে যা ইতিমধ্যেই আপডেট করা হয়েছে।

এটি Python 3 মডিউল 21 অ্যাপটিকে Python 2-এ ব্যাকপোর্ট করার জন্য প্রয়োজনীয় পরিবর্তনগুলি সমাপ্ত করে। আপনার আপডেট হওয়া মডিউল 21 নমুনা অ্যাপে আসার জন্য অভিনন্দন! আপনি মডিউল 21a রেপো ফোল্ডারে সমস্ত কোড পাবেন।

7. সারাংশ/পরিষ্কার

কোডল্যাবের শেষ ধাপগুলি হল এই অ্যাপটি চালাচ্ছেন এমন প্রিন্সিপালদের (ব্যবহারকারী বা পরিষেবা অ্যাকাউন্ট) এটি করার জন্য যথাযথ অনুমতি রয়েছে তা নিশ্চিত করা, তারপরে আপনার অ্যাপটি উদ্দেশ্য অনুযায়ী কাজ করছে এবং পরিবর্তনগুলি আউটপুটে প্রতিফলিত হয়েছে তা নিশ্চিত করতে স্থাপন করুন।

IAM অনুমতি-নীতি পড়ার ক্ষমতা

এর আগে, আমরা আপনাকে অ্যাপ ইঞ্জিন প্রশাসক ব্যবহারকারী হিসাবে স্বীকৃত হওয়ার জন্য প্রয়োজনীয় চারটি ভূমিকার সাথে পরিচয় করিয়ে দিয়েছি, কিন্তু এখন পরিচিত হওয়ার জন্য একটি পঞ্চম রয়েছে:

  • roles/viewer
  • roles/editor
  • roles/owner
  • roles/appengine.appAdmin
  • roles/resourcemanager.projectIamAdmin (আইএএম মঞ্জুরি-নীতি অ্যাক্সেসকারী প্রধানদের জন্য)

roles/resourcemanager.projectIamAdmin ভূমিকা প্রিন্সিপালদেরকে একজন এন্ড-ব্যবহারকারী অ্যাপ ইঞ্জিন প্রশাসকের ভূমিকার সদস্য কিনা তা নির্ধারণ করতে সক্ষম করে। roles/resourcemanager.projectIamAdmin এর সদস্যতা ছাড়া, ক্লাউড রিসোর্স ম্যানেজার API-কে কল করার অনুমতি-নীতি ব্যর্থ হবে।

আপনাকে এখানে কোনো সুস্পষ্ট পদক্ষেপ নিতে হবে না কারণ আপনার অ্যাপটি অ্যাপ ইঞ্জিনের ডিফল্ট পরিষেবা অ্যাকাউন্টের অধীনে চলবে যা এই ভূমিকায় স্বয়ংক্রিয়ভাবে সদস্যপদ মঞ্জুর করা হয়। এমনকি যদি আপনি বিকাশের পর্যায়ে ডিফল্ট পরিষেবা অ্যাকাউন্ট ব্যবহার করেন, আমরা দৃঢ়ভাবে সুপারিশ করি যে আপনার অ্যাপটি সঠিকভাবে কাজ করার জন্য প্রয়োজনীয় ন্যূনতম অনুমতি সহ একটি ব্যবহারকারী-পরিচালিত পরিষেবা অ্যাকাউন্ট তৈরি এবং ব্যবহার করুন। এই ধরনের একটি পরিষেবা অ্যাকাউন্টে সদস্যপদ প্রদান করতে, নিম্নলিখিত কমান্ডটি চালান:

$ gcloud projects add-iam-policy-binding PROJ_ID --member="serviceAccount:USR_MGD_SVC_ACCT@PROJ_ID.iam.gserviceaccount.com" --role=roles/resourcemanager.projectIamAdmin

PROJ_ID হল ক্লাউড প্রজেক্ট আইডি এবং USR_MGD_SVC_ACCT@PROJ_ID.iam.gserviceaccount.com হল ব্যবহারকারী-পরিচালিত পরিষেবা অ্যাকাউন্ট যা আপনি আপনার অ্যাপের জন্য তৈরি করেন। এই কমান্ডটি আপনার প্রজেক্টের জন্য আপডেট করা IAM নীতি আউটপুট করে যেখানে আপনি নিশ্চিত করতে পারেন যে পরিষেবা অ্যাকাউন্টের সদস্যপদ আছে roles/resourcemanager.projectIamAdmin । আরও তথ্যের জন্য, রেফারেন্স ডকুমেন্টেশন দেখুন। পুনরাবৃত্তি করার জন্য, আপনাকে এই কোডল্যাবে সেই কমান্ডটি ইস্যু করতে হবে না, তবে এটিকে আপনার নিজের অ্যাপগুলিকে আধুনিক করার জন্য একটি রেফারেন্স হিসাবে সংরক্ষণ করুন৷

প্রয়োগ এবং আবেদন যাচাই

স্ট্যান্ডার্ড gcloud app deploy কমান্ড দিয়ে ক্লাউডে আপনার অ্যাপ আপলোড করুন। একবার স্থাপন করা হলে, আপনি মডিউল 20 অ্যাপের সাথে প্রায় একই রকম কার্যকারিতা দেখতে পাবেন ব্যতীত আপনি সফলভাবে ব্যবহারকারী পরিচালনার জন্য ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম (এবং ফায়ারবেস প্রমাণ) দিয়ে অ্যাপ ইঞ্জিন ব্যবহারকারী পরিষেবা প্রতিস্থাপন করেছেন:

3a83ae745121d70.png

মডিউল 20-এর তুলনায় আপনি একটি পার্থক্য লক্ষ্য করবেন তা হল লগইন-এ ক্লিক করলে একটি পুনঃনির্দেশের পরিবর্তে একটি পপআপ হয়, যা নীচের কিছু স্ক্রিনশটে ক্যাপচার করা হয়েছে। যদিও মডিউল 20 এর মত, ব্রাউজারে কতগুলি Google অ্যাকাউন্ট নিবন্ধিত হয়েছে তার উপর নির্ভর করে আচরণটি কিছুটা আলাদা।

যদি ব্রাউজারে নিবন্ধিত কোনো ব্যবহারকারী না থাকে বা কোনো একক ব্যবহারকারী এখনো সাইন ইন করেনি, তাহলে একটি জেনেরিক Google সাইন-ইন পপআপ আসে:

8437f5f3d489a942.png

যদি একজন একক ব্যবহারকারী আপনার ব্রাউজারে নিবন্ধিত হন কিন্তু অন্য কোথাও সাইন-ইন করেন, তাহলে কোনো ডায়ালগ দেখা যায় না (অথবা এটি পপ আপ হয় এবং অবিলম্বে বন্ধ হয়ে যায়), এবং অ্যাপটি সাইন-ইন অবস্থায় চলে যায় (ব্যবহারকারীর ইমেল এবং লগআউট বোতামটি প্রদর্শন করে)।

কিছু বিকাশকারী একটি অ্যাকাউন্ট-পিকার প্রদান করতে চাইতে পারে, এমনকি একজন একক ব্যবহারকারীর জন্যও:

b75624cb68d94557.png

এটি বাস্তবায়নের জন্য, provider.setCustomParameters({prompt: 'select_account'}); পূর্বে বর্ণিত ওয়েব টেমপ্লেটে লাইন।

একাধিক ব্যবহারকারী থাকলে, অ্যাকাউন্ট-পিকার ডায়ালগ পপ আপ হয় (নীচে দেখুন)। যদি এখনও সাইন-ইন না করে থাকেন, ব্যবহারকারীকে অনুরোধ করা হবে। যদি ইতিমধ্যে সাইন ইন করা হয় তবে পপআপটি অদৃশ্য হয়ে যায় এবং অ্যাপটি স্বাক্ষরিত-ইন স্টেটে যায়।

C454455B6020D5E4.PNG

মডিউল 21 এর স্বাক্ষরিত রাজ্যটি মডিউল 20 এর ব্যবহারকারী ইন্টারফেসের সাথে অভিন্ন দেখায়:

49EBE4DCC1EFF11F.PNG

যখন কোনও অ্যাডমিন ব্যবহারকারী সাইন ইন করেছেন তখনও একই কথা:

44302F35B39856EB.PNG

মডিউল 21 এর বিপরীতে, মডিউল 20 সর্বদা অ্যাপ্লিকেশন (সার্ভার-সাইড কোড) থেকে ওয়েব টেম্পলেট সামগ্রীর জন্য যুক্তি অ্যাক্সেস করে। মডিউল 20 এর একটি ত্রুটি হ'ল শেষ-ব্যবহারকারী প্রথমবার অ্যাপটিতে হিট করার সময় একটি দর্শন নিবন্ধিত হয় এবং যখন কোনও ব্যবহারকারী সাইন ইন করে তখন অন্যটি নিবন্ধিত হয়।

মডিউল 21 এর জন্য, লগইন লজিকটি কেবল ওয়েব টেম্পলেট (ক্লায়েন্ট-সাইড কোড) এ স্থান নেয়। কোন সামগ্রী প্রদর্শিত হবে তা নির্ধারণের জন্য প্রয়োজনীয় সার্ভার-সাইড ট্রিপ নেই। সার্ভারে একমাত্র কলটি হ'ল শেষ-ব্যবহারকারী সাইন-ইন করার পরে অ্যাডমিন ব্যবহারকারীদের জন্য চেক। এর অর্থ হ'ল লগইন এবং লগআউটগুলি অতিরিক্ত ভিজিট নিবন্ধন করে না, তাই সাম্প্রতিকতম ভিজিট তালিকা ব্যবহারকারী পরিচালনার ক্রিয়াকলাপের জন্য স্থির থাকে। উপরের স্ক্রিনশটগুলি একাধিক ব্যবহারকারী লগইন জুড়ে চারটি ভিজিটের একই সেট প্রদর্শন করুন।

মডিউল 20 স্ক্রিনশটগুলি এই কোডল্যাবের শুরুতে "ডাবল-ভিজিট বাগ" প্রদর্শন করে। প্রতিটি সাইন-ইন বা সাইন-আউট ক্রিয়াকলাপের জন্য পৃথক ভিজিট লগগুলি প্রদর্শিত হয়। কালানুক্রমিক ক্রম প্রদর্শনকারী প্রতিটি স্ক্রিনশটের জন্য সাম্প্রতিক ভিজিটের টাইমস্ট্যাম্পগুলি পরীক্ষা করুন।

পরিষ্কার করুন

সাধারণ

আপনি যদি আপাতত কাজ শেষ করে থাকেন, তাহলে বিলিং এড়াতে আমরা আপনাকে আপনার অ্যাপ ইঞ্জিন অ্যাপটি অক্ষম করার পরামর্শ দিই। তবে আপনি যদি আরও কিছু পরীক্ষা বা পরীক্ষা করতে চান, অ্যাপ ইঞ্জিন প্ল্যাটফর্মের একটি বিনামূল্যের কোটা রয়েছে, এবং যতক্ষণ না আপনি সেই ব্যবহারের স্তরটি অতিক্রম না করেন, আপনাকে চার্জ করা উচিত নয়। এটি গণনার জন্য, তবে প্রাসঙ্গিক অ্যাপ ইঞ্জিন পরিষেবাগুলির জন্যও চার্জ হতে পারে, তাই আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন৷ যদি এই স্থানান্তরের সাথে অন্যান্য ক্লাউড পরিষেবা জড়িত থাকে, তবে সেগুলি আলাদাভাবে বিল করা হবে৷ উভয় ক্ষেত্রে, প্রযোজ্য হলে, নীচের "এই কোডল্যাবের জন্য নির্দিষ্ট" বিভাগটি দেখুন।

সম্পূর্ণ প্রকাশের জন্য, অ্যাপ ইঞ্জিনের মতো একটি Google ক্লাউড সার্ভারহীন গণনা প্ল্যাটফর্মে স্থাপন করার জন্য সামান্য বিল্ড এবং স্টোরেজ খরচ হয়। ক্লাউড স্টোরেজের মতো ক্লাউড বিল্ডের নিজস্ব ফ্রি কোটা রয়েছে। সেই ছবির সঞ্চয়স্থান সেই কোটার কিছু ব্যবহার করে। যাইহোক, আপনি এমন একটি অঞ্চলে বাস করতে পারেন যেখানে এই ধরনের বিনামূল্যের স্তর নেই, তাই সম্ভাব্য খরচ কমাতে আপনার স্টোরেজ ব্যবহার সম্পর্কে সচেতন থাকুন। নির্দিষ্ট ক্লাউড স্টোরেজ "ফোল্ডার" আপনার পর্যালোচনা করা উচিত:

  • console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/images
  • console.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com
  • উপরের স্টোরেজ লিঙ্কগুলি আপনার PROJECT_ID এবং LOC অ্যাশনের উপর নির্ভর করে, উদাহরণস্বরূপ, " us " যদি আপনার অ্যাপ্লিকেশনটি মার্কিন যুক্তরাষ্ট্রে হোস্ট করা হয়।

অন্যদিকে, আপনি যদি এই অ্যাপ্লিকেশন বা অন্যান্য সম্পর্কিত মাইগ্রেশন কোডল্যাবগুলি চালিয়ে যেতে না চান এবং সবকিছু সম্পূর্ণরূপে মুছে ফেলতে চান, তাহলে আপনার প্রকল্পটি বন্ধ করুন

এই কোডল্যাবের জন্য নির্দিষ্ট

নীচে তালিকাভুক্ত পরিষেবাগুলি এই কোডল্যাবের জন্য অনন্য৷ আরও তথ্যের জন্য প্রতিটি পণ্যের ডকুমেন্টেশন পড়ুন:

  • অ্যাপ ইঞ্জিন ডেটাস্টোর পরিষেবাটি ক্লাউড ডেটাস্টোর (ডেটাস্টোর মোডে ক্লাউড ফায়ারস্টোর) দ্বারা সরবরাহ করা হয় যার একটি বিনামূল্যের স্তর রয়েছে; আরো তথ্যের জন্য এর মূল্য পৃষ্ঠা দেখুন।
  • ক্লাউড আইডেন্টিটি প্ল্যাটফর্মের ব্যবহারের কিছু স্তরের "ফ্রি" রয়েছে যার উপর নির্ভর করে আপনি এর কোন পরিষেবা ব্যবহার করেন তার উপর নির্ভর করে। আরও তথ্যের জন্য এর মূল্য পৃষ্ঠাটি দেখুন।
  • ক্লাউড রিসোর্স ম্যানেজার এপিআই এর ব্যবহার তার মূল্য পৃষ্ঠা অনুযায়ী বেশিরভাগ অংশের জন্য বিনামূল্যে।

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

এই টিউটোরিয়ালের বাইরে, অন্যান্য মাইগ্রেশন মডিউল যা বিবেচনা করার জন্য লিগ্যাসি বান্ডিল পরিষেবাগুলি থেকে দূরে সরে যাওয়ার উপর ফোকাস করে:

  • মডিউল 2 : App Engine ndb থেকে Cloud NDB-তে স্থানান্তর করুন
  • মডিউল 7-9 : অ্যাপ ইঞ্জিন টাস্ক কিউ (পুশ টাস্ক) থেকে ক্লাউড টাস্কে স্থানান্তর করুন
  • মডিউল 12-13 : অ্যাপ ইঞ্জিন মেমক্যাশ থেকে ক্লাউড মেমোরিস্টোরে স্থানান্তর করুন
  • মডিউল 15-16 : অ্যাপ ইঞ্জিন ব্লবস্টোর থেকে ক্লাউড স্টোরেজে স্থানান্তর করুন
  • মডিউল 18-19 : অ্যাপ ইঞ্জিন টাস্ক কিউ (টাস্ক টাস্ক) থেকে ক্লাউড পাব/সাব-এ স্থানান্তর করুন

অ্যাপ ইঞ্জিন আর Google ক্লাউডে একমাত্র সার্ভারহীন প্ল্যাটফর্ম নয়। আপনার যদি একটি ছোট অ্যাপ ইঞ্জিন অ্যাপ থাকে বা যেটির কার্যকারিতা সীমিত থাকে এবং এটিকে একটি স্বতন্ত্র মাইক্রোসার্ভিসে পরিণত করতে চান, অথবা আপনি একাধিক পুনঃব্যবহারযোগ্য উপাদানে একটি মনোলিথিক অ্যাপকে বিচ্ছিন্ন করতে চান, তাহলে ক্লাউড ফাংশনে যাওয়ার বিষয়টি বিবেচনা করার জন্য এটি ভাল কারণ। কন্টেইনারাইজেশন যদি আপনার অ্যাপ্লিকেশন ডেভেলপমেন্ট ওয়ার্কফ্লো-এর অংশ হয়ে থাকে, বিশেষ করে যদি এটি একটি CI/CD (একটানা ইন্টিগ্রেশন/কন্টিনিউয়াস ডেলিভারি বা ডিপ্লয়মেন্ট) পাইপলাইন নিয়ে থাকে, তাহলে ক্লাউড রানে মাইগ্রেট করার কথা বিবেচনা করুন। এই পরিস্থিতিতে নিম্নলিখিত মডিউল দ্বারা আচ্ছাদিত করা হয়:

  • অ্যাপ ইঞ্জিন থেকে ক্লাউড ফাংশনে স্থানান্তর করুন: মডিউল 11 দেখুন
  • অ্যাপ ইঞ্জিন থেকে ক্লাউড রানে স্থানান্তরিত করুন: আপনার অ্যাপটিকে ডকারের সাথে কনটেইনারাইজ করতে মডিউল 4 দেখুন, অথবা কন্টেইনার, ডকার জ্ঞান, বা Dockerfile ছাড়াই এটি করতে মডিউল 5 দেখুন

অন্য সার্ভারহীন প্ল্যাটফর্মে স্যুইচ করা ঐচ্ছিক, এবং আমরা কোনো পরিবর্তন করার আগে আপনার অ্যাপ এবং ব্যবহারের ক্ষেত্রে সেরা বিকল্পগুলি বিবেচনা করার পরামর্শ দিই।

আপনি পরবর্তীতে যে মাইগ্রেশন মডিউলটি বিবেচনা করুন না কেন, সমস্ত সার্ভারলেস মাইগ্রেশন স্টেশন সামগ্রী (কোডল্যাব, ভিডিও, সোর্স কোড [যখন উপলব্ধ]) এর ওপেন সোর্স রেপোতে অ্যাক্সেস করা যেতে পারে। রেপোর README কোন মাইগ্রেশন বিবেচনা করতে হবে এবং মাইগ্রেশন মডিউলের কোন প্রাসঙ্গিক "অর্ডার" তার নির্দেশিকাও প্রদান করে।

8. অতিরিক্ত সম্পদ

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

কোডল্যাব সমস্যা/প্রতিক্রিয়া

আপনি যদি এই কোডল্যাবের সাথে কোনো সমস্যা খুঁজে পান, অনুগ্রহ করে ফাইল করার আগে প্রথমে আপনার সমস্যাটি অনুসন্ধান করুন। অনুসন্ধান এবং নতুন সমস্যা তৈরি করার লিঙ্ক:

মাইগ্রেশন সম্পদ

মডিউল 20 (স্টার্ট) এবং মডিউল 21 (ফিনিস) এর জন্য রেপো ফোল্ডারগুলির লিঙ্কগুলি নীচের সারণীতে পাওয়া যাবে।

কোডল্যাব

পাইথন 2

পাইথন 3

মডিউল 20

কোড

(n/a)

মডিউল 21 (এই কোডল্যাব)

কোড

কোড

অনলাইন রেফারেন্স

নীচে এই টিউটোরিয়ালের জন্য প্রাসঙ্গিক সংস্থান রয়েছে:

ক্লাউড আইডেন্টিটি প্ল্যাটফর্ম এবং ক্লাউড মার্কেটপ্লেস

ক্লাউড রিসোর্স ম্যানেজার, ক্লাউড আইএএম, ফায়ারবেস অ্যাডমিন এসডিকে

অ্যাপ ইঞ্জিন ব্যবহারকারী, অ্যাপ ইঞ্জিন এনডিবি, ক্লাউড এনডিবি, ক্লাউড ডেটাস্টোর

অন্যান্য মাইগ্রেশন মডিউল রেফারেন্স

অ্যাপ ইঞ্জিন মাইগ্রেশন

অ্যাপ ইঞ্জিন প্ল্যাটফর্ম

ক্লাউড SDK

অন্যান্য ক্লাউড তথ্য

ভিডিও

লাইসেন্স

এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন 2.0 জেনেরিক লাইসেন্সের অধীনে লাইসেন্সপ্রাপ্ত।