-----লার্নিং//
মাইক্রোসার্ভিসগুলি একটি ক্রমবর্ধমান জনপ্রিয় আর্কিটেকচার, কারণ এগুলো আপনাকে অ্যাপ্লিকেশন ডেভেলপমেন্টকে ছোট-ছোট টুকরোতে বিভক্ত করার অনুমতি দেয় যা ইজিয়ার-টু-ম্যানেজ। যাইহোক, অথেনটিকেশন বাস্তবায়নের ক্ষেত্রে মাইক্রোসার্ভিস জটিলতার পরিচয় দেয়। সাধারনত, আপনাকে একটি ট্রাডিশনাল মনোলিথিক এপ্লিকেশনের ক্ষেত্রে অথেনটিকেশনের জন্য প্রবেশের এক পয়েন্ট নিয়ে চিন্তা করতে হবে। এখনও, মাইক্রোসার্ভিসগুলোর সাথে জিনিসগুলো সেট আপ করার একাধিক উপায় এবং অনেক অথেনটিকেশন প্যাটার্ন রয়েছে৷
এই টিউটোরিয়ালে, আপনি চারটি মাইক্রোসার্ভিস এবং একটি সাধারণ API গেটওয়ে সমন্বিত একটি ছোট ডেমো অ্যাপ্লিকেশন কীভাবে তৈরি করবেন তা দেখতে পাবেন। মাইক্রোসার্ভিসে অ্যাক্সেস সিকিউর করার জন্য আমি কিছু সহজ প্যাটার্ন শেয়ার করবো। এখানে উদ্দিষ্ট আর্কিটেকচারের একটি রাফ ডায়াগ্রাম এবং কম্পোনেন্টগুলোর মধ্যে যোগাযোগ প্রবাহ দেখানো একটি সিকোয়েন্স ডায়াগ্রাম রয়েছে।
রাফ আর্কিটেকচার:
সিকোয়েন্স ডায়াগ্রাম:
Implementation
শুরু করার আগে, অনুসরণ করার জন্য আপনাকে কিছু ডিপেন্ডেন্সি ইনস্টল করতে হবে। প্রথমত, আপনার ডকার এবং ডকার কম্পোজের প্রয়োজন হবে, কারণ এই টিউটোরিয়ালটি মাইক্রোসার্ভিসগুলো চালানোর জন্য কন্টেইনারের উপর অনেক বেশি নির্ভর করে। আপনার যদি ইতিমধ্যে আপনার মেশিনে ডকার ইনস্টল করা না থাকে, তাহলে অনুগ্রহ করে আপনার পছন্দের ওএসের জন্য ডকারের সেটআপ ইন্সট্রাকশন ফলো করুন।
এই টিউটোরিয়ালটি আপনি প্রয়োগ করবেন এমন বিভিন্ন অথেনটিকেশন প্যাটার্নগুলোর জন্য Okta কে ব্যাপকভাবে ব্যবহার করে। যেমন, আপনাকে একটি Okta ডেভেলপার অ্যাকাউন্ট তৈরি করতে হবে। এখনের জন্য, একটি ফ্রি অ্যাকাউন্ট তৈরি করুন। টিউটোরিয়ালটি সকল অপারেশন কভার করবে যেগুলো পরে আপনার প্রয়োজন৷
অবশেষে, APIs এবং অথেনটিকেশন মেথড টেস্ট করার জন্য, নিশ্চিত করুন যে আপনার পোস্টম্যানের সর্বশেষ সংস্করণ ইনস্টল করা আছে। পোস্টম্যান নাটকীয়ভাবে OAuth টোকেন পাওয়ার এবং API কল করার প্রক্রিয়াটিকে সহজ করে তোলে।
যেহেতু এই টিউটোরিয়ালটি প্রাথমিকভাবে অথেনটিকেশন প্যাটার্নগুলো উপর ফোকাস করে, আপনার কাছে কল করার জন্য একটি API না থাকলে প্রকৃত মাইক্রোসার্ভিসগুলো খুব বেশি গুরুত্বপূর্ণ নয়। আপনি কয়েকটি মাইক্রোসার্ভিস আপ এবং রান করার জন্য কিছু লারাভেল প্রোজেক্ট তৈরি করতে পারেন। যদিও লারাভেল এই ধরনের সাধারণ ইউজ কেসের ক্ষেত্রে কিছুটা ভারী, তবে এটি দ্রুত এবং সহজে সেট আপ করা যায়, এটি আপনার প্রয়োজনীয় সকল লাইব্রেরির সাথে আসে এবং এর একটি সাউন্ড মিডলওয়্যার সিস্টেম রয়েছে যা দিয়ে আপনি অথেনটিকেশন প্যাটার্ন ইমপ্লিমেন্ট করতে ব্যবহার করুন। Laravel প্রোজেক্টগুলো তৈরি করতে, অফিসিয়াল ডকুমেন্টেশন laravel.build সাইট ব্যবহার করার পরামর্শ দেয়, যা রান করার জন্য একটি ব্যাশ স্ক্রিপ্ট হিসাবে কাজ করে। স্ক্রিপ্টটি ব্যাশে পাইপ করার আগে নিজে পড়ে দেখা একটি ভাল আইডিয়া, তাই আপনি যদি অনিশ্চিত হন তবে এটি এক্সেকিউট করার আগে স্ক্রিপ্টটি রিভিউ করতে ভুলবেন না। এটি path প্যারামিটার গ্রহণ করে এবং প্রোজেক্ট নাম হিসাবে এটি ব্যবহার করে কাজ করে।
Getting started with microservices
শুরু করার জন্য, php-microservices-demo.cd নামে এই টিউটোরিয়ালে ব্যবহৃত সমস্ত মাইক্রোসার্ভিস হল্ড করার জন্য একটি ডিরেক্টরি তৈরি করুন এবং নিম্নলিখিত কমান্ডরটি এক্সেকিউট করুন: curl -s "https://laravel.build/api-gateway?with=redis" | bash. এটি api-gateway নামে একটি Laravel প্রোজেক্ট বিশিষ্ট একটি ডিরেক্টরি তৈরি করবে। একবার এই স্টেপটি সম্পন্ন হলে, আপনাকে এটিকে আরও চারবার চালাতে হবে; আপনি যতগুলো মাইক্রোসার্ভিস তৈরি করবেন, প্রতিটি মাইক্রোসার্ভিসের জন্য একবার করে:
এখন আমাদের ডিরেক্টরিতে মোট পাঁচটি প্রোজেক্ট থাকা উচিত। এই প্রোজেক্টগুলো Laravel Sail এর সাথে চালানোর উদ্দেশ্যে করা হয়েছে, তবে এটি একই সাথে পাঁচটি প্রোজেক্ট চালানোর জন্য অপ্টিমাল নয়। ডিপেন্ডেন্সিস ইনস্টল করতে এবং artisan কমান্ডগুলো এক্সেকিউট করতে Sail ব্যবহার করুন, তবে এপিআইগুলো চালানোর জন্য টিউটোরিয়াল ডিরেক্টরিতে একটি নতুন docker-compose.yml ফাইল তৈরি করুন। এই ফাইলটি আপনাকে সমস্ত কন্টেইনার একসাথে শুরু করার অনুমতি দেবে। ভাগ্যক্রমে, যেহেতু এপিআইগুলো সহজ হবে,আপনার এটির জন্য কোনো ডাটাবেসের প্রয়োজনও নেই, কেবল পিএইচপি কন্টেইনার প্রয়োজন। আপনার সদ্য নির্মিত docker-compose.yml ফাইলে, নিম্নলিখিত কনটেন্ট এড করুন
এই ফাইলটি সেই নেটওয়ার্কটি নির্দিষ্ট করে যা কন্টেইনারগুলো php_microservices_demo হিসাবে শেয়ার করবে, যা আপনাকে তৈরি করতে হবে। এখন এটি করতে আপনার টার্মিনালে docker network create php_microservices_demo এই কমান্ডটি রান করুন। এরপরে, আপনার current User এবং Group IDs ব্যাশের এনভায়রনমেন্ট ভেরিয়েবল হিসাবে প্রকাশ করুন, যাতে ব্যাশ ইমেইজগুলো তৈরি করার সময় সঠিক পারমিশনগুলো ম্যাপ করতে পারে। এটি করার জন্য, আপনার টার্মিনালে নিম্নলিখিত কমান্ডগুলি চালান:
উপরের কমান্ডটি আপনার OS এর উপর নির্ভর করে read-only ভেরিয়েবল সম্পর্কে একটি ওয়ার্নিং প্রদান করতে পারে। এটি ঘটলে আপনি নিরাপদে এই ওয়ার্নিং উপেক্ষা করতে পারেন।
এখন, আপনি যদি টিউটোরিয়াল রুট ডিরেক্টরি থেকে docker-compose up -d রান করেন, কিছুক্ষণ পরে, আপনি http://localhost:8080 এ api-gateway লারাভেল প্রোজেক্টটি অ্যাক্সেস করতে সক্ষম হবেন:
অথেনটিকেশন ইমপ্লিমেন্ট করার আগে, আপনাকে কিছু সিম্পল মক API তৈরি করতে হবে যাতে আপনার পরীক্ষা করার মতো কিছু থাকে। এটি করার জন্য, আপনি চারটি মাইক্রোসার্ভিস অ্যাপ্লিকেশনের প্রতিটির জন্য একটি সিঙ্গেল রুট ডিফাইন করতে পারেন— api/service/ মতো কিছু এবং এই রুটটি একটি স্ট্রিং রিটার্ন করে যা ইঙ্গিত করে এটি কোন মাইক্রোসার্ভিস। তারপরে, API গেটওয়ে একাধিক রুট সংজ্ঞায়িত করতে পারে যা মাইক্রোসার্ভিসে যথাযথভাবে রিকোয়েস্টগুলো ফরোয়ার্ড করবে। যেহেতু API গেটওয়ে docker-compose ফাইলে পোর্ট ম্যাপিং সহ একমাত্র কন্টেইনার, এটিই আপনার জন্য ইন্টারনাল মাইক্রোসার্ভিস অ্যাক্সেস করার একমাত্র উপায় হবে। এটি করার জন্য, প্রতিটি সংশ্লিষ্ট লারাভেল ইনস্ট্যান্সের routes/api.php ফাইলের জন্য নিম্নলিখিত রুট যোগ করুন :
API Gateway:
Microservice A
Microservice B:
Microservice C:
Microservice D:
এখন, আপনি যদি আপনার ব্রাউজার বা পোস্টম্যানে http://localhost:8080/api/service1 এ নেভিগেট করেন তবে আপনার এপিআই গেটওয়ের মাধ্যমে আপনার মাইক্রোসার্ভিসেসের একটির রেসপন্স দেখতে পাওয়া উচিত। এভাবে আপনি আপনার প্রথম অথেনটিকেশন প্যাটার্নটি ইমপ্লিমেন্ট করতে পারেন।
JWT verification at the gateway
প্রথম প্যাটার্নটি হলো API গেটওয়েতে একটি সাধারণ JWT verification। গেটওয়ের মধ্য দিয়ে যাওয়া সমস্ত API রিকোয়েস্টের জন্য একটি বৈধ JWT অ্যাক্সেস টোকেনের প্রয়োজন হবে। এটি করার জন্য, আপনি লারাভেল মিডলওয়্যার ব্যবহার করতে পারেন। একটি মিডলওয়্যার এমন কোডকে বোঝায় যা আপনি কনফিগার করতে পারেন যখন আপনি একটি রিকোয়েস্ট রিসিভ করেন কিন্তু রুট ডেফিনেশন কন্ট্রোলার বা ফাংশন তা নির্দিষ্ট করে হ্যান্ডেল করার আগে। এর অর্থ হলো আপনার কাছে একটি মিডলওয়্যার কম্পোনেন্ট থাকতে পারে যা ভ্যালিড অ্যাক্সেস টোকেন চেক করে এবং যদি কোনও ভ্যালিড টোকেন না পাওয়া যায় তবে একটি আনঅথোরাইজড রেসপন্স রিটার্ন করে।
পূর্বে উল্লিখিত হিসাবে, আপনি Laravel Sail ব্যবহার করতে পারেন কনটেইনারে php artisan কমান্ড এক্সেকিউট করতে। এটি করার জন্য, আপনি যে কোডবেস-এ কমান্ড চালাতে চান সেই কোডবেস-এ নেভিগেট করুন, এই ক্ষেত্রে— api-gateway এবং ./vendor/bin/sail up রান করুন। আপনি আপনার সিস্টেমে চলমান আরও কিছু কনটেইনার তৈরি করবেন। যদিও তারা প্রকৃত API এর জন্য খুব বেশি গুরুত্বপূর্ণ নয়, কন্টেইনারগুলো কাস্টম টুলিং ছাড়াই পিএইচপি কমান্ডগুলো এক্সেকিউট করার একটি সুবিধাজনক উপায় সরবরাহ করে। এই মুহুর্তে, আপনার Sail এর জন্য একটি এলিয়াস তৈরি করা উচিত: alias sail=./vendor/bin/sail. সংক্ষিপ্ততার জন্য এই টিউটোরিয়ালের বাকি Sail কমান্ডগুলো অনুমান করবে যে আপনার এইরকম একটি এলিয়াস আছে।
অন্য টার্মিনালে sail up রান করার পরে, সেইম api-gateway ডিরেক্টরিতে ফিরে যান এবং sail php artisan make:middleware VerifyJwt রান করুন। এই ক্রিয়াটি আগত রিকোয়েস্টগুলোর জন্য অ্যাক্সেস টোকেন চেক করতে গেটওয়ে দ্বারা ব্যবহৃত মিডলওয়্যার তৈরি করবে। আপনি এখানে থাকাকালীন, JWT ভেরিফাই করার জন্য আপনাকে দুটি কম্পোজার ডিপেন্ডেন্সি ইনস্টল করতে হবে। এটি করার জন্য, নিম্নলিখিত কমান্ডরটি রান করুন: sail composer require okta/jwt-verifier firebase/php-jwt. আপনার সদ্য তৈরি করা মিডলওয়্যার বের করার আগে, আপনাকে একটি অ্যাপ্লিকেশন তৈরি করতে Okta ডেভেলপার পোর্টালে একটি কুইক ট্যুর দিতে হবে যাতে আপনার মিডলওয়্যারে আগত JWTs চেক করার জন্য প্রয়োজনীয় ডিটেইলস থাকে।
https://developer.okta.com এ যান এবং হয় সাইন ইন করুন বা একটি নতুন অ্যাকাউন্ট সেট আপ করুন৷ এরপরে, সাইডবারে অ্যাপ্লিকেশনগুলোতে নেভিগেট করুন এবং ক্রিয়েট অ্যাপ ইন্টিগ্রেশন এ ক্লিক করুন৷
একটি নতুন OIDC ইন্টিগ্রেশন সিলেক্ট করুন "single-page application" অ্যাপ্লিকেশন টাইপের সাথে এবং তারপরে নেক্সট ক্লিক করুন। একটি নাম বেছে নিয়ে আপনার নতুন অ্যাপ ইন্টিগ্রেশনের ডিটেইলস পূরণ করুন যাতে সহজেই আইডেন্টিফাই করতে পারেন আপনার অ্যাপকে, তারপর Grant type” কে “Authorization code” এ সেট করুন এবং “Controlled access” কে “Allow everyone in your organization to access” এ সেট করুন।
দ্রষ্টব্য: আমরা এই পুরো টিউটোরিয়াল জুড়ে একটি সিঙ্গেল ক্লায়েন্ট আইডি ব্যবহার করে আপাতত জিনিসগুলোকে সহজ রাখছি। প্র্যাক্টিসে, আপনি চাইলে আপনার ফ্রন্ট-এন্ড অ্যাপ্লিকেশন এবং আপনার প্রতিটি মাইক্রোসার্ভিসের জন্য পৃথক ক্লায়েন্ট আইডি ব্যবহার করতে পারেন যাতে আপনার আরও ভালো অডিট লগ থাকে এবং অ্যাক্সেস আরও ভালভাবে নিয়ন্ত্রণ করতে পারে।
এই স্টেপগুলো কমপ্লিট হয়ে গেলে, আপনি আপনার ক্লায়েন্ট আইডি এবং Okta ডোমেন দেখানো একটি পেইজ পাবেন। পরে কাজে লাগানোর জন্য নোট করুন।
এরপর, আপনার তৈরি করা মিডলওয়্যারে নেভিগেট করুন— api-gateway/app/Http/Middleware/VerifyJwt.php —এবং এর কনটেন্ট নিম্নরূপে সেট করুন:
তারপর গেটওয়ের জন্য .env ফাইলে যান এবং নিম্নলিখিত ভ্যালুগুলো এড করুন:
এখন, আপনি যখন গেটওয়ের /service3 এন্ডপয়েন্টে কল করবেন, তখন এটি মাইক্রোসার্ভিস সি-কে রিকোয়েস্টটি ফরোয়ার্ড করবে, যা পরবর্তীতে টোকেন প্রত্যাহার করা হয়েছে কিনা তা দেখার জন্য অন্তর্দৃষ্টি হিসেবে কাজ করবে। পোস্টম্যান থেকে আপনার অ্যাক্সেস টোকেন নিয়ে এবং Okta-এর প্রত্যাহার এন্ডপয়েন্টের সাথে এটি প্রত্যাহার করে আপনি এটিকে অ্যাকশনে দেখতে পারেন। এটি সেই টোকেন ব্যবহার করার সময় /service3 -এর পরবর্তী রিকোয়েস্টগগুলো ফেইল হবে। আপনি যদি এই একই টোকেনটি /service1 কল করার জন্য ব্যবহার করেন, তাহলে আপনি দেখতে পাবেন যে এটি এখনও কাজ করে, কারণ এই সার্ভিসটি শুধুমাত্র লোকাল JWT ভ্যালিডেশন করে এবং আপনি জানেন না যে টোকেনটি অন্য কোথাও প্রত্যাহার করা হয়েছে কি না।
Client Credentials Grant
বাস্তবায়নের জন্য ফাইনাল প্যাটার্ন হলো Microservice D এর জন্য। এখানে, আপনি ক্লায়েন্ট ক্রেডেনশিয়াল ফ্লো ইমপ্লিমেন্ট করবেন। Microservice D তার নিজস্ব টোকেন ভ্যালিডেট করবে, কিন্তু ব্যবহারকারীর দ্বারা সরবরাহ করা টোকেন যথেষ্ট হবে না। Microservice D গেটওয়ের মাধ্যমে সরাসরি অ্যাক্সেসযোগ্য নয়; পরিবর্তে, এটিকে Microservice A দ্বারা কল করা হয়। এই প্রবাহটি কাজ করার জন্য, Microservice A-কে ক্লায়েন্ট ক্রেডেনশিয়াল গ্রান্ট ব্যবহার করে একটি টোকেন রিকোয়েস্ট করতে হবে এবং Microservice D-কে রিকোয়েস্ট করতে এই টোকেনটি ব্যবহার করতে হবে।
আগের মতো, যেকোনো চলমান sail up কমান্ড বন্ধ করুন, Microservice D-তে নেভিগেট করুন এবং sail up রান করুন। অন্য টার্মিনালে, Microservice D-তে নেভিগেট করুন এবং এই কমান্ডগুলো চালান:
নতুন মিডলওয়্যারের কনটেন্ট নিম্নরূপ সেট করুন এবং তারপর Microservice D কার্নেলে এটি রেজিস্টার করুন:
এরপর, Okta ডেভেলপার পোর্টালে ফিরে যান এবং সাইডবারে অ্যাপ্লিকেশনসে (Applications) এ যান। আনদার অ্যাপ ইন্টিগ্রেশন ক্রিয়েট করুন এবং সাইন-ইন মেথড হিসাবে API services সিলেক্ট করুন৷ এটির একটি নাম দিন এবং Save -এ ক্লিক করুন।
নতুন ইন্টিগ্রেশন একটি নতুন client ID এবং secret প্রদান করবে। এগুলো নোট করুন। এরপরে, Security > API-এ ফিরে যান, default auth server, সিলেক্ট করুন এবং অন্য একটি স্কোপ এড করুন—এখন এটিকে “machine-scope” বলা হচ্ছে। Microservice A তার টোকেন রিকোয়েস্ট করবে তখন এটি কাস্টম স্কোপ হয়ে যাবে।
Microservice D এর .env ফাইলে, নিম্নলিখিত কোড এড করুন:
আপনি এখন দেখতে পাবেন যে /service1-এ পোস্টম্যান কল ফেইল হবে, কারণ Microservice A এখনও Microservice D কে অথেন্টিকেটে করতে পারে নি। এটি সমাধান করার জন্য, আপনাকে Microservice A এর API route আপডেট করতে হবে যাতে আপনি একটি ফ্রেশ টোকেন পেতে পারেন ক্লায়েন্ট ক্রেডেনটিয়ালস গ্রান্ট ব্যবহার করে। রুট আপডেট করতে হবে। microservice-a/routes/api.php ওপেন করুন এবং নিম্নলিখিত কনটেন্ট পরিবর্তন করুন:
এর পরে, এই ডিটেলগুলো অন্তর্ভুক্ত করতে Microservice A-এর .env ফাইলটি আপডেট করুন:
এই ডিটেলগুলো যথাস্থানে রাখলে, /service1 আবার কাজ করবে, কারণ এটি তার নিজস্ব একটি টোকেন পাবে এবং Microservice D-এর সাথে যোগাযোগ করতে এটি ব্যবহার করবে।
Conclusion
আপনি যদি কোডটি ফলো করে থাকেন, তাহলে আপনার কাছে এখন তিনটি এন্ডপয়েন্ট সহ একটি API গেটওয়ে থাকা উচিত, চারটি উন্ডারলায়িং মাইক্রোসার্ভিস এর সাপোর্ট এবং চারটি ইউনিক অথেনটিকেশন প্যাটার্ন। আপনি API গেটওয়ে দ্বারা ব্যবহৃত মৌলিক লোকাল JWT ভ্যালিডেশন দেখেছেন। এটি ফাস্টেস্ট মেথড, কিন্তু এটি প্রত্যাহার করা টোকেন ধরতে অক্ষম৷ এর পরে, Microservice B রয়েছে, যা একটি নির্দিষ্ট স্কোপ চেক করে। এই প্যাটার্নটি প্রথম মেথডের মতই কিন্তু চারপাশে আরও গ্রানুলার কনট্রোল দেয় যা ব্যবহারকারীরা তাদের টোকেনের সাথে সংযুক্ত স্কোপের উপর ভিত্তি করে নির্দিষ্ট অ্যাকশন পারফর্ম করতে পারে। অবশেষে, আপনি রিমোট ইন্ট্রোস্পেকশনের মাধ্যমে একটি টোকেনকে কীভাবে ভ্যালিডেট করবেন তা দেখেছেন। এই পদ্ধতিটি আরও শক্তিশালী, কারণ এটি প্রত্যাহার করা টোকেনগুলি ধরতে সক্ষম, তবে এর ড্রব্যাক হচ্ছে লোকাল JWT ভ্যালিডেশনের তুলনায় এটির একটি অতিরিক্ত HTTP কলের প্রয়োজন হয়।
এই টিউটোরিয়ালের সম্পূর্ণ কোডটি পাবলিক গিটহাব রেপোতে পাওয়া যাবে।
আশা করি, এই টিউটোরিয়ালটি আপনাকে পিএইচপি মাইক্রোসার্ভিসেসের সাথে অথেনটিকেশন হ্যান্ডেল করতে বিভিন্ন উপায় সম্পর্কে কিছু ধারণা দিয়েছে। এই সমস্ত প্যাটার্নগুলো Okta এবং অন্য অনেকের দ্বারা সমর্থিত। Okta আপনার অ্যাপগুলোতে ওয়ার্ল্ড-ক্লাস অথেনটিকেশন এড করা যতটা সহজ করা যায় তার জন্য অথেনটিকেশন টুলস এবং সার্ভিসের একটি বিশাল সিলেকশন অফার করে।