ดำเนินการยืนยันทาง SMS บนเซิร์ฟเวอร์

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

เซิร์ฟเวอร์การยืนยันทางโทรศัพท์มีหน้าที่รับผิดชอบ 3 อย่างดังนี้

  1. การสร้างข้อความยืนยันที่มีรหัสแบบใช้ครั้งเดียวและมีรูปแบบที่ SMS Retriever API ของฝั่งไคลเอ็นต์ต้องการ
  2. การส่งข้อความยืนยันไปยังอุปกรณ์ของผู้ใช้
  3. การยืนยันรหัสแบบใช้ครั้งเดียวเมื่อส่งกลับไปยังเซิร์ฟเวอร์และดำเนินงานหลังการยืนยันให้เสร็จสมบูรณ์ ซึ่งแบ็กเอนด์ต้องใช้

คุณสามารถเลือกได้ว่าจะให้แอปของคุณโต้ตอบกับเซิร์ฟเวอร์อย่างไร วิธีทั่วไปคือการเปิดเผย REST API ที่มีปลายทาง 2 แห่ง โดยปลายทางที่ได้รับคำขอยืนยันหมายเลขโทรศัพท์และส่งข้อความยืนยันทาง SMS คือปลายทางที่ 2 ที่ได้รับรหัสแบบใช้ครั้งเดียวจากแอปของคุณ

1. สร้างข้อความยืนยัน

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

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

Your ExampleApp code is: 123ABC78

FA+9qCX9VSu

การสร้างรหัสแบบใช้ครั้งเดียว

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

วิธีหนึ่งในการใช้โค้ดแบบใช้ครั้งเดียวคือการสร้างหมายเลขสุ่ม ซึ่งคุณใช้เป็นคีย์ในตารางฐานข้อมูล ตัวอย่างเช่น คุณอาจมีตาราง Pending Verifications ดังตัวอย่างต่อไปนี้

ID ผู้ใช้ วันหมดอายุ
123456789... 1234 14-3-2017 1:59

คุณใช้รหัสที่เข้ารหัส base32 เป็นรหัสแบบใช้ครั้งเดียวได้

การคำนวณสตริงแฮชของแอป

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

  1. หากคุณใช้ App Signing โดย Google Play ให้ดาวน์โหลดใบรับรอง App Signing (deployment_cert.der) จากส่วนApp Signing ของ Google Play Console

    จากนั้นนำเข้าใบรับรอง App Signing ในคีย์สโตร์ชั่วคราวดังนี้

    keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
    

    หากคุณลงนาม APK โดยตรง ให้ข้ามขั้นตอนนี้

  2. รับใบรับรอง App Signing ที่คุณนำเข้าด้านบนหรือใบรับรองที่คุณใช้ในการรับรอง APK โดยตรงเป็นสตริงฐานสิบหกตัวพิมพ์เล็ก

    ตัวอย่างเช่น หากต้องการรับสตริงฐานสิบหกจากคีย์สโตร์ชั่วคราวที่สร้างขึ้นด้านบน ให้พิมพ์คำสั่งต่อไปนี้

    keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
    

    หากคุณลงนาม APK โดยตรง ให้ระบุคีย์สโตร์สำหรับเวอร์ชันที่ใช้งานจริงและชื่อแทนใบรับรอง

  3. หากคุณสร้างคีย์สโตร์ชั่วคราว ให้ลบคีย์สโตร์ดังกล่าว

  4. เติมสตริงเลขฐาน 16 ต่อท้ายชื่อแพ็กเกจของแอป โดยคั่นด้วยเว้นวรรค 1 ช่อง

  5. คำนวณผลรวม SHA-256 ของสตริงแบบรวม อย่าลืมลบช่องว่างนำหน้าหรือต่อท้ายออกจากสตริงก่อนคำนวณผลรวม SHA-256

  6. Base64-เข้ารหัสค่าฐานสองของผลรวม SHA-256 คุณอาจต้องถอดรหัสผลรวม SHA-256 จากรูปแบบเอาต์พุตก่อน

  7. สตริงแฮชของแอปคืออักขระ 11 ตัวแรกของแฮชที่เข้ารหัสแบบ Base64

คำสั่งต่อไปนี้จะคำนวณสตริงแฮชจากคีย์สโตร์เวอร์ชันที่ใช้งานจริงของแอป

keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11

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

2. ส่งข้อความยืนยันทาง SMS

หลังจากที่คุณสร้างข้อความยืนยันแล้ว ให้ส่งข้อความไปยังหมายเลขโทรศัพท์ของผู้ใช้โดยใช้ระบบ SMS ใดก็ได้

ตัวอย่างเช่น ดูการยืนยันแอปโดยใช้ Twilio SMS ในเว็บไซต์ของนักพัฒนาซอฟต์แวร์ Twilio

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

3. ยืนยันรหัสแบบใช้ครั้งเดียวเมื่อมีการส่งคืน

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

  1. ตรวจสอบว่ารหัสแบบใช้ครั้งเดียวถูกต้องและไม่หมดอายุ
  2. บันทึกว่าผู้ใช้ที่ลิงก์กับรหัสแบบใช้ครั้งเดียวได้ยืนยันหมายเลขโทรศัพท์เสร็จสมบูรณ์แล้ว
  3. นำบันทึกฐานข้อมูลของโค้ดแบบใช้ครั้งเดียวออก หรือวิธีอื่นเพื่อไม่ให้ใช้โค้ดเดิมได้อีก

เมื่อคุณบันทึกสถานะการยืนยันของผู้ใช้และนำรหัสแบบใช้ครั้งเดียวออกจากฐานข้อมูล แสดงว่าการยืนยันเสร็จสมบูรณ์แล้ว