Web Authentication API หรือที่เรียกว่า WebAuthn ช่วยให้เซิร์ฟเวอร์ใช้วิทยาการเข้ารหัสคีย์สาธารณะแทนการใช้รหัสผ่านเพื่อลงทะเบียนและตรวจสอบสิทธิ์ผู้ใช้ได้ โดยเปิดใช้การผสานรวมระหว่างเซิร์ฟเวอร์เหล่านี้กับโปรแกรมตรวจสอบสิทธิ์ที่รัดกุม อุปกรณ์ตรวจสอบสิทธิ์เหล่านี้อาจเป็นอุปกรณ์จริงเฉพาะ (เช่น คีย์ความปลอดภัย) หรือผสานรวมกับแพลตฟอร์ม (เช่น เครื่องอ่านลายนิ้วมือ) อ่านข้อมูลเพิ่มเติมเกี่ยวกับ WebAuthn ได้ที่ webauthn.guide
ปัญหาของนักพัฒนาแอป
ก่อนหน้านี้ WebAuthn ยังไม่มีการรองรับการแก้ไขข้อบกพร่องแบบเนทีฟใน Chrome นักพัฒนาแอปที่สร้างแอปที่ใช้ WebAuth จำเป็นต้องเข้าถึงเครื่องตรวจสอบสิทธิ์ที่จับต้องได้ การดำเนินการนี้ทําได้ยากมากด้วยเหตุผล 2 ข้อ ดังนี้
โปรแกรมตรวจสอบสิทธิ์มีหลายประเภท การแก้ไขข้อบกพร่องของการกำหนดค่าและความสามารถที่หลากหลายทำให้นักพัฒนาแอปต้องเข้าถึงโปรแกรมตรวจสอบสิทธิ์หลายรายการที่แตกต่างกัน ซึ่งบางครั้งก็อาจมีราคาแพง
อุปกรณ์ตรวจสอบสิทธิ์ที่จับต้องได้ออกแบบมาให้ปลอดภัย ดังนั้น การตรวจสอบสถานะจึงมักเป็นไปไม่ได้
เราจึงอยากทำให้การแก้ไขข้อบกพร่องง่ายขึ้นด้วยการเพิ่มการรองรับการแก้ไขข้อบกพร่องในเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
โซลูชัน: แท็บ WebAuthn ใหม่
แท็บเครื่องมือสำหรับนักพัฒนาเว็บของ WebAuthn ช่วยแก้ไขข้อบกพร่องของ WebAuthn ได้ง่ายขึ้นมากโดยอนุญาตให้นักพัฒนาซอฟต์แวร์จําลองโปรแกรมตรวจสอบสิทธิ์เหล่านี้ ปรับแต่งความสามารถ และตรวจสอบสถานะ
การใช้งาน
การเพิ่มการรองรับการแก้ไขข้อบกพร่องใน WebAuthn เป็นกระบวนการ 2 ส่วน
ส่วนที่ 1: การเพิ่มโดเมน WebAuthn ลงในโปรโตคอลเครื่องมือสำหรับนักพัฒนาเว็บของ Chrome
ก่อนอื่น เราติดตั้งใช้งานโดเมนใหม่ใน Chrome DevTools Protocol (CDP) ซึ่งจะเชื่อมต่อกับตัวแฮนเดิลที่สื่อสารกับแบ็กเอนด์ WebAuthn
CDP จะเชื่อมต่อส่วนหน้าของเครื่องมือสำหรับนักพัฒนาเว็บกับ Chromium ในกรณีของเรา เราใช้การดําเนินการของโดเมน WebAuthn เพื่อเป็นตัวเชื่อมระหว่างแท็บเครื่องมือสําหรับนักพัฒนาเว็บของ WebAuthn กับการใช้งาน WebAuthn ของ Chromium
โดเมน WebAuthn อนุญาตให้เปิดและปิดใช้สภาพแวดล้อม Authenticator เสมือน ซึ่งจะตัดการเชื่อมต่อเบราว์เซอร์จากการค้นพบ Authenticator จริงและเสียบการค้นพบเสมือนแทน
นอกจากนี้ เรายังแสดงเมธอดในโดเมนที่ทำหน้าที่เป็นเลเยอร์บางๆ กับอินเทอร์เฟซ Virtual Authenticator และ Virtual Discovery ที่มีอยู่ ซึ่งเป็นส่วนหนึ่งของการใช้งาน WebAuthn ของ Chromium ซึ่งรวมถึงการเพิ่มและนำข้อมูลเข้าสู่ระบบที่ตรวจสอบสิทธิ์ออก รวมถึงสร้าง รับ และล้างข้อมูลเข้าสู่ระบบที่ลงทะเบียนไว้
(อ่านรหัส)
ส่วนที่ 2: การสร้างแท็บที่แสดงต่อผู้ใช้
ประการที่ 2 เราได้สร้างแท็บที่แสดงต่อผู้ใช้ในหน้าเว็บของเครื่องมือสำหรับนักพัฒนาเว็บ แท็บประกอบด้วยข้อมูลพร็อพเพอร์ตี้และโมเดล ตัวแทนที่สร้างขึ้นโดยอัตโนมัติจะเชื่อมต่อโดเมนกับแท็บ
แม้ว่าจะมีองค์ประกอบที่จำเป็น 3 อย่าง แต่เราจะต้องสนใจเพียง 2 อย่างเท่านั้น ได้แก่ โมเดลและมุมมอง ส่วนประกอบที่ 3 - ตัวแทนจะสร้างขึ้นโดยอัตโนมัติหลังจากเพิ่มโดเมน กล่าวโดยย่อคือ ตัวแทนคือเลเยอร์ที่ใช้เรียกใช้ระหว่างหน้าเว็บกับ CDP
โมเดล
โมเดลคือเลเยอร์ JavaScript ที่เชื่อมต่อเอเจนต์กับมุมมอง ในกรณีของเรา โมเดลนั้นค่อนข้างง่าย โดยจะรับคําสั่งจากมุมมอง สร้างคําขอเพื่อให้ CDP ใช้งานได้ แล้วส่งผ่านตัวแทน โดยปกติแล้วคําขอเหล่านี้จะเป็นแบบทิศทางเดียวโดยไม่มีการส่งข้อมูลกลับไปยังมุมมอง
อย่างไรก็ตาม บางครั้งเราส่งการตอบกลับจากโมเดลกลับไปยังอุปกรณ์เพื่อระบุรหัสสำหรับโปรแกรมตรวจสอบสิทธิ์ที่สร้างขึ้นใหม่หรือเพื่อแสดงข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ในโปรแกรมตรวจสอบสิทธิ์ที่มีอยู่
(อ่านรหัส)
มุมมอง
เราใช้มุมมองนี้เพื่อแสดงอินเทอร์เฟซผู้ใช้ที่นักพัฒนาซอฟต์แวร์จะเห็นเมื่อเข้าถึงเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ ซึ่งประกอบด้วย
- แถบเครื่องมือเพื่อเปิดใช้สภาพแวดล้อม Authenticator เสมือน
- ส่วนสำหรับเพิ่มเครื่องมือตรวจสอบสิทธิ์
- ส่วนสำหรับโปรแกรมตรวจสอบสิทธิ์ที่สร้างไว้
(อ่านรหัส)
แถบเครื่องมือเพื่อเปิดใช้สภาพแวดล้อม Authenticator เสมือน
เนื่องจากการโต้ตอบของผู้ใช้ส่วนใหญ่จะโต้ตอบกับโปรแกรมตรวจสอบสิทธิ์รายการเดียวในแต่ละครั้งแทนที่จะโต้ตอบกับทั้งแท็บ ฟังก์ชันการทำงานเดียวที่เรามีให้ในแถบเครื่องมือคือการเปิดและปิดสภาพแวดล้อมเสมือน
เหตุใดจึงต้องดำเนินการเช่นนี้ ผู้ใช้ต้องสลับสภาวะแวดล้อมอย่างชัดเจน เนื่องจากการดำเนินการดังกล่าวจะตัดการเชื่อมต่อเบราว์เซอร์จากการค้นพบ Authenticator จริง ดังนั้น เมื่อเปิดฟีเจอร์นี้อยู่ ระบบจะไม่จดจำข้อมูลประจำตัวที่เชื่อมต่ออยู่ เช่น เครื่องอ่านลายนิ้วมือ
เราตัดสินใจว่าการสลับที่ชัดเจนจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น โดยเฉพาะผู้ที่เข้ามาในแท็บ WebAuthn โดยไม่ได้คาดหวังว่าจะมีการปิดใช้การค้นพบจริง
การเพิ่มส่วนเครื่องมือตรวจสอบสิทธิ์
เมื่อเปิดใช้สภาพแวดล้อม Authenticator เสมือน เราจะแสดงแบบฟอร์มในบรรทัดที่มีให้นักพัฒนาแอปเพิ่ม Authenticator เสมือน ในแบบฟอร์มนี้ เรามีตัวเลือกการปรับแต่งซึ่งช่วยให้ผู้ใช้ตัดสินใจเกี่ยวกับโปรโตคอลและวิธีการส่งของโปรแกรมตรวจสอบสิทธิ์ รวมถึงเลือกได้ว่าโปรแกรมตรวจสอบสิทธิ์รองรับคีย์ที่อยู่ในเครื่องและการตรวจสอบผู้ใช้หรือไม่
เมื่อผู้ใช้คลิกเพิ่ม ระบบจะรวมตัวเลือกเหล่านี้ไว้ด้วยกันและส่งไปยังโมเดลที่เรียกใช้เพื่อสร้างโปรแกรมตรวจสอบสิทธิ์ เมื่อดำเนินการเสร็จแล้ว ฟีดหน้าเว็บจะได้รับการตอบกลับ จากนั้นจะแก้ไข UI ให้รวมโปรแกรมตรวจสอบสิทธิ์ที่สร้างขึ้นใหม่
มุมมอง Authenticator
ทุกครั้งที่มีการจําลองโปรแกรมตรวจสอบสิทธิ์ เราจะเพิ่มส่วนในมุมมองโปรแกรมตรวจสอบสิทธิ์เพื่อแสดงโปรแกรมตรวจสอบสิทธิ์นั้น ส่วนเครื่องมือตรวจสอบสิทธิ์แต่ละส่วนจะมีชื่อ รหัส ตัวเลือกการกำหนดค่า ปุ่มนำเครื่องมือตรวจสอบสิทธิ์ออกหรือตั้งค่าให้ทำงานอยู่ และตารางข้อมูลเข้าสู่ระบบ
ชื่อ Authenticator
ชื่อของโปรแกรมตรวจสอบสิทธิ์จะปรับแต่งได้ โดยค่าเริ่มต้นจะเป็น "โปรแกรมตรวจสอบสิทธิ์" ต่อท้ายด้วย 5 อักขระสุดท้ายของรหัส เดิมทีชื่อของโปรแกรมตรวจสอบสิทธิ์คือรหัสแบบเต็มและไม่สามารถเปลี่ยนแปลงได้ เราใช้ชื่อที่ปรับแต่งได้เพื่อให้ผู้ใช้ติดป้ายกำกับเครื่องตรวจสอบสิทธิ์ตามความสามารถของเครื่อง อุปกรณ์เครื่องตรวจสอบสิทธิ์ที่จำลอง หรือชื่อเล่นที่เข้าใจง่ายกว่ารหัส 36 อักขระ
ตารางข้อมูลเข้าสู่ระบบ
เราได้เพิ่มตารางลงในส่วนโปรแกรมตรวจสอบสิทธิ์แต่ละรายการ ซึ่งจะแสดงข้อมูลเข้าสู่ระบบทั้งหมดที่โปรแกรมตรวจสอบสิทธิ์ได้ลงทะเบียนไว้ ภายในแต่ละแถว เราจะให้ข้อมูลเกี่ยวกับข้อมูลเข้าสู่ระบบ รวมถึงปุ่มสำหรับนำออกหรือส่งออกข้อมูลเข้าสู่ระบบ
ปัจจุบันเรารวบรวมข้อมูลเพื่อป้อนตารางเหล่านี้โดยการสำรวจ CDP เพื่อรับข้อมูลเข้าสู่ระบบที่ลงทะเบียนไว้สำหรับโปรแกรมตรวจสอบสิทธิ์แต่ละรายการ ในอนาคตเราวางแผนที่จะเพิ่มเหตุการณ์สำหรับการสร้างข้อมูลเข้าสู่ระบบ
ปุ่ม "ใช้งานอยู่"
นอกจากนี้ เรายังได้เพิ่มปุ่มตัวเลือกใช้งานอยู่ลงในส่วนโปรแกรมตรวจสอบสิทธิ์แต่ละรายการด้วย โปรแกรมตรวจสอบสิทธิ์ที่ตั้งค่าให้ทำงานอยู่ในปัจจุบันจะเป็นโปรแกรมเดียวที่คอยรับและลงทะเบียนข้อมูลเข้าสู่ระบบ หากไม่มีการดำเนินการนี้ การลงทะเบียนข้อมูลเข้าสู่ระบบที่มีเครื่องตรวจสอบสิทธิ์หลายรายการจะเป็นแบบไม่แน่นอน ซึ่งจะเป็นข้อบกพร่องร้ายแรงเมื่อพยายามทดสอบ WebAuthn โดยใช้เครื่องตรวจสอบสิทธิ์ดังกล่าว
เราใช้สถานะ "ใช้งานอยู่" โดยใช้เมธอด SetUserPresence ในโปรแกรมตรวจสอบสิทธิ์เสมือน เมธอด SetUserPresence จะตั้งค่าว่าการตรวจสอบสถานะผู้ใช้สําเร็จหรือไม่สําหรับโปรแกรมตรวจสอบสิทธิ์หนึ่งๆ หากเราปิดการตั้งค่านี้ โปรแกรมตรวจสอบสิทธิ์จะไม่สามารถสแกนหาข้อมูลเข้าสู่ระบบได้ ดังนั้น การตรวจสอบว่าฟีเจอร์นี้เปิดอยู่สำหรับ Authenticator ไม่เกิน 1 รายการ (รายการที่ตั้งค่าไว้ว่าใช้งานอยู่) และปิดใช้การแสดงข้อมูลผู้ใช้สำหรับรายการอื่นๆ ทั้งหมดจะช่วยให้เราบังคับให้ระบบทำงานตามรูปแบบที่แน่นอนได้
ปัญหาที่น่าสนใจที่เราพบขณะเพิ่มปุ่มที่ใช้งานอยู่คือการหลีกเลี่ยงเงื่อนไขการแข่งขัน พิจารณาสถานการณ์ต่อไปนี้
ผู้ใช้คลิกปุ่มตัวเลือกใช้งานอยู่สำหรับ Authenticator X ซึ่งจะส่งคำขอไปยัง CDP เพื่อตั้งค่า X เป็นใช้งานอยู่ ระบบจะเลือกปุ่มตัวเลือกใช้งานอยู่สำหรับ X และยกเลิกการเลือกปุ่มตัวเลือกอื่นๆ ทั้งหมด
หลังจากนั้นทันที ผู้ใช้คลิกปุ่มตัวเลือกใช้งานอยู่สำหรับโปรแกรมตรวจสอบสิทธิ์ Y ซึ่งจะส่งคำขอไปยัง CDP เพื่อตั้งค่า Y เป็น "ใช้งานอยู่" ระบบเลือกปุ่มตัวเลือกใช้งานอยู่สำหรับ Y และยกเลิกการเลือกปุ่มตัวเลือกอื่นๆ ทั้งหมด รวมถึงสำหรับ X
ในแบ็กเอนด์ การเรียกให้ตั้งค่า Y เป็น "ใช้งานอยู่" เสร็จสมบูรณ์และได้รับการแก้ไขแล้ว ตอนนี้ Y เปิดใช้งานอยู่ แต่โปรแกรมตรวจสอบสิทธิ์อื่นๆ ทั้งหมดปิดใช้งาน
ในแบ็กเอนด์ การเรียกให้ตั้งค่า X เป็น "ใช้งานอยู่" เสร็จสมบูรณ์และได้รับการแก้ไขแล้ว ตอนนี้ X ทำงานอยู่ แต่โปรแกรมตรวจสอบสิทธิ์อื่นๆ ทั้งหมด รวมถึง Y ไม่ได้ทำงาน
สถานการณ์ที่เกิดขึ้นตอนนี้คือ X เป็น Authenticator ที่ใช้งานอยู่ แต่ปุ่มตัวเลือกใช้งานอยู่สําหรับ X ไม่ได้เลือกไว้ Y ไม่ได้เป็น Authenticator ที่ใช้งานอยู่ แต่ปุ่มตัวเลือกใช้งานอยู่สำหรับ Y ถูกเลือกไว้ สถานะจริงของโปรแกรมตรวจสอบสิทธิ์ไม่ตรงกับสถานะในหน้าเว็บ แน่นอนว่านี่ไม่ใช่ปัญหา
โซลูชันของเรา: สร้างการสื่อสารแบบ 2 ทางจำลองระหว่างปุ่มตัวเลือกกับโปรแกรมตรวจสอบสิทธิ์ที่ใช้งานอยู่ ก่อนอื่น เราจะเก็บรักษาตัวแปร activeId
ในมุมมองเพื่อติดตามรหัสของผู้ตรวจสอบสิทธิ์ที่ใช้งานอยู่ในปัจจุบัน จากนั้นเราจะรอการเรียกให้ตั้งค่า Authenticator ที่ใช้งานอยู่เพื่อแสดงผล แล้วตั้งค่า activeId
เป็นรหัสของ Authenticator นั้น สุดท้าย เราจะวนดูแต่ละส่วนของตัวระบุสิทธิ์ หากรหัสของส่วนนั้นเท่ากับ activeId
เราจะตั้งค่าปุ่มเป็น "เลือกแล้ว" มิเช่นนั้น เราจะตั้งค่าปุ่มเป็นยกเลิกการเลือก
ซึ่งจะมีลักษณะดังนี้
async _setActiveAuthenticator(authenticatorId) {
await this._clearActiveAuthenticator();
await this._model.setAutomaticPresenceSimulation(authenticatorId, true);
this._activeId = authenticatorId;
this._updateActiveButtons();
}
_updateActiveButtons() {
const authenticators = this._authenticatorsView.getElementsByClassName('authenticator-section');
Array.from(authenticators).forEach(authenticator => {
authenticator.querySelector('input.dt-radio-button').checked =
authenticator.getAttribute('data-authenticator-id') === this._activeId;
});
}
async _clearActiveAuthenticator() {
if (this._activeId) {
await this._model.setAutomaticPresenceSimulation(this._activeId, false);
}
this._activeId = null;
}
เมตริกการใช้งาน
เราต้องการติดตามการใช้งานฟีเจอร์นี้ ตอนแรกเรามี 2 ตัวเลือก
นับจำนวนครั้งที่เปิดแท็บ WebAuthn ในเครื่องมือสำหรับนักพัฒนาเว็บ ตัวเลือกนี้อาจทําให้นับมากเกินไป เนื่องจากอาจมีการเปิดแท็บโดยไม่ได้ใช้จริง
ติดตามจํานวนครั้งที่มีการเปิด/ปิดช่องทําเครื่องหมาย "เปิดใช้สภาพแวดล้อม Authenticator เสมือน" ในแถบเครื่องมือ ตัวเลือกนี้ยังอาจมีปัญหาการนับที่มากเกินไปเนื่องจากผู้ใช้บางรายอาจเปิดและปิดสภาพแวดล้อมหลายครั้งในเซสชันเดียวกัน
สุดท้าย เราตัดสินใจใช้วิธีหลัง แต่จำกัดการนับโดยการตรวจสอบว่าเปิดใช้สภาพแวดล้อมในเซสชันแล้วหรือยัง ดังนั้น เราจะเพิ่มจำนวนขึ้นเพียง 1 รายการเท่านั้น ไม่ว่านักพัฒนาแอปจะสลับใช้สภาพแวดล้อมกี่ครั้งก็ตาม การดำเนินการนี้ได้ผลเนื่องจากระบบจะสร้างเซสชันใหม่ทุกครั้งที่เปิดแท็บอีกครั้ง จึงรีเซ็ตการตรวจสอบและอนุญาตให้เมตริกเพิ่มขึ้นอีกครั้ง
สรุป
ขอขอบคุณที่อ่าน หากมีข้อเสนอแนะในการปรับปรุงแท็บ WebAuthn โปรดแจ้งให้เราทราบโดยการรายงานข้อบกพร่อง
แหล่งข้อมูลบางส่วนหากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ WebAuthn มีดังนี้
- เอกสารการออกแบบส่วนหน้าของ WebAuthn DevTools
- เอกสารการออกแบบ API ทดสอบการตรวจสอบสิทธิ์บนเว็บ
- ข้อกำหนดของ Web Authentication API (WebAuthn)
- คำอธิบายและคำแนะนำเกี่ยวกับ WebAuthn
ดาวน์โหลดแชแนลตัวอย่าง
ลองใช้ Chrome Canary, Dev หรือ เบต้า เป็นเบราว์เซอร์สำหรับนักพัฒนาซอฟต์แวร์เริ่มต้น ช่องทางเวอร์ชันตัวอย่างเหล่านี้จะช่วยให้คุณเข้าถึงฟีเจอร์ล่าสุดของ DevTools, ทดสอบ API ของแพลตฟอร์มเว็บที่ล้ำสมัย และช่วยคุณค้นหาปัญหาในเว็บไซต์ได้ก่อนที่ผู้ใช้จะพบ
ติดต่อทีมเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome
ใช้ตัวเลือกต่อไปนี้เพื่อพูดคุยเกี่ยวกับฟีเจอร์ใหม่ การอัปเดต หรือสิ่งอื่นๆ ที่เกี่ยวข้องกับเครื่องมือสำหรับนักพัฒนาเว็บ
- ส่งความคิดเห็นและคำขอฟีเจอร์ถึงเราได้ที่ crbug.com
- รายงานปัญหาเกี่ยวกับเครื่องมือสำหรับนักพัฒนาเว็บโดยใช้ ตัวเลือกเพิ่มเติม > ความช่วยเหลือ > รายงานปัญหาเกี่ยวกับเครื่องมือสำหรับนักพัฒนาเว็บในเครื่องมือสำหรับนักพัฒนาเว็บ
- ทวีตถึง @ChromeDevTools
- แสดงความคิดเห็นในวิดีโอ YouTube เกี่ยวกับข่าวสารใน DevTools หรือวิดีโอ YouTube เกี่ยวกับเคล็ดลับใน DevTools