TWA-তে Google Sign-In কেন কাজ করে না: Cookie Partitioning সমস্যা ও সমাধান

আপনি যদি কখনো একটি Progressive Web App (PWA) তৈরি করে সেটিকে Trusted Web Activity (TWA) হিসেবে Google Play Store-এ পাঠিয়ে থাকেন, তাহলে এই সমস্যাটির সাথে আপনার পরিচয় হওয়ার সম্ভাবনা প্রবল। ওয়েবসাইটে “Continue with Google” বাটন একদম ঠিকঠাক কাজ করছে, কিন্তু একই কোড TWA অ্যাপে গিয়ে ভেঙে পড়ছে — সাইন-ইন শেষ হওয়ার পরই সাদা স্ক্রিন, কিংবা সরাসরি লগইন পেজে ফিরে আসা। সমস্যাটা আপনার কোডে না, সমস্যাটা Android-এর process model-এ। চলুন গভীরে যাওয়া যাক।
TWA, Wrapper, Bubblewrap — আসলে এগুলো কী?
প্রথমে কয়েকটা শব্দ পরিষ্কার করে নিই। TWA (Trusted Web Activity) হলো Google-এর অফিসিয়াল পদ্ধতি — যাতে আপনি একটি PWA-কে Play Store-এর মাধ্যমে এমনভাবে ডিস্ট্রিবিউট করতে পারেন যেন এটি একটি native Android অ্যাপ। কিন্তু আসল কথা হলো, এটি native নয়। এর ভেতরে Chrome আপনার ওয়েবসাইটকে fullscreen-এ রেন্ডার করছে, শুধু URL বার আর Chrome-এর অন্যান্য UI লুকিয়ে রাখা হয়েছে।
Bubblewrap হলো সেই কমন টুল যেটা দিয়ে একটি PWA URL-কে TWA APK-তে রূপান্তর করা হয়। আর “Wrapper” শব্দটা একটা সাধারণ ধারণা — WebView-নির্ভর wrapper (Capacitor, Cordova, React Native WebView, কিংবা custom Android WebView), TWA, এই সবগুলোই wrapper-এর উদাহরণ।
Cookie Partitioning: আসল সমস্যা কোথায়?
Cookie সাধারণত origin অনুযায়ী scoped হয় — dujone.com-এর cookie আর google.com-এর cookie আলাদা জায়গায় সংরক্ষিত হয়। এটা স্বাভাবিক browser আচরণ, কোনো সমস্যা না।
আসল সমস্যা হলো: TWA এবং Chrome-এর Custom Tabs একই origin-এর জন্যও আলাদা cookie store ব্যবহার করে। একটু কল্পনা করুন — Chrome dujone.com-এর জন্য দুটি সম্পূর্ণ আলাদা cookie জার বানিয়ে রাখছে: একটি TWA process-এর জন্য, আরেকটি Custom Tab popup-এর জন্য।
ধাপে ধাপে দেখুন TWA-এর ভেতরে “Continue with Google” বাটনে ট্যাপ করলে কী ঘটে:
১. Google Sign-In বাটন ux_mode: 'popup' ব্যবহার করে, যা window.open() call করে Google-এর auth স্ক্রিন খোলে।
২. TWA-এর ভেতরে window.open কোনো new tab খোলে না — এটি একটি Chrome Custom Tab spawn করে, যা একটি আলাদা Android activity।
৩. ব্যবহারকারী সেখানে সাইন-ইন করেন। Google redirect করে, এবং আপনার backend-এর /auth/google endpoint Set-Cookie header-এর মাধ্যমে accessToken ও refreshToken cookie সেট করে। এই cookie জমা হয় Custom Tab-এর cookie জারে।
৪. Popup বন্ধ হয়। Control আবার TWA-তে ফিরে আসে। TWA তার প্রথম authenticated request — যেমন /users/me — পাঠায় এবং auth cookie খোঁজে।
৫. কিন্তু সেই cookie তো Custom Tab-এর জারে। TWA-এর নিজের জার একদম খালি। Server 401 ফেরত পাঠায়, redirect logic চালু হয়, এবং আপনি গিয়ে দাঁড়ান /auth/login পেজে — মাঝখানে সাদা স্ক্রিন, কারণ SPA-এর state অর্ধেক resolve হয়েছে এবং layout-এর loading skeleton redirect-এর সাথে দৌড়াদৌড়ি করছে।
এটাই Cookie Partitioning। উল্লেখ্য, এই শব্দটি ব্রাউজার storage privacy feature-এর প্রসঙ্গেও ব্যবহৃত হয় (যেখানে third-party cookie top-site অনুযায়ী partition করা হয়) — কিন্তু এখানে সমস্যাটা সেটা না। এখানে Android-এর process model প্রতিটি app component-কে আলাদা cookie store রাখতে বাধ্য করছে।
একই কোড সাধারণ Chrome-এ কাজ করে কেন?
কারণ Android-এর সাধারণ Chrome ব্রাউজারে পুরোটাই একটি Chrome process। Popup আর main tab — দুটোই একই cookie জার share করে। তাই আপনার dev টেস্টিং-এ সবকিছু ঠিক দেখায়, কিন্তু Play Store থেকে TWA install করে test করলেই সমস্যা ধরা পড়ে।
তিনটি পরীক্ষিত সমাধান
কাজের পরিমাণের ক্রমানুসারে তিনটি সমাধান —
১. TWA-তে Google সাইন-ইন অপশন লুকিয়ে দিন। সবচেয়ে practical। navigator.userAgent-এ TWA detect করে শুধু email/password login দেখান। Play Store review delay নেই, কোনো backend পরিবর্তন নেই, এক রাতেই ship করা সম্ভব।
২. ux_mode: 'redirect' ব্যবহার করুন popup-এর বদলে। Google redirect-এর মাধ্যমে TWA-এর নিজের origin-এ ফিরে আসবে, তাই auth flow পুরোটাই TWA-এর নিজের cookie জারে ঘটবে। SPA-এর কিছু in-memory state হারাবে redirect-এর সময়, কিন্তু cookie সঠিক জায়গায় বসবে।
৩. Wrapper-এ Native Google Sign-In SDK integrate করুন। Android wrapper native picker খুলবে, credential নেবে, তারপর evaluateJavascript বা JavaScript interface-এর মাধ্যমে সেটা webview-এ পাঠাবে। সবচেয়ে robust সমাধান, কিন্তু প্রতিবার Android binary update করে Play Store-এ পাঠাতে হবে।
শেষ কথা
TWA একটি দারুণ সুবিধা — ওয়েব কোড দিয়েই Play Store presence পাওয়া যায়। কিন্তু এটা আসলে wrapper, এবং wrapper-এর কিছু process-level সীমাবদ্ধতা আছে যা ওয়েবে কখনো দেখা যায় না। Cookie partitioning তেমনই একটি সীমাবদ্ধতা। আপনি যদি TWA বা যেকোনো WebView wrapper দিয়ে কাজ করেন এবং OAuth popup ব্যবহার করেন — আগে থেকেই plan করে রাখুন, কোন সমাধান আপনার ব্যবহারকারীর জন্য সবচেয়ে ভালো।
Comments (0)
Login to leave a comment.