Company insights

การทำระบบ Validate OTP ใน Flutter


OTP (One-Time Password) เป็นรหัสผ่านแบบใช้ครั้งเดียวที่ใช้สำหรับยืนยันตัวตนของผู้ใช้
เช่น การสมัครสมาชิก การเข้าสู่ระบบ หรือการยืนยันธุรกรรม ระบบ OTP
ช่วยเพิ่มความปลอดภัยให้กับแอปพลิเคชัน โดยทั่วไป OTP จะถูกส่งผ่าน
SMS, Email หรือ Push Notification


ใน Flutter การทำระบบ OTP จะต้องมีทั้งฝั่ง Mobile App และ Backend
ที่ทำหน้าที่สร้างรหัส OTP และตรวจสอบความถูกต้องของรหัส

โครงสร้างการทำงานของระบบ OTP


  • ผู้ใช้กรอกเบอร์โทรศัพท์หรืออีเมล

  • แอปส่งคำขอไปยัง Backend เพื่อสร้าง OTP

  • Backend ส่ง OTP ไปยังผู้ใช้ (SMS หรือ Email)

  • ผู้ใช้กรอกรหัส OTP ในแอป

  • แอปส่ง OTP ไปตรวจสอบกับ Backend

ตัวอย่าง UI สำหรับกรอก OTP


import 'package:flutter/material.dart';

class OtpPage extends StatefulWidget {
 @override
 _OtpPageState createState() => _OtpPageState();
}

class _OtpPageState extends State<OtpPage> {

 TextEditingController otpController = TextEditingController();

 void verifyOtp() {
   String otp = otpController.text;
   print("OTP: $otp");
 }

 @override
 Widget build(BuildContext context) {

   return Scaffold(
     appBar: AppBar(
       title: Text("Verify OTP"),
     ),
     body: Padding(
       padding: EdgeInsets.all(20),
       child: Column(
         children: [

           TextField(
             controller: otpController,
             keyboardType: TextInputType.number,
             decoration: InputDecoration(
               labelText: "Enter OTP"
             ),
           ),

           SizedBox(height: 20),

           ElevatedButton(
             onPressed: verifyOtp,
             child: Text("Verify")
           )

         ],
       ),
     ),
   );
 }
}

การส่ง OTP ไปตรวจสอบกับ API


เมื่อผู้ใช้กรอก OTP แล้ว แอปจะต้องส่งข้อมูลไปยัง API ของ Backend
เพื่อตรวจสอบว่ารหัสถูกต้องหรือไม่


import 'dart:convert';
import 'package:http/http.dart' as http;

Future verifyOtp(String otp) async {

 final response = await http.post(
   Uri.parse("https://api.example.com/verify-otp"),
   headers: {
     "Content-Type": "application/json"
   },
   body: jsonEncode({
     "otp": otp
   })
 );

 if (response.statusCode == 200) {
   return true;
 } else {
   return false;
 }

}

ตัวอย่างโครงสร้างฐานข้อมูล OTP


ฝั่ง Backend มักจะเก็บ OTP ในฐานข้อมูลชั่วคราวเพื่อใช้ตรวจสอบ


CREATE TABLE otp_codes (
 otp_id SERIAL PRIMARY KEY,
 user_id INT,
 otp_code VARCHAR(10),
 expired_at TIMESTAMP,
 created_at TIMESTAMP DEFAULT NOW()
);

แนวทางเพิ่มความปลอดภัยของ OTP


  • กำหนดอายุของ OTP เช่น 5 นาที

  • จำกัดจำนวนครั้งที่กรอก OTP ผิด

  • เข้ารหัส OTP ก่อนบันทึกในฐานข้อมูล

  • ใช้ HTTPS ในการส่งข้อมูล

การใช้งานแพ็กเกจสำหรับ OTP


Flutter มีแพ็กเกจที่ช่วยสร้างช่องกรอก OTP ได้ง่าย เช่น


  • pin_code_fields

  • otp_text_field


แพ็กเกจเหล่านี้ช่วยให้ UI ของการกรอก OTP ดูเป็นช่องตัวเลข
เหมือนแอปธนาคารหรือแอปยืนยันตัวตน

สรุป


ระบบ OTP เป็นฟีเจอร์สำคัญที่ช่วยเพิ่มความปลอดภัยให้กับแอปพลิเคชัน
โดย Flutter สามารถสร้าง UI สำหรับกรอก OTP และเชื่อมต่อกับ Backend
เพื่อตรวจสอบรหัสได้ผ่าน REST API


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