Skip to main content

ตั้งค่ายืนยันตัวตนด้วย OTP

ภาพรวม

OTP Config คือการตั้งค่าระดับ LINE OA ว่าจะเปิดใช้การยืนยันเบอร์โทรด้วย OTP หรือไม่ และหากเปิดใช้จะกำหนดพารามิเตอร์อย่างไร การตั้งค่านี้ใช้กับแบบฟอร์มที่ต้องการความมั่นใจว่า เบอร์โทรที่กรอกเข้ามาเป็นของผู้กรอกจริง

ลักษณะพิเศษของโมดูลนี้คือเป็น singleton ต่อหนึ่ง OA โดยตาราง otp_config มี unique constraint ที่ line_oa_id จึงไม่ใช่ CRUD หลายแถวแบบโมดูลทั่วไป แต่มีเพียง GET กับ PUT ที่ทำงานแบบ upsert และหากยังไม่เคยตั้งค่า GET จะคืน config ว่างหรือค่า default แทนที่จะตอบ 404 เพราะการยังไม่มีข้อมูลถือเป็นสถานะปกติที่พบได้บ่อย

โมดูลนี้พัฒนาขึ้นใหม่ในเวอร์ชัน Go โดยไม่มีต้นฉบับใน NestJS

Business Flow

  1. ผู้ใช้เปิดหน้าตั้งค่า OTP ใน cms-web ระบบเรียก GET /api/otp-config service จะอ่านข้อมูลจากตาราง otp_config ตามค่า lineOaId ใน CLS หากไม่พบแถวข้อมูล จะคืนค่า default หรือ config ว่างซึ่งแทนสถานะ "ยังไม่ตั้งค่า" โดยไม่ throw error
  2. ผู้ใช้กรอกค่าต่าง ๆ ได้แก่ การเปิดหรือปิด OTP, provider ที่ใช้ส่ง, ความยาวของรหัส, อายุของรหัส และข้อความที่ส่งไป แล้วกดบันทึก
  3. PUT /api/otp-config ทำงานแบบ upsert โดยอ้างอิงจาก line_oa_id หากมีแถวอยู่แล้วจะอัปเดต หากยังไม่มีจะสร้างใหม่
  4. แบบฟอร์มที่เปิดใช้ OTP จะอ่าน config ชุดนี้ในเวลา runtime โดย client-api เป็นผู้ส่งรหัส OTP ให้ผู้กรอก และจะยอมรับ submission ของฟอร์ม ต่อเมื่อยืนยันสำเร็จแล้วเท่านั้น
  5. หากปิดการใช้งาน OTP แบบฟอร์มจะรับคำตอบได้ทันทีโดยไม่ต้องผ่านการยืนยัน

ไฟล์และฟังก์ชันหลัก

โค้ดหลักอยู่ที่ internal/modules/otpconfig/ ประกอบด้วย controller.go, service.go และ dto.go

MethodRouteHandlerPolicy (metadata)
GET/api/otp-configct.getread otp-config
PUT/api/otp-configct.upsertupdate otp-config

ทั้งสอง route ถูก register บน group authed ซึ่งใช้ global JWT โดยไม่มี ModuleGate ครอบ โครงสร้างโค้ดอ้างอิงจากโมดูล quickreply แต่ปรับให้เป็นแบบ singleton ตามที่อธิบายไว้ใน doc comment ของ service.go

จุดเชื่อมต่อกับ Service อื่น

  • สิทธิ์การเข้าถึง — ต้องผ่าน global JwtAuth และ token ต้องมี lineOaId ส่วนค่า PolicyModuleOtpConfig = "otp-config" เป็น enum ที่ตั้งให้ตรงกับ MODULE_URL.OTP_CONFIG ของ cms-web
  • ตารางที่เกี่ยวข้องotp_config ซึ่งมี unique constraint ที่คอลัมน์ line_oa_id
  • Context — อ่าน lineOaId จาก CLS เพื่อกำหนดขอบเขตข้อมูล
  • เอกสารออกแบบdocs/superpowers/specs/2026-07-26-form-otp-verification-design.md หัวข้อ "1. OTP config store"
  • ผู้บริโภคข้อมูล — Form Builder และ line-management-client-api-go ซึ่งเป็นฝั่งที่ส่งและตรวจสอบ OTP จริง