ช่วยเหลือผู้ใช้ที่มี OTP ที่ได้รับทาง SMS
WebOTP API คืออะไร
ทุกวันนี้ ผู้ใช้ส่วนใหญ่บนโลกมีอุปกรณ์เคลื่อนที่ ส่วนนักพัฒนาซอฟต์แวร์ มักจะใช้หมายเลขโทรศัพท์เป็นตัวระบุผู้ใช้บริการของตน
การยืนยันหมายเลขโทรศัพท์มีหลายวิธีด้วยกัน แต่ ระบบจะสร้างขึ้นมาแบบสุ่ม รหัสผ่านที่สามารถใช้งานได้เพียงครั้งเดียว (OTP) ที่ส่งทาง SMS เป็นหนึ่งในรหัสผ่านที่ใช้กันมากที่สุด กำลังส่งรหัสนี้ ไปยังเซิร์ฟเวอร์ของนักพัฒนาซอฟต์แวร์ ซึ่งแสดงให้เห็นถึงการควบคุมหมายเลขโทรศัพท์
เราได้นำแนวคิดนี้ไปปรับใช้แล้วในหลายสถานการณ์เพื่อให้บรรลุเป้าหมายต่อไปนี้
- หมายเลขโทรศัพท์เป็นตัวระบุผู้ใช้ เมื่อลงชื่อสมัครใช้ เว็บไซต์บางแห่งจะขอหมายเลขโทรศัพท์แทนที่อยู่อีเมล และ ให้ใช้เป็นตัวระบุบัญชี
- การยืนยันแบบ 2 ขั้นตอน เมื่อลงชื่อเข้าใช้ เว็บไซต์จะขอรหัสแบบใช้ครั้งเดียว ที่ส่งทาง SMS ร่วมกับรหัสผ่านหรือปัจจัยความรู้อื่นๆ เพื่อรับข้อมูลเพิ่มเติม
- การยืนยันการชำระเงิน เมื่อผู้ใช้ชำระเงิน ขอให้ชำระเงิน รหัสแบบใช้ครั้งเดียวที่ส่งทาง SMS จะช่วยยืนยันเจตนาของบุคคลได้
กระบวนการปัจจุบันสร้างอุปสรรคให้กับผู้ใช้ การค้นหา OTP ภายใน SMS การคัดลอกและวางข้อความลงในแบบฟอร์มจึงยุ่งยาก อัตรา Conversion ในเส้นทางของผู้ใช้ที่สำคัญ การค่อยๆ เปลี่ยนการเปลี่ยนแปลงนี้เป็นเครื่องมือมานานแล้ว เว็บไซต์จากนักพัฒนาซอฟต์แวร์รายใหญ่ที่สุดทั่วโลก Android มี API ที่ทำงานได้ทุกอย่าง เช่นเดียวกับ iOS และ Safari
WebOTP API ช่วยให้แอปของคุณได้รับข้อความรูปแบบพิเศษที่เชื่อมโยงกับ โดเมนของแอปคุณ จากนี้ คุณสามารถรับ OTP แบบเป็นโปรแกรมจาก SMS และยืนยันหมายเลขโทรศัพท์ให้ผู้ใช้ได้ง่ายขึ้น
ดูของจริง
สมมติว่าผู้ใช้ต้องการยืนยันหมายเลขโทรศัพท์กับเว็บไซต์ เว็บไซต์ ส่ง SMS ถึงผู้ใช้ผ่านทาง SMS และผู้ใช้ก็ป้อน OTP จาก เพื่อยืนยันความเป็นเจ้าของหมายเลขโทรศัพท์
เมื่อใช้ WebOTP API ขั้นตอนเหล่านี้ง่ายเพียงแค่แตะครั้งเดียวสำหรับผู้ใช้ ตามที่แสดงให้เห็นในวิดีโอ เมื่อข้อความมาถึง แผ่นด้านล่างจะปรากฏขึ้น และแจ้งให้ผู้ใช้ยืนยันหมายเลขโทรศัพท์ หลังจากคลิกยืนยัน ใน Bottom Sheet เบราว์เซอร์จะวาง OTP ลงในแบบฟอร์มและ ผู้ใช้ส่งแบบฟอร์มได้โดยที่ผู้ใช้ไม่ต้องกดดำเนินการต่อ
โปรดดูแผนภาพกระบวนการทั้งหมดในรูปภาพด้านล่าง
ลองดูการสาธิตด้วยตัวเอง โดยจะไม่ขอ หมายเลขโทรศัพท์หรือส่ง SMS ไปยังอุปกรณ์ของคุณ แต่คุณสามารถส่งได้จาก อุปกรณ์อื่นได้ด้วยการคัดลอกข้อความที่แสดงในการสาธิต วิธีนี้ได้ผลเพราะ ไม่ว่าผู้ส่งจะเป็นใครเมื่อใช้ WebOTP API
- ไปที่ https://web-otp.glitch.me ใน Chrome 84 หรือ ในอุปกรณ์ Android ในภายหลัง
- ส่งข้อความ SMS ต่อไปนี้จากโทรศัพท์เครื่องอื่นไปยังโทรศัพท์ของคุณ
Your OTP is: 123456.
@web-otp.glitch.me #12345
คุณได้รับ SMS และเห็นข้อความแจ้งให้ป้อนรหัสในพื้นที่ป้อนข้อมูลไหม นี่คือลักษณะการทำงานของ WebOTP API สำหรับผู้ใช้
การใช้ WebOTP API ประกอบด้วย 3 ส่วนดังนี้
- แท็ก
<input>
ที่มีคำอธิบายประกอบอย่างถูกต้อง - JavaScript ในเว็บแอปของคุณ
- ข้อความที่จัดรูปแบบที่ส่งทาง SMS
ฉันจะพูดถึงแท็ก <input>
ก่อน
ใส่คำอธิบายประกอบในแท็ก <input>
WebOTP ทำงานได้โดยไม่ต้องใช้คำอธิบายประกอบ HTML แต่จะใช้สำหรับข้ามเบราว์เซอร์
เราขอแนะนำให้คุณเพิ่ม autocomplete="one-time-code"
ลงใน
แท็ก <input>
ที่คุณคาดว่าผู้ใช้จะต้องป้อน OTP
การดำเนินการนี้จะช่วยให้ Safari 14 ขึ้นไปแนะนำให้ผู้ใช้ป้อน <input>
โดยอัตโนมัติ
ด้วย OTP เมื่อได้รับ SMS ตามรูปแบบที่อธิบายไว้ในส่วนจัดรูปแบบข้อความ SMS แม้จะไม่รองรับ WebOTP ก็ตาม
HTML
<form>
<input autocomplete="one-time-code" required/>
<input type="submit">
</form>
ใช้ WebOTP API
เนื่องจาก WebOTP นั้นใช้งานง่าย เพียงคัดลอกและวางโค้ดต่อไปนี้ งาน เราจะคอยแนะนำสิ่งที่กำลังเกิดขึ้น
JavaScript
if ('OTPCredential' in window) {
window.addEventListener('DOMContentLoaded', e => {
const input = document.querySelector('input[autocomplete="one-time-code"]');
if (!input) return;
const ac = new AbortController();
const form = input.closest('form');
if (form) {
form.addEventListener('submit', e => {
ac.abort();
});
}
navigator.credentials.get({
otp: { transport:['sms'] },
signal: ac.signal
}).then(otp => {
input.value = otp.code;
if (form) form.submit();
}).catch(err => {
console.log(err);
});
});
}
การตรวจหาฟีเจอร์
การตรวจหาฟีเจอร์จะเหมือนกับของ API อื่นๆ จำนวนมาก กำลังฟัง
เหตุการณ์ DOMContentLoaded
จะรอให้แผนผัง DOM พร้อมที่จะค้นหา
JavaScript
if ('OTPCredential' in window) {
window.addEventListener('DOMContentLoaded', e => {
const input = document.querySelector('input[autocomplete="one-time-code"]');
if (!input) return;
…
const form = input.closest('form');
…
});
}
ประมวลผล OTP
WebOTP API เองนั้นเรียบง่ายเพียงพอ ใช้
navigator.credentials.get()
เพื่อรับ OTP WebOTP เพิ่มตัวเลือก otp
ใหม่ลงในเมธอดนั้น แต่มีเพียง
พร็อพเพอร์ตี้ 1 รายการ: transport
ซึ่งค่าต้องเป็นอาร์เรย์ที่มีสตริง 'sms'
JavaScript
…
navigator.credentials.get({
otp: { transport:['sms'] }
…
}).then(otp => {
…
ซึ่งจะเรียกใช้ขั้นตอนการให้สิทธิ์ของเบราว์เซอร์เมื่อมีข้อความ SMS เข้ามา หากสิทธิ์คือ
ที่ได้รับ สัญญาที่ส่งกลับมาจะแก้ไขด้วยออบเจ็กต์ OTPCredential
เนื้อหาของออบเจ็กต์ OTPCredential
ที่ได้รับ
{
code: "123456" // Obtained OTP
type: "otp" // `type` is always "otp"
}
จากนั้นส่งค่า OTP ไปยังช่อง <input>
การส่งแบบฟอร์มโดยตรง
จะกำจัดขั้นตอนที่กำหนดให้ผู้ใช้แตะปุ่มใดปุ่มหนึ่ง
JavaScript
…
navigator.credentials.get({
otp: { transport:['sms'] }
…
}).then(otp => {
input.value = otp.code;
if (form) form.submit();
}).catch(err => {
console.error(err);
});
…
ล้มเลิกข้อความ
ในกรณีที่ผู้ใช้ป้อน OTP ด้วยตนเองและส่งแบบฟอร์ม คุณสามารถยกเลิก
get()
โดยใช้อินสแตนซ์ AbortController
ในออบเจ็กต์ options
JavaScript
…
const ac = new AbortController();
…
if (form) {
form.addEventListener('submit', e => {
ac.abort();
});
}
…
navigator.credentials.get({
otp: { transport:['sms'] },
signal: ac.signal
}).then(otp => {
…
จัดรูปแบบข้อความ SMS
ตัว API เองควรดูเรียบง่ายพอ แต่มี 2-3 สิ่งต่อไปนี้
สิ่งที่ต้องรู้ก่อนใช้งาน ต้องส่งข้อความหลังจาก
โทรหา navigator.credentials.get()
แล้ว ซึ่งจะต้องรับในอุปกรณ์
ที่มีการเรียก get()
สุดท้าย ข้อความต้องเป็นไปตาม
การจัดรูปแบบ:
- ข้อความจะเริ่มต้นด้วย (ไม่บังคับ) ข้อความที่มนุษย์อ่านได้ซึ่งมีเลข 4 ถึง 10 สตริงที่เป็นตัวอักษรและตัวเลขคละกันที่มีตัวเลขอย่างน้อย 1 ตัวออกจากบรรทัดสุดท้าย สำหรับ URL และ OTP
- ส่วนโดเมนของ URL ของเว็บไซต์ที่เรียกใช้ API จะต้องอยู่ด้านหน้า
โดย
@
- URL ต้องมีเครื่องหมายสี่เหลี่ยม (
#
") ตามด้วย OTP
เช่น
Your OTP is: 123456.
@www.example.com #123456
ตัวอย่างที่ไม่ดีมีดังนี้
ตัวอย่างข้อความ SMS ที่มีรูปแบบไม่ถูกต้อง | สาเหตุที่ไม่ได้ผล |
---|---|
Here is your code for @example.com #123456 |
@ ต้องเป็นอักขระตัวแรกของบรรทัดสุดท้าย |
Your code for @example.com is #123456 |
@ ต้องเป็นอักขระตัวแรกของบรรทัดสุดท้าย |
Your verification code is 123456 @example.com\t#123456 |
ควรมีช่องว่าง 1 ที่ระหว่าง @host ถึง #code |
Your verification code is 123456 @example.com #123456 |
ควรมีช่องว่าง 1 ที่ระหว่าง @host ถึง #code |
Your verification code is 123456 @ftp://example.com #123456 |
ไม่สามารถรวมรูปแบบ URL ได้ |
Your verification code is 123456 @https://example.com #123456 |
ไม่สามารถรวมรูปแบบ URL ได้ |
Your verification code is 123456 @example.com:8080 #123456 |
ไม่สามารถรวมพอร์ต |
Your verification code is 123456 @example.com/foobar #123456 |
ไม่สามารถรวมเส้นทาง |
Your verification code is 123456 @example .com #123456 |
ไม่มีช่องว่างในโดเมน |
Your verification code is 123456 @domain-forbiden-chars-#%/:<>?@[] #123456 |
ไม่มีอักขระต้องห้ามในโดเมน |
@example.com #123456 Mambo Jumbo |
คาดว่า @host และ #code จะเป็นบรรทัดสุดท้าย |
@example.com #123456 App hash #oudf08lkjsdf834 |
คาดว่า @host และ #code จะเป็นบรรทัดสุดท้าย |
Your verification code is 123456 @example.com 123456 |
ไม่มี # |
Your verification code is 123456 example.com #123456 |
ไม่มี @ |
Hi mom, did you receive my last text |
ไม่มี @ และ # |
เดโม
ลองใช้ข้อความที่หลากหลายด้วยการสาธิต: https://web-otp.glitch.me
คุณยังแยกและสร้างเวอร์ชันได้ด้วย โดยทำดังนี้ https://glitch.com/edit/#!/web-otp.
ใช้ WebOTP จาก iframe แบบข้ามต้นทาง
โดยทั่วไปแล้ว การป้อน SMS OTP ไปยัง iframe แบบข้ามต้นทางจะใช้สำหรับการชำระเงิน การยืนยัน โดยเฉพาะในเรื่อง 3D Secure มีรูปแบบที่ใช้กันโดยทั่วไปเพื่อรองรับ iframe แบบข้ามต้นทาง WebOTP API จะส่ง OTP ที่เชื่อมโยงกับต้นทางที่ซ้อนกัน สำหรับ ตัวอย่าง:
- ผู้ใช้ไปที่
shop.example
เพื่อซื้อรองเท้าด้วยบัตรเครดิต - หลังจากป้อนหมายเลขบัตรเครดิตแล้ว ผู้ให้บริการชำระเงินที่ผสานรวมจะแสดง
จาก
bank.example
ใน iframe ที่ขอให้ผู้ใช้ยืนยัน หมายเลขโทรศัพท์สำหรับการชำระเงินที่รวดเร็ว bank.example
ส่ง SMS ที่มี OTP ถึงผู้ใช้เพื่อให้ผู้ใช้ดำเนินการต่อไปนี้ได้ โปรดป้อนรหัสดังกล่าวเพื่อยืนยันตัวตน
หากต้องการใช้ WebOTP API จากภายใน iframe แบบข้ามต้นทาง คุณต้องทํา 2 สิ่งต่อไปนี้
- ใส่คำอธิบายประกอบทั้งต้นทางของเฟรมบนสุดและต้นทาง iframe ในข้อความ SMS
- กำหนดค่านโยบายสิทธิ์เพื่ออนุญาตให้ iframe แบบข้ามต้นทางรับ OTP จากผู้ใช้โดยตรง
คุณสามารถลองการสาธิตได้ที่ https://web-otp-iframe-demo.stackblitz.io.
ใส่คำอธิบายประกอบต้นทางที่เชื่อมโยงกับข้อความ SMS
เมื่อมีการเรียก WebOTP API จากใน iframe ข้อความ SMS จะต้อง
รวมต้นทางของเฟรมบนสุดซึ่งนำหน้าด้วย @
ตามด้วย OTP ที่อยู่ก่อนหน้า #
และต้นทาง iframe ที่นำหน้าด้วย @
ที่บรรทัดสุดท้าย
Your verification code is 123456
@shop.example #123456 @bank.exmple
กำหนดค่านโยบายสิทธิ์
หากต้องการใช้ WebOTP ใน iframe แบบข้ามต้นทาง เครื่องมือฝังจะต้องให้สิทธิ์เข้าถึง API ผ่านนโยบายสิทธิ์สำหรับข้อมูลเข้าสู่ระบบ OTP เพื่อหลีกเลี่ยงการดำเนินการที่ไม่ได้ตั้งใจ พฤติกรรมของคุณ โดยทั่วไป มี 2 วิธีในการบรรลุเป้าหมายนี้:
ผ่านส่วนหัว HTTP
Permissions-Policy: otp-credentials=(self "https://bank.example")
ผ่านแอตทริบิวต์ iframe allow
:
<iframe src="https://bank.example/…" allow="otp-credentials"></iframe>
ดูตัวอย่างเพิ่มเติมเกี่ยวกับวิธีระบุนโยบายสิทธิ์
ใช้ WebOTP บนเดสก์ท็อป
ใน Chrome WebOTP รองรับการฟัง SMS ที่ได้รับในอุปกรณ์อื่นๆ เพื่อ ช่วยเหลือผู้ใช้ในการยืนยันหมายเลขโทรศัพท์ให้เสร็จสมบูรณ์บนเดสก์ท็อป
ซึ่งความสามารถนี้กำหนดให้ผู้ใช้ต้องลงชื่อเข้าใช้บัญชี Google เดียวกันทั้งบน Chrome บนเดสก์ท็อปและ Android Chrome
นักพัฒนาแอปทุกรายต้องทำคือใช้ WebOTP API ในเว็บไซต์บนเดสก์ท็อป โดยใช้วิธีเดียวกับเว็บไซต์บนอุปกรณ์เคลื่อนที่ แต่จะไม่มีเทคนิคพิเศษใดๆ ต้องระบุ
ดูรายละเอียดเพิ่มเติมที่ยืนยันหมายเลขโทรศัพท์บนเดสก์ท็อปโดยใช้ WebOTP API
คำถามที่พบบ่อย
กล่องโต้ตอบไม่ปรากฏขึ้น แต่ฉันกำลังส่งข้อความที่มีรูปแบบถูกต้อง เกิดอะไรขึ้น
มีข้อควรระวังบางอย่างเมื่อทดสอบ API ดังนี้
- หากมีหมายเลขโทรศัพท์ของผู้ส่งอยู่ในข้อมูลรายชื่อติดต่อของผู้รับ API จะไม่ทริกเกอร์เนื่องจากการออกแบบ API ความยินยอมของผู้ใช้ SMS ที่เกี่ยวข้อง
- หากใช้โปรไฟล์งานในอุปกรณ์ Android และ WebOTP มี ไม่ได้ผล ให้ลองติดตั้งและใช้ Chrome ในโปรไฟล์ส่วนตัวของคุณแทน (เช่น โปรไฟล์เดียวกับที่รับข้อความ SMS)
โปรดกลับมาตรวจสอบรูปแบบเพื่อดูว่า SMS อยู่ในรูปแบบที่ถูกต้องหรือไม่
API นี้เข้ากันได้กับเบราว์เซอร์ต่างๆ หรือไม่
Chromium และ WebKit เห็นพ้องกันในเรื่องรูปแบบข้อความ SMS และ Apple ได้ประกาศการรองรับ Safari ของ Safari ตั้งแต่ iOS 14 เป็นต้นไป
และ macOS Big Sur แม้ว่า Safari จะไม่รองรับ WebOTP JavaScript API โดย
อธิบายเอลิเมนต์ input
ด้วย autocomplete=["one-time-code"]
ซึ่งเป็นค่าเริ่มต้น
แป้นพิมพ์จะแนะนำให้คุณป้อน OTP โดยอัตโนมัติหากข้อความ SMS เป็นไปตามข้อกำหนด
ด้วยรูปแบบ
การใช้ SMS เป็นวิธีการตรวจสอบสิทธิ์จะปลอดภัยไหม
แม้ SMS OTP จะมีประโยชน์ในการยืนยันหมายเลขโทรศัพท์เมื่อได้หมายเลขดังกล่าวเป็นครั้งแรก ที่ระบุ การยืนยันหมายเลขโทรศัพท์ทาง SMS ต้องใช้อย่างรอบคอบเพื่อ ใช้การตรวจสอบสิทธิ์ซ้ำเนื่องจากผู้ให้บริการอาจลักลอบใช้และนำหมายเลขโทรศัพท์กลับมาใช้ใหม่ได้ WebOTP เป็นกลไกการตรวจสอบสิทธิ์ซ้ำและการกู้คืนที่สะดวก แต่บริการต่างๆ ควร รวมกับปัจจัยอื่นๆ เช่น การท้าทายความรู้ หรือใช้ API การตรวจสอบสิทธิ์เว็บ เพื่อการตรวจสอบสิทธิ์ที่มีความปลอดภัยสูง
ฉันจะรายงานข้อบกพร่องในการใช้งาน Chrome ได้ที่ใด
คุณพบข้อบกพร่องในการติดตั้งใช้งาน Chrome ไหม
- รายงานข้อบกพร่องที่
https://new.crbug.com.
ระบุรายละเอียดให้มากที่สุดเท่าที่ทำได้ วิธีการง่ายๆ ในการทำซ้ำ และ
ตั้งค่า Components เป็น
Blink>WebOTP
ฉันจะช่วยฟีเจอร์นี้ได้อย่างไร
คุณวางแผนที่จะใช้ WebOTP API ไหม การสนับสนุนสาธารณะของคุณจะช่วยให้เราจัดลำดับความสำคัญ
คุณลักษณะต่างๆ และแสดงให้ผู้ให้บริการเบราว์เซอร์รายอื่นเห็นถึงความสำคัญในการสนับสนุนของตน
ส่งทวีตไปยัง @ChromiumDev โดยใช้แฮชแท็ก
#WebOTP
และแจ้งให้เราทราบถึงตำแหน่งและวิธีที่คุณใช้งาน