ວິທີສ້າງ API ສົ່ງ SMS OTP ແລະ Verify ໂດຍໃຊ້ Twilio ໃນ Go ແບບງ່າຍໆ
Tags: go, otp, echo, twilo
Published: 2023-06-02 08:04:26

> ບົດຄວາມນີ້ເຮົາຈະມາລອງສ້າງ api ສົ່ງ sms otp ໄປຫາເບີໂທຜູ້ໃຊ້ໂດຍໃຊ້ twilio ໃນ go ມັນຈະມີວິທີການເຮັດແນວໃດໄປເບິ່ງກັນເລີຍ.

---

> ກ່ອນອື່ນເຮັດລະບົບສົ່ງ otp ເພື່ອຫຍັງ: ຄືອົງກອນຕ່າງໆຈະຫາວິທີຈັດການເພື່ອຕ້ານໄພຄຸກຄາມໃຫ້ມີຊ່ອງໂຫວໜ້ອຍທີ່ສຸດເທົ່າທີຈະເຮັດໄດ້ເພື່ອຄວາມປອດໃຜຕໍ່ລະບົບຂອງຕົນເອງ. ສະນັ້ນການທີ່ຈະໃຫ້ຜູ້ໃຊ້ທົ່ວໄປມາໃຊ້ລະບົບດັ່ງກ່າວເຊັນ: login, register reset password...ອື່ນໆທີ່ມີເປັນຂໍ້ມູນສ່ວນຕົວແນ່ນອນວ່າກະຕ້ອງຫາວິທີຢືນຢັນຕົວຕົນເພື່ອຄວາມປອດໄພໃນລະດັບໜຶ່ງ

---

> ## ຂັ້ນຕອນ

1/ ເຮົາຕ້ອງໄປສະໝັກ account ຂອງ twilio ສາມາດເຂົ້າໄປສະໝັກຕາມລິ້ງນີ້ເລີຍ www.twilio.com/try-twilio ຖ້າຍັງບໍ່ມີ account 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/662iyavrs7thitbel1an.png)

2/ ຫລັງຈາກນັ້ນ login


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ki85oetz5wd1y9nnec34.png)

ມັນຈະເຂົ້າໜ້າ www.console.twilio.com ເຂົາຈະໃຫ້ເຮົາສອງ key ຄື: Account SID ແລະ Auth Token ເຮົາຈະເອົາໄປໃສ່ເປັນ parameter config


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uohamuwxb8wg430fclg6.png)

3/ ສ້າງ service sms ໃຫ້ໄປຕັ້ງຄ່າຕາມຂັ້ນຕອນໃນຮູບທີ່ບອກໄວ້ເລີຍ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wr0odi6snpp1505yzov.png)

4/ ໃຫ້ສ້າງ service Friendly name ແມ່ນໃຫ້ຕັ້ງຊື່ sevice name ຂອງເຮົາຕົວຢ່າງໃນນີ້ເຮົາຕັ້ງຊື່ວ່າ OTP demo, Verification channels ແມ່ນໃຫ້ເຮົາຕິກເອົາ sms ເພາະວ່າເຮົາຈະສົ່ງຮູບແບບເປັນ sms, Notes ໃສ່ກໍໄດ້ບໍ່ໃສ່ກໍໄດ້ແລ້ວກົດ continue ໄດ້ເລີຍ


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1y8zbdwhbnf25sai8f7t.png)


5/ ຫລັງຈາກທີ່ເຮົາສ້າງ service ສຳເລັດແລ້ວມັນຈະໃຫ້ key Service SID ເຮົາຈະເອົາໄປໃສ່ເປັນ parameter config, Code length ເປັນຈຳນວນຄວາມຍາວຂອງ code OTP ໂດຍປົກະຕິແມ່ນຈະເອົາຕາມຄ່າ default ຂອງມັນກົດ save ໄດ້ເລີຍ

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8e5zvrernzaxnmroda3.png) 

