HTTP অনুরোধগুলিতে User-Agent বা Content-Type-এর মতো হেডার থাকে। ব্রাউজার দ্বারা সংযুক্ত হেডারগুলি ছাড়াও, অ্যান্ড্রয়েড অ্যাপগুলি EXTRA_HEADERS ইন্টেন্ট এক্সট্রার মাধ্যমে কুকি বা রেফারারের মতো অতিরিক্ত হেডার যোগ করতে পারে। নিরাপত্তার কারণে, একটি ইন্টেন্ট কীভাবে এবং কোথা থেকে চালু করা হচ্ছে তার উপর নির্ভর করে ক্রোম কিছু অতিরিক্ত হেডার ফিল্টার করে।
ক্রস-অরিজিন অনুরোধগুলির জন্য একটি অতিরিক্ত নিরাপত্তা স্তর প্রয়োজন, কারণ ক্লায়েন্ট এবং সার্ভার একই পক্ষের মালিকানাধীন নয়। এই নির্দেশিকাটি ক্রোম কাস্টম ট্যাবের মাধ্যমে এই ধরনের অনুরোধ চালু করার বিষয়ে আলোচনা করে, অর্থাৎ এমন অ্যাপ থেকে চালু করা ইন্টেন্ট যা ব্রাউজার ট্যাবে একটি ইউআরএল খোলে। ক্রোম ৮৩ পর্যন্ত, ডেভেলপাররা একটি কাস্টম ট্যাব চালু করার সময় যেকোনো হেডার যোগ করতে পারতেন। সংস্করণ ৮৩ থেকে, ক্রোম অনুমোদিত ক্রস-অরিজিন হেডারগুলি ছাড়া বাকি সব ফিল্টার করা শুরু করে, কারণ অননুমোদিত হেডারগুলি একটি নিরাপত্তা ঝুঁকি তৈরি করত। ক্রোম ৮৬ থেকে, ক্রস-অরিজিন অনুরোধগুলিতে অননুমোদিত হেডার সংযুক্ত করা সম্ভব, যখন সার্ভার এবং ক্লায়েন্ট একটি ডিজিটাল অ্যাসেট লিঙ্কের মাধ্যমে সম্পর্কিত থাকে। এই আচরণটি নিম্নলিখিত সারণীতে সংক্ষিপ্তভাবে বর্ণনা করা হয়েছে:
| ক্রোম সংস্করণ | CORS হেডার অনুমোদিত |
|---|---|
| ক্রোম ৮৩ এর আগে | অনুমোদিত, অননুমোদিত |
| ক্রোম ৮৩ থেকে ক্রোম ৮৫ | অনুমোদিত তালিকাভুক্ত |
| ক্রোম ৮৬ থেকে | একটি ডিজিটাল অ্যাসেট লিঙ্ক সেট আপ করার সময় অনুমোদিত, অননুমোদিত তালিকাভুক্ত |
সারণি ১: অননুমোদিত CORS হেডারসমূহের ফিল্টারিং।
এই আর্টিকেলে দেখানো হয়েছে কীভাবে সার্ভার ও ক্লায়েন্টের মধ্যে একটি ভেরিফাইড কানেকশন স্থাপন করতে হয় এবং সেটি ব্যবহার করে অনুমোদিত ও অননুমোদিত উভয় ধরনের http হেডার পাঠানো যায়। কোডের জন্য আপনি সরাসরি ‘কাস্টম ট্যাব ইনটেন্টে অতিরিক্ত হেডার যোগ করা’ অংশে চলে যেতে পারেন।
পটভূমি
অনুমোদিত বনাম অননুমোদিত CORS অনুরোধ হেডার
ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS) একটি অরিজিনের ওয়েব অ্যাপ্লিকেশনকে ভিন্ন অরিজিনের রিসোর্স অনুরোধ করার সুযোগ দেয়। CORS-অনুমোদিত হেডারগুলির তালিকা HTML স্ট্যান্ডার্ডে রক্ষণাবেক্ষণ করা হয়। অনুমোদিত হেডারগুলির উদাহরণ পরবর্তী টেবিলে দেখানো হলো:
| হেডার | বর্ণনা |
|---|---|
| ভাষা গ্রহণ করুন | এমন স্বাভাবিক ভাষায় বিজ্ঞাপন দেয় যা গ্রাহক বোঝেন। |
| বিষয়বস্তু-ভাষা | বর্তমান শ্রোতাদের জন্য উদ্দিষ্ট ভাষার বর্ণনা দেয় |
| বিষয়বস্তুর ধরণ | রিসোর্সটির মিডিয়া টাইপ নির্দেশ করে |
সারণি ২: অনুমোদিত CORS হেডারগুলির উদাহরণ।
অনুমোদিত হেডারগুলোকে নিরাপদ বলে মনে করা হয়, কারণ সেগুলোতে ব্যবহারকারীর কোনো সংবেদনশীল তথ্য থাকে না এবং এগুলোর কারণে সার্ভার কোনো সম্ভাব্য ক্ষতিকর কার্যক্রম সম্পাদন করার সম্ভাবনা কম।
অনুমোদনহীন হেডারগুলির উদাহরণ নিম্নলিখিত সারণিতে দেখানো হলো:
| হেডার | বর্ণনা |
|---|---|
| বাহক-টোকেন | সার্ভারে ক্লায়েন্টকে প্রমাণীকরণ করে |
| উৎপত্তি | অনুরোধের উৎস নির্দেশ করে |
| কুকি | সার্ভার দ্বারা সেট করা কুকি ধারণ করে |
সারণি ৩: অননুমোদিত CORS হেডারসমূহের উদাহরণ।
এইচটিএমএল স্ট্যান্ডার্ড অনুযায়ী CORS অনুরোধে অননুমোদিত হেডার সংযুক্ত করা নিরুৎসাহিত করা হয় এবং সার্ভারগুলো ধরে নেয় যে ক্রস-অরিজিন অনুরোধে শুধুমাত্র অনুমোদিত হেডারই থাকে। ক্রস-অরিজিন ডোমেইন থেকে অননুমোদিত হেডার পাঠানোর ফলে ক্ষতিকারক থার্ড-পার্টি অ্যাপগুলো এমন হেডার তৈরি করতে পারবে যা ব্যবহারকারীর কুকির অপব্যবহার করে, যে কুকিগুলো ক্রোম (বা অন্য কোনো ব্রাউজার) সংরক্ষণ করে এবং অনুরোধের সাথে সংযুক্ত করে। এই কুকিগুলো এমন ক্ষতিকারক সার্ভার লেনদেনকে প্রমাণীকরণ করতে পারে যা অন্যথায় সম্ভব হতো না।
কাস্টম ট্যাব অনুরোধে CORS অনুমোদিত হেডার সংযুক্ত করা
কাস্টম ট্যাব হলো একটি নিজস্ব ব্রাউজার ট্যাবে ওয়েব পেজ চালু করার একটি বিশেষ উপায়। CustomTabsIntent.Builder() ব্যবহার করে কাস্টম ট্যাব ইন্টেন্ট তৈরি করা যায়। এছাড়াও, Browser.EXTRA_HEADERS ফ্ল্যাগসহ একটি Bundle ব্যবহার করে এই ইন্টেন্টগুলোতে হেডার সংযুক্ত করা যায়।
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
intent.launchUrl(Activity.this, Uri.parse("http://www.google.com"));
আমরা কাস্টম ট্যাবের CORS অনুরোধে সর্বদা অনুমোদিত হেডার সংযুক্ত করতে পারি। তবে, ক্রোম ডিফল্টরূপে অননুমোদিত হেডার ফিল্টার করে। যদিও অন্যান্য ব্রাউজারের আচরণ ভিন্ন হতে পারে, ডেভেলপারদের সাধারণত অননুমোদিত হেডার ব্লক হওয়ার বিষয়টিই ধরে নেওয়া উচিত।
কাস্টম ট্যাবে অননুমোদিত হেডার অন্তর্ভুক্ত করার সমর্থিত উপায় হলো, প্রথমে একটি ডিজিটাল অ্যাক্সেস লিঙ্ক ব্যবহার করে ক্রস-অরিজিন সংযোগটি যাচাই করা। পরবর্তী বিভাগে দেখানো হয়েছে কীভাবে এগুলি সেট আপ করতে হয় এবং প্রয়োজনীয় হেডার সহ একটি কাস্টম ট্যাব ইন্টেন্ট চালু করতে হয়।
কাস্টম ট্যাব ইনটেন্টে অতিরিক্ত হেডার যোগ করা
ডিজিটাল সম্পদ লিঙ্ক স্থাপন করুন
কাস্টম ট্যাব ইন্টেন্টের মাধ্যমে অননুমোদিত হেডার পাস করার অনুমতি দিতে হলে, অ্যান্ড্রয়েড এবং ওয়েব অ্যাপ্লিকেশনের মধ্যে একটি ডিজিটাল অ্যাসেট লিঙ্ক স্থাপন করা প্রয়োজন, যা যাচাই করবে যে লেখক উভয় অ্যাপ্লিকেশনেরই মালিক।
ডিজিটাল অ্যাসেট লিঙ্ক সেট আপ করতে অফিসিয়াল গাইড অনুসরণ করুন। লিঙ্ক রিলেশনের জন্য `"delegate_permission/common.use_as_origin"` ব্যবহার করুন, যা নির্দেশ করে যে লিঙ্কটি ভেরিফাই হয়ে গেলে উভয় অ্যাপ একই অরিজিনের অন্তর্গত।
অতিরিক্ত হেডার সহ কাস্টম ট্যাব ইন্টেন্ট তৈরি করুন
কাস্টম ট্যাব ইন্টেন্ট তৈরি করার একাধিক উপায় আছে। আপনি বিল্ড ডিপেন্ডেন্সিতে লাইব্রেরিটি যোগ করে androidX-এ উপলব্ধ বিল্ডারটি ব্যবহার করতে পারেন:
implementation 'androidx.browser:browser:1.2.0'
ইন্টেন্টটি তৈরি করুন এবং অতিরিক্ত হেডার যোগ করুন:
CustomTabsIntent constructExtraHeadersIntent(CustomTabsSession session) {
CustomTabsIntent intent = new CustomTabsIntent.Builder(session).build();
// Example non-cors-approvelisted headers.
Bundle headers = new Bundle();
headers.putString("bearer-token", "Some token");
headers.putString("redirect-url", "Some redirect url");
intent.intent.putExtra(Browser.EXTRA_HEADERS, headers);
return intent;
}
অ্যাসেট লিঙ্কটি যাচাই করার জন্য একটি কাস্টম ট্যাব সংযোগ সেট আপ করুন।
অ্যাপ এবং ক্রোম ট্যাবের মধ্যে একটি CustomTabsSession সেট আপ করার জন্য একটি Custom Tabs কানেকশন ব্যবহার করা হয়। অ্যাপ এবং ওয়েব অ্যাপ একই অরিজিনের অন্তর্গত কিনা, তা যাচাই করার জন্য আমাদের এই সেশনটি প্রয়োজন। ডিজিটাল অ্যাসেট লিঙ্কগুলো সঠিকভাবে সেট আপ করা থাকলেই কেবল এই যাচাইকরণটি সফল হয়।
CustomTabsClient.warmup() কল করার পরামর্শ দেওয়া হয়। এটি ব্রাউজার অ্যাপ্লিকেশনকে ব্যাকগ্রাউন্ডে প্রি-ইনিশিয়ালাইজ হতে এবং URL খোলার প্রক্রিয়াকে দ্রুততর করতে সাহায্য করে।
// Set up a connection that warms up and validates a session.
CustomTabsServiceConnection connection = new CustomTabsServiceConnection() {
@Override
public void onCustomTabsServiceConnected(@NonNull ComponentName name,
@NonNull CustomTabsClient client) {
// Create session after service connected.
mSession = client.newSession(callback);
client.warmup(0);
// Validate the session as the same origin to allow cross origin headers.
mSession.validateRelationship(CustomTabsService.RELATION_USE_AS_ORIGIN,
Uri.parse(url), null);
}
@Override
public void onServiceDisconnected(ComponentName componentName) { }
};
ভ্যালিডেশনের পর ইন্টেন্টটি চালু করার জন্য একটি কলব্যাক সেট আপ করুন।
CustomTabsCallback টি সেশনে পাস করা হয়েছিল। অরিজিন ভেরিফিকেশন সফল হলে পূর্বে তৈরি করা CustomTabsIntent চালু করার জন্য আমরা এর onRelationshipValidationResult() সেট আপ করেছি।
// Set up a callback that launches the intent after session validated.
CustomTabsCallback callback = new CustomTabsCallback() {
@Override
public void onRelationshipValidationResult(int relation, @NonNull Uri requestedOrigin,
boolean result, @Nullable Bundle extras) {
// Launch custom tabs intent after session was validated as the same origin.
CustomTabsIntent intent = constructExtraHeadersIntent(mSession);
intent.launchUrl(MainActivity.this, Uri.parse(url));
}
};
কাস্টম ট্যাব পরিষেবা সংযোগটি সংযুক্ত করুন
সার্ভিসটি বাইন্ড করলে তা চালু হয় এবং কানেকশনের onCustomTabsServiceConnected() মেথডটি অবশেষে কল করা হবে। সার্ভিসটি যথাযথভাবে আনবাইন্ড করতে ভুলবেন না। বাইন্ডিং এবং আনবাইন্ডিং সাধারণত অ্যাক্টিভিটির onStart() এবং onStop() লাইফসাইকেল মেথডগুলোতে করা হয়ে থাকে।
// Bind the custom tabs service connection.
// Call this in onStart()
CustomTabsClient.bindCustomTabsService(this,
CustomTabsClient.getPackageName(MainActivity.this, null), connection);
// …
// Unbind the custom tabs service.
// Call this in onStop().
unbindService(connection);
ডেমো অ্যাপ্লিকেশন কোড
কাস্টম ট্যাব সার্ভিস সম্পর্কে আরও বিস্তারিত তথ্য আপনি এখানে পেতে পারেন। একটি কার্যকরী উদাহরণ অ্যাপের জন্য android-browser-helper গিটহাব রিপোজিটরিটি দেখুন।
সারসংক্ষেপ
এই নির্দেশিকাটি কাস্টম ট্যাবের CORS অনুরোধে কীভাবে ইচ্ছামতো হেডার যোগ করতে হয় তা দেখিয়েছে। অনুমোদিত হেডারগুলো প্রতিটি কাস্টম ট্যাবের CORS অনুরোধে সংযুক্ত করা যেতে পারে। অননুমোদিত হেডারগুলোকে সাধারণত CORS অনুরোধে অনিরাপদ বলে মনে করা হয় এবং ক্রোম ডিফল্টরূপে সেগুলোকে ফিল্টার করে। এগুলো সংযুক্ত করার অনুমতি শুধুমাত্র একই অরিজিনের ক্লায়েন্ট এবং সার্ভারের জন্য রয়েছে, যা একটি ডিজিটাল অ্যাসেট লিঙ্কের মাধ্যমে যাচাই করা হয়।