เพิ่มส่วนหัวของคำขอ HTTP เพิ่มเติม

คำขอ HTTP มีส่วนหัว เช่น User-Agent หรือ Content-Type นอกเหนือจากส่วนหัวที่แนบโดย เบราว์เซอร์ แอป Android อาจเพิ่มส่วนหัวเพิ่มเติม เช่น คุกกี้หรือผู้อ้างอิง ผ่าน EXTRA_HEADERS ความตั้งใจเพิ่มเติม เพื่อความปลอดภัย Chrome จะกรองส่วนหัวเพิ่มเติมบางรายการออก ขึ้นอยู่กับวิธีและสถานที่ที่มีการเปิดตัวความตั้งใจ

คำขอข้ามต้นทางต้องการการรักษาความปลอดภัยเพิ่มเติมอีกชั้น เนื่องจากไคลเอ็นต์และเซิร์ฟเวอร์ ไม่ใช่ของบุคคลเดียวกัน คู่มือนี้จะกล่าวถึงการเปิดใช้คำขอดังกล่าวผ่าน Chrome แท็บที่กำหนดเอง เช่น Intent ที่เปิดจากแอปที่เปิด URL ในแท็บเบราว์เซอร์ จนถึง Chrome 83 นักพัฒนาซอฟต์แวร์สามารถเพิ่มส่วนหัวใดก็ได้เมื่อเปิดใช้งานแท็บที่กำหนดเอง ตั้งแต่เวอร์ชัน 83 เป็นต้นไป Chrome เริ่มการกรองทั้งหมด ยกเว้นส่วนหัวแบบข้ามต้นทาง ที่อนุมัติ เนื่องจากส่วนหัวที่ไม่ได้รับอนุมัติ มีความเสี่ยงด้านความปลอดภัย ตั้งแต่ Chrome 86 เป็นต้นไป คุณสามารถแนบส่วนหัวที่ไม่ได้รับอนุมัติกับ คำขอข้ามต้นทาง เมื่อเซิร์ฟเวอร์และไคลเอ็นต์มีความเกี่ยวข้องกันโดยใช้ลิงก์เนื้อหาดิจิทัล ลักษณะการทำงานนี้จะสรุปไว้ในตารางต่อไปนี้

เวอร์ชัน Chrome อนุญาตส่วนหัว CORS
ก่อน Chrome 83 เพิ่มในรายการที่อนุญาต ไม่อยู่ในรายการที่อนุมัติ
Chrome 83 ถึง Chrome 85 เพิ่มในรายการที่อนุญาต
ตั้งแต่ Chrome 86 เป็นต้นไป อยู่ในรายการที่อนุญาต หรือไม่ได้รับอนุมัติ เมื่อตั้งค่าลิงก์เนื้อหาดิจิทัล

ตารางที่ 1: การกรองส่วนหัว CORS ที่ไม่ได้รับอนุมัติ

บทความนี้แสดงวิธีตั้งค่าการเชื่อมต่อที่ได้รับการยืนยันระหว่างเซิร์ฟเวอร์และไคลเอ็นต์ รวมถึงวิธีใช้ เพื่อส่งส่วนหัว http ในรายการที่อนุมัติและส่วนหัว http ที่ไม่ได้รับอนุมัติ คุณสามารถข้ามไปที่ การเพิ่มส่วนหัวเพิ่มเติมไปยัง Intent ที่กำหนดเองของแท็บสำหรับโค้ด

ข้อมูลเบื้องต้น

ส่วนหัวของคำขอ CORS ที่อนุมัติเทียบกับที่ไม่อนุมัติ

กลไกการแชร์ทรัพยากรข้ามโดเมน (CORS) อนุญาตให้เว็บแอปพลิเคชันจากต้นทางหนึ่งส่งคำขอ ทรัพยากรจากแหล่งที่มาอื่น รายการส่วนหัวที่ได้รับอนุมัติจาก CORS จะเก็บค่าไว้ใน มาตรฐาน HTML ตัวอย่างส่วนหัวที่อนุมัติจะแสดงในตารางถัดไป

ส่วนหัว คำอธิบาย
accept-language โฆษณาภาษาธรรมชาติที่ลูกค้าเข้าใจ
content-language อธิบายภาษาที่ใช้สำหรับผู้ชมปัจจุบัน
ประเภทเนื้อหา ระบุประเภทสื่อของทรัพยากร

ตารางที่ 2: ตัวอย่างส่วนหัว CORS ที่อนุมัติ

ส่วนหัวที่อนุมัติถือว่าปลอดภัยเนื่องจากไม่มีข้อมูลที่ละเอียดอ่อน ข้อมูลผู้ใช้ และมีแนวโน้มที่จะไม่ทำให้เซิร์ฟเวอร์ทำงานที่อาจสร้างความเสียหายได้

ตัวอย่างของส่วนหัวที่ไม่ได้รับอนุมัติจะแสดงในตารางต่อไปนี้

ส่วนหัว คำอธิบาย
bearer-token ตรวจสอบสิทธิ์ไคลเอ็นต์ที่เซิร์ฟเวอร์
origin ระบุที่มาของคำขอ
คุกกี้ มีคุกกี้ที่เซิร์ฟเวอร์กำหนดไว้

ตารางที่ 3: ตัวอย่างส่วนหัว CORS ที่ไม่ได้รับอนุมัติ