ູ6/ ຕັ້ງຄ່າ SMS Geographic Permissions ເຊິ່ງຈະເປັນໂຕກຳນົດໂຊນປະເທດໃຫ້ເຮົາກັບໄປໜ້າ console ເລືອກ Vioce -> Settings -> Geo permissions ໃຫ້ເຮົາຄົ້ນຫາພິມຄຳວ່າ laos ມັນອອກມາໃຫ້ກໍຕິກເລືອກແລ້ວກົດ save ຖືວ່າສິ້ນສຸດການຕັ້ງຄ່າເທິ່ງ twilio 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ig75upvzd6breyhdlzs.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f9hbxz6dn7k4xzk2g3dz.png)

> ຂັ້ນຕອນການສ້າງ api ໃນ Go ກັນແລ້ວໄປລຸຍກັນ

---


1/ ໃຫ້ເຮົາໄປສ້າງໂປເຈັກເກັບໄວຢູ່ໃສກໍໄດ້ໂດຍເປີດ terminal ໃສ່ຄຳສັ່ງ 

```
mkdir go-otp && cd go-otp
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4sfpproyfszkvxls545p.png)

> ຕາມດ້ວຍການສ້າງ Go Modules ໂດຍໃສ່ຄຳສັ່ງ 

```
go mod init {module_name}
```

2/ ເຮົາຈະໃສ່ echo framework www.echo.labstack.com ໃຫ້ເຮົາສ້າງຊື່ file main.go ໄວ້ເປົ່າໆ ແລະ install echo ໂດຍໃສ່ຄຳສັ່ງ 

```
go get github.com/labstack/echo/v4 
```

> install twilio ໂດຍໃສ່ຄຳສັ່ງ 

```
go get github.com/twilio/twilio-go
```

3/ install library ສຳລັບ config environment variable.

```
go get github.com/joho/godotenv
```

> ສ້າງ file .env ໄວ້ໃນໂປເຈັກແລ້ວກຳນົດ key name config

```
TWILIO_ACCOUNT_SID=Your_accountSID
TWILIO_AUTH_TOKEN=Your_auth_Token
TWILIO_SERVICES_ID=Your_service_SID
```
ຸ4/ ສ້າງ service api ສົ່ງ sms OTP ກັນເລີຍ

```
package main

import (
	"context"
	"log"
	"net/http"
	"os"

	"github.com/joho/godotenv"
	"github.com/labstack/echo/v4"
	"github.com/twilio/twilio-go"

	twilioApi "github.com/twilio/twilio-go/rest/verify/v2"
)

func init() {
	if err := godotenv.Load(".env"); err != nil {
		log.Fatal("Error loading .env file")
	}
}

func main() {
	e := echo.New()

	// Routes sendOTP
	e.POST("/sendOTP", func(c echo.Context) error {
		var body struct {
			Phone string `json:"phone"`
		}
		if err := c.Bind(&body); err != nil {
			return c.JSON(http.StatusBadRequest, err)
		}

		sid, err := sendOTP(c.Request().Context(), body.Phone)
		if err != nil {
			return c.JSON(http.StatusInternalServerError, err)
		}

		return c.JSON(http.StatusOK, echo.Map{
			"sid": sid,
			"msg": "OTP sent successfully",
		})
	})

	e.Logger.Fatal(e.Start(":8080"))
}

// client is the Twilio client
var client *twilio.RestClient = twilio.NewRestClientWithParams(twilio.ClientParams{
	Username: os.Getenv("TWILIO_ACCOUNT_SID"),
	Password: os.Getenv("TWILIO_AUTH_TOKEN"),
})

// sendOTP sends OTP to the given phone number
func sendOTP(ctx context.Context, phone string) (string, error) {
	params := &twilioApi.CreateVerificationParams{}
	params.SetTo(phone)
	params.SetChannel("sms")

	resp, err := client.VerifyV2.CreateVerification(os.Getenv("TWILIO_SERVICE_ID"), params)
	if err != nil {
		return "", err
	}

	return *resp.Sid, nil
}


