HTTP অনুরোধে User-Agent বা Content-Type-এর মতো হেডার থাকে। ব্রাউজারের মাধ্যমে অ্যাটাচ করা হেডার ছাড়াও, Android অ্যাপ
EXTRA_HEADERS ইনটেন্ট এক্সট্রার মাধ্যমে কুকি বা রেফারারের মতো অতিরিক্ত হেডার যোগ করতে পারে। নিরাপত্তার কারণে, Chrome কিছু অতিরিক্ত হেডার ফিল্টার করে
যা নির্ভর করে কীভাবে এবং কোথায় ইনটেন্ট লঞ্চ করা হয়েছে তার উপর।
ক্রস-অরিজিন অনুরোধের জন্য অতিরিক্ত সুরক্ষার প্রয়োজন হয় কারণ ক্লায়েন্ট ও সার্ভার একই পার্টির মালিকানাধীন নয়। এই নির্দেশিকায় Chrome কাস্টম ট্যাব-এর মাধ্যমে এই ধরনের অনুরোধ লঞ্চ করার বিষয়ে আলোচনা করা হয়েছে, অর্থাৎ, অ্যাপ থেকে লঞ্চ করা ইনটেন্ট যা ব্রাউজার ট্যাবে URL খোলে। Chrome 83 ভার্সন পর্যন্ত, ডেভেলপাররা কাস্টম ট্যাব লঞ্চ করার সময় যেকোনও হেডার যোগ করতে পারতেন। ভার্সন ৮৩ থেকে, Chrome অনুমোদিত তালিকায় থাকা ক্রস-অরিজিন হেডার ছাড়া বাকি সব ফিল্টার করা শুরু করেছে, কারণ অনুমোদিত তালিকায় না থাকা হেডার নিরাপত্তা সংক্রান্ত ঝুঁকি তৈরি করে। Chrome 86 থেকে শুরু করে, ক্রস-অরিজিন অনুরোধে অনুমোদন তালিকায় নেই এমন হেডার অ্যাটাচ করা সম্ভব, যখন সার্ভার এবং ক্লায়েন্ট একটি ডিজিটাল অ্যাসেট লিঙ্ক ব্যবহার করে সম্পর্কিত হয়। এই আচরণ নিম্নলিখিত সারণীতে সংক্ষেপে দেখানো হয়েছে:
| Chrome ভার্সন | CORS হেডার অনুমোদিত |
|---|---|
| Chrome 83-এর আগের ভার্সন | অনুমোদিত তালিকা, অননুমোদিত তালিকা |
| Chrome 83 থেকে Chrome 85 | অনুমোদিত তালিকা |
| Chrome 86 থেকে শুরু করে পরবর্তী যেকোনও ভার্সনে | ডিজিটাল অ্যাসেট লিঙ্ক সেট-আপ করা হলে, অনুমোদিত তালিকাভুক্ত, অনুমোদিত তালিকাভুক্ত নয় |
টেবিল ১.: অনুমোদিত তালিকায় নেই এমন CORS হেডার ফিল্টার করা।
এই নিবন্ধে দেখানো হয়েছে কীভাবে সার্ভার ও ক্লায়েন্টের মধ্যে যাচাই করা কানেকশন সেট-আপ করতে হয় এবং সেটি ব্যবহার করে অনুমোদিত তালিকার অন্তর্ভুক্ত ও বহির্ভূত http হেডার পাঠাতে হয়। আপনি কোডের জন্য কাস্টম ট্যাব ইনটেন্টে অতিরিক্ত হেডার যোগ করা বিভাগে সরাসরি চলে যেতে পারেন।
ব্যাকগ্রাউন্ড
অনুমোদিত তালিকাভুক্ত বনাম অনুমোদিত তালিকাভুক্ত নয় এমন CORS অনুরোধের হেডার
ক্রস-অরিজিন রিসোর্স শেয়ারিং (CORS)-এর মাধ্যমে একটি অরিজিনের ওয়েব অ্যাপ্লিকেশন অন্য অরিজিনের রিসোর্সের জন্য অনুরোধ করতে পারে। CORS-অনুমোদিত তালিকার হেডার HTML স্ট্যান্ডার্ড-এ ম্যানেজ করা হয়। পরবর্তী টেবিলে অনুমোদিত তালিকার হেডারের উদাহরণ দেখানো হয়েছে:
| হেডার | বিবরণ |
|---|---|
| accept-language | ক্লায়েন্ট বোঝে এমন ন্যাচারাল ল্যাঙ্গুয়েজ বিজ্ঞাপন দেয় |
| কন্টেন্ট-ভাষা | বর্তমান দর্শকদের জন্য উদ্দিষ্ট ভাষা বর্ণনা করে |
| কন্টেন্টের-ধরন | রিসোর্সের মিডিয়া টাইপ নির্দেশ করে |
সারণী ২.: অনুমোদিত CORS হেডারের উদাহরণ।
অনুমোদিত তালিকার হেডারগুলি নিরাপদ বলে বিবেচিত হয় কারণ সেগুলিতে সংবেদনশীল ব্যবহারকারীর তথ্য থাকে না এবং সার্ভারকে সম্ভাব্য ক্ষতিকারক অপারেশন করার সম্ভাবনা কম থাকে।
অনুমোদিত তালিকার অন্তর্ভুক্ত নয় এমন হেডারের উদাহরণ নিচের সারণিতে দেখানো হয়েছে:
| হেডার | বিবরণ |
|---|---|
| বিয়ারার-টোকেন | সার্ভারে ক্লায়েন্টকে যাচাই করে |
| উৎস | অনুরোধের উৎস নির্দেশ করে |
| কুকি | সার্ভার দ্বারা সেট করা কুকি রয়েছে |
সারণী ৩.: অনুমোদিত নয় এমন CORS হেডারের উদাহরণ।
CORS অনুরোধে অনুমোদন তালিকায় নেই এমন হেডার অ্যাটাচ করা HTML স্ট্যান্ডার্ডের দ্বারা নিরুৎসাহিত করা হয় এবং সার্ভার ধরে নেয় যে ক্রস-অরিজিন অনুরোধে শুধুমাত্র অনুমোদন তালিকায় থাকা হেডার রয়েছে। ক্রস-অরিজিন ডোমেন থেকে অনুমোদন তালিকায় নেই এমন হেডার পাঠালে, ক্ষতিকর থার্ড-পার্টি অ্যাপ এমন হেডার তৈরি করতে পারে যা ব্যবহারকারীর কুকির অপব্যবহার করে। Chrome (বা অন্য ব্রাউজার) এই কুকি স্টোর করে এবং অনুরোধের সাথে অ্যাটাচ করে। কুকিগুলি ক্ষতিকারক সার্ভার লেনদেনগুলিকে প্রমাণীকরণ করতে পারে যা অন্যথায় সম্ভব হবে না।
কাস্টম ট্যাব সংক্রান্ত অনুরোধে 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 অনুরোধে অ্যাটাচ করতে পারি। তবে, Chrome সাধারণত অনুমোদিত তালিকায় নেই এমন হেডার ফিল্টার করে। অন্যান্য ব্রাউজারের আচরণ আলাদা হতে পারে, তবে ডেভেলপারদের আশা করা উচিত যে অনুমোদন তালিকায় নেই এমন হেডার সাধারণত ব্লক করা হবে।
কাস্টম ট্যাবে অনুমোদন তালিকায় নেই এমন হেডার অন্তর্ভুক্ত করার জন্য অনুমোদিত পদ্ধতি হল প্রথমে ডিজিটাল অ্যাক্সেস লিঙ্ক ব্যবহার করে ক্রস-অরিজিন কানেকশন যাচাই করা। পরবর্তী বিভাগে দেখানো হয়েছে যে কীভাবে এগুলি সেট-আপ করতে হয় এবং প্রয়োজনীয় হেডার সহ কাস্টম ট্যাব ইনটেন্ট লঞ্চ করতে হয়।
কাস্টম ট্যাব ইনটেন্টে অতিরিক্ত হেডার যোগ করা হচ্ছে
ডিজিটাল অ্যাসেট লিঙ্ক সেট-আপ করা
অনুমোদিত তালিকার বাইরে থাকা হেডারকে কাস্টম ট্যাব ইনটেন্টের মাধ্যমে পাস করার অনুমতি দিতে, Android ও ওয়েব অ্যাপ্লিকেশনের মধ্যে ডিজিটাল অ্যাসেট লিঙ্ক সেট-আপ করতে হবে, যা যাচাই করে যে লেখক দুটি অ্যাপ্লিকেশনেরই মালিক।
ডিজিটাল অ্যাসেট লিঙ্ক সেট-আপ করতে অফিসিয়াল গাইড অনুসরণ করুন। লিঙ্ক সম্পর্কিত ব্যবহারের জন্য "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;
}
অ্যাসেট লিঙ্ক যাচাই করতে কাস্টম ট্যাব কানেকশন সেট-আপ করা
অ্যাপ ও Chrome ট্যাবের মধ্যে CustomTabsSession সেট-আপ করার জন্য কাস্টম ট্যাব কানেকশন ব্যবহার করা হয়। অ্যাপ ও ওয়েব অ্যাপ একই সোর্স থেকে এসেছে কিনা তা যাচাই করার জন্য আমাদের সেশন প্রয়োজন।
ডিজিটাল অ্যাসেট লিঙ্ক সঠিকভাবে সেট-আপ করা হলে তবেই যাচাইকরণ সম্পূর্ণ হয়।
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 সেশনে পাস করা হয়েছে। আমরা এর
onRelationshipValidationResult() সেট-আপ করেছি যাতে অরিজিন যাচাইকরণ সম্পূর্ণ হওয়ার পরে আগে তৈরি করা CustomTabsIntent
লঞ্চ করা যায়।
// 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 GitHub রিপোজিটরি দেখুন।
সারাংশ
এই নির্দেশিকা থেকে জানা যায় যে কীভাবে কাস্টম ট্যাব CORS অনুরোধে ইচ্ছামতো হেডার যোগ করতে হয়। অনুমোদিত তালিকার হেডার প্রতিটি কাস্টম ট্যাব CORS অনুরোধে যোগ করা যেতে পারে। অনুমোদিত তালিকার বাইরে থাকা হেডারকে সাধারণত CORS অনুরোধে অসুরক্ষিত হিসেবে বিবেচনা করা হয় এবং Chrome সাধারণত সেগুলি ফিল্টার করে দেয়। এগুলি অ্যাটাচ করার অনুমতি শুধুমাত্র একই সোর্সের ক্লায়েন্ট ও সার্ভারের জন্য দেওয়া হয়, যা ডিজিটাল অ্যাসেট লিঙ্কের মাধ্যমে যাচাই করা হয়।