ตั้งค่ายืนยันตัวตนด้วย 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
- ผู้ใช้เปิดหน้าตั้งค่า OTP ใน cms-web ระบบเรียก
GET /api/otp-configservice จะอ่านข้อมูลจากตารางotp_configตามค่าlineOaIdใน CLS หากไม่พบแถวข้อมูล จะคืนค่า default หรือ config ว่างซึ่งแทนสถานะ "ยังไม่ตั้งค่า" โดยไม่ throw error - ผู้ใช้กรอกค่าต่าง ๆ ได้แก่ การเปิดหรือปิด OTP, provider ที่ใช้ส่ง, ความยาวของรหัส, อายุของรหัส และข้อความที่ส่งไป แล้วกดบันทึก
PUT /api/otp-configทำงานแบบ upsert โดยอ้างอิงจากline_oa_idหากมีแถวอยู่แล้วจะอัปเดต หากยังไม่มีจะสร้างใหม่- แบบฟอร์มที่เปิดใช้ OTP จะอ่าน config ชุดนี้ในเวลา runtime โดย client-api เป็นผู้ส่งรหัส OTP ให้ผู้กรอก และจะยอมรับ submission ของฟอร์ม ต่อเมื่อยืนยันสำเร็จแล้วเท่านั้น
- หากปิดการใช้งาน OTP แบบฟอร์มจะรับคำตอบได้ทันทีโดยไม่ต้องผ่านการยืนยัน
ไฟล์และฟังก์ชันหลัก
โค้ดหลักอยู่ที่ internal/modules/otpconfig/ ประกอบด้วย controller.go, service.go
และ dto.go
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/otp-config | ct.get | read otp-config |
| PUT | /api/otp-config | ct.upsert | update 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 จริง