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