```

6/ ທົດສອບກັນໂດຍໃຊ້ insonia ຫລື ໃຜຈະໃຊ້ tools ໂຕອື່ນກະໄດ້ຄືກັນບໍ່ວ່າກັນ
localhost:8080/sendOTP ເບີໂທທີ່ສົ່ງໄປຈະຕ້ອງຂຶ້ນນຕົ້ນດ້ວຍ

```
{
	"phone": "+85620xxxx"
}
```



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d25n9j73foaflj9vszzo.png)

> ມັນຕອບກັບມາ status 200 ຖືວ່າສຳເລັດ

```
{
	"msg": "OTP sent successfully",
	"sid": "VE48ad8c7f47a15d9f4479d899305aaeef"
}
```

> ແລ້ວເຮົາຈະຮູ້ໄດ້ແນວໃດວ່າມັນໄດ້ສົ່ງ sms otp ໄປຫາເບີໂທເຮົາແທ້ໄປກວດກັນ

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3gptd4en0yutvn4s91q.jpg)

> ລືມບອກໄປວ່າໃນບົດຄວາມນີ້ເຮົາໃຊ້ account ຟີຣເຊິ່ງທາງ twilio ເຂົາຈະອະນຸຍາດໃຫ້ເຮົາໃຊ້ຟີຣປະມານໜຶ່ງເດືອນທີ່ສາມາດສົ່ງ sms ໄດ້ຖ້າເກີນໜຶ່ງເດືອນແມ່ນບໍ່ໄດ້ແລ້ວ ເຊິ່ງຂອງເຮົາກະໄດ້ໝົດອາຍຸຄືກັນ5555

> ກະເລີຍໄດ້ໃຊ້ key account ໂຕທີ່ສະໝັກເສຍເງິນເຮົາບໍ່ສາມາດເປີດໃຫ້ເຫັນ title sms ໄດ້
> ຖ້າໃຜທີ່ຍັງບໍ່ເຄີຍສະໝັກແລ້ວໄປສະໝັກແລ້ວເຮັດຕາມຂັ້ນຕອນຕັ້ງຄ່າຕາມທີ່ເຮົາບອກມາດ້ານເທິງແມ່ນສາມາດສົ່ງ sms ໄດ້ແນ່ນອນ

7/ ສ້າງ service api verify OTP

```
// Routes verifyOTP
	e.POST("/verifyOTP", func(c echo.Context) error {
		var body struct {
			Phone string `json:"phone"`
			Code  string `json:"code"`
		}
		if err := c.Bind(&body); err != nil {
			return c.JSON(http.StatusBadRequest, err)
		}

		if err := verifyOTP(c.Request().Context(), body.Phone, body.Code); err != nil {
			return c.JSON(http.StatusInternalServerError, err)
		}

		return c.JSON(http.StatusOK, echo.Map{
			"msg": "OTP verified successfully",
		})
	})

```

```
// verifyOTP verifies the given OTP
func verifyOTP(ctx context.Context, phone, code string) error {
	params := &twilioApi.CreateVerificationCheckParams{}
	params.SetTo(phone)
	params.SetCode(code)

	resp, err := client.VerifyV2.CreateVerificationCheck(os.Getenv("TWILIO_SERVICE_ID"), params)
	if err != nil {
		return err
	}
	if *resp.Status != "approved" {
		return errors.New("invalid code")
	}

	return nil
}
```
8/ ສຸດທ້າຍຂໍທ້າຍສຸດດ້ວຍການທົດສອບ verify otp 

```
{
	"phone": "+85620xxxx,
	"code": "143464"
}
```


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/39vd0uezbywssguth6mj.png)

> ມັນຕອບກັບມາ status 200 ສະແດງວ່າ verify ຖືກຕ້ອງເຢ້ໆ5555

```
{
	"msg": "OTP verified successfully"
}
```

> ມາຮອດນີ້ຖືວ່າໄດ້ສຳເລັດແລ້ວກັບການສ້າງ API ສົ່ງ SMS OTP ແລະ Verify ໂດຍໃຊ້ Twilio ໃນ Go ແບບງ່າຍໆ

> ຖ້າມີຂໍ້ຜິດພາດປະການໃດ ຫລື ມີສິ່ງໃດຢາກນຳແນະກໍແນະນຳໄດ້ເດີ້ ຜູ້ຂຽນເອງຫາກໍລອງໃຊ້

## ຈົດໄວ້ຢ້ານລືມ5555