มาตรฐาน HTML และเซิร์ฟเวอร์ไม่สนับสนุนให้แนบส่วนหัวที่ไม่ได้รับอนุมัติไปยังคำขอ CORS จะถือว่าคำขอข้ามต้นทางมีเฉพาะส่วนหัวที่อนุมัติเท่านั้น การส่งส่วนหัวที่ไม่ได้รับอนุมัติ จากโดเมนแบบข้ามต้นทางจะอนุญาตให้แอปของบุคคลที่สามที่เป็นอันตรายสร้างส่วนหัวที่ใช้ผู้ใช้ในทางที่ผิดได้ คุกกี้ที่ Chrome (หรือเบราว์เซอร์อื่น) จัดเก็บและแนบไปกับคำขอ คุกกี้อาจ ตรวจสอบสิทธิ์การทำธุรกรรมของเซิร์ฟเวอร์ที่เป็นอันตรายซึ่งไม่อาจเป็นไปได้

การแนบส่วนหัวที่อนุมัติของ CORS กับคำขอแท็บที่กำหนดเอง

แท็บที่กำหนดเอง เป็นวิธีพิเศษในการเปิดใช้หน้าเว็บในแท็บเบราว์เซอร์ที่กำหนดเอง แท็บที่กำหนดเอง คุณสร้าง Intent ได้โดยใช้ CustomTabsIntent.Builder() นอกจากนี้ คุณยังแนบส่วนหัวไว้ในอีเมลเหล่านี้ได้ด้วย Intent ที่ใช้ Bundle ที่มีแฟล็ก Browser.EXTRA_HEADERS:

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 ส่วนหัวที่ไม่ได้รับอนุมัติโดยค่าเริ่มต้น แม้ว่าเบราว์เซอร์อื่นๆ อาจมีลักษณะการทำงานที่แตกต่างกัน นักพัฒนาซอฟต์แวร์ควรคาดหวังว่าจะมีการบล็อกส่วนหัวที่ไม่ได้รับอนุมัติโดยทั่วไป

วิธีที่รองรับในการรวมส่วนหัวที่ไม่ได้รับอนุมัติไว้ในแท็บที่กำหนดเองคือการยืนยัน การเชื่อมต่อข้ามต้นทางโดยใช้ลิงก์การเข้าถึงดิจิทัล ส่วนถัดไปจะแสดงวิธีตั้งค่า และเริ่ม Intent ของแท็บที่กำหนดเองด้วยส่วนหัวที่จำเป็น

การเพิ่มส่วนหัวเพิ่มเติมใน Intent ที่กำหนดเองของแท็บ

หากต้องการให้ส่งส่วนหัวที่ไม่ได้รับอนุมัติผ่าน Intent แท็บที่กำหนดเอง คุณต้องตั้งค่า ลิงก์เนื้อหาดิจิทัลระหว่าง Android กับเว็บแอปพลิเคชัน ซึ่งยืนยันว่าผู้เขียน เป็นเจ้าของแอปพลิเคชันทั้งสอง

ทำตามคู่มืออย่างเป็นทางการเพื่อตั้งค่าลิงก์เนื้อหาดิจิทัล สำหรับการใช้งานความสัมพันธ์ลิงก์ "delegate_permission/common.use_as_origin"" ซึ่งระบุว่าทั้ง 2 แอปเป็นของแอปเดียวกัน เมื่อลิงก์ได้รับการยืนยันแล้ว

สร้างความตั้งใจของแท็บที่กำหนดเองด้วยส่วนหัวเพิ่มเติม

การสร้างความตั้งใจของแท็บที่กำหนดเองทำได้หลายวิธี คุณสามารถใช้เครื่องมือสร้างที่พร้อมใช้งาน ใน androidX ด้วยการเพิ่มไลบรารีไปยังทรัพยากร Dependency ของบิลด์

MULTI_LINE_CODE_PLACEHOLDER_1

สร้าง Intent และเพิ่มส่วนหัวเพิ่มเติม

MULTI_LINE_CODE_PLACEHOLDER_2

การเชื่อมต่อแท็บที่กําหนดเองใช้ในการตั้งค่า CustomTabsSession ระหว่างแอปกับ แท็บ Chrome เราต้องการเซสชันเพื่อยืนยันว่าแอปและเว็บแอปเป็นของต้นทางเดียวกัน ระบบจะผ่านการยืนยันในกรณีที่ตั้งค่าลิงก์เนื้อหาดิจิทัลอย่างถูกต้องเท่านั้น

ขอแนะนําให้โทรหา CustomTabsClient.warmup() ทำให้แอปพลิเคชันเบราว์เซอร์ เริ่มต้นไว้ล่วงหน้าในเบื้องหลังและเร่งกระบวนการเปิด URL

MULTI_LINE_CODE_PLACEHOLDER_3

ตั้งค่า Callback ที่เรียกใช้ Intent หลังจากการตรวจสอบ

มีการส่ง CustomTabsCallback เข้าสู่เซสชัน เราตั้งค่า onRelationshipValidationResult() เพื่อเปิด CustomTabsIntent ที่สร้างไว้ก่อนหน้านี้ เมื่อการยืนยันต้นทางสำเร็จ

MULTI_LINE_CODE_PLACEHOLDER_4

เชื่อมโยงการเชื่อมต่อบริการแท็บที่กำหนดเอง

การผูกบริการจะเป็นการเปิดใช้บริการและ 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 จะกรองคำขอเหล่านี้โดยค่าเริ่มต้น การแนบไฟล์ อนุญาตเฉพาะไคลเอ็นต์และเซิร์ฟเวอร์ในต้นทางเดียวกัน ซึ่งได้รับการยืนยันโดยลิงก์เนื้อหาดิจิทัล