Skip to content

Go 31 - [User Login Interface] Implementation Verification OTP

Sau khi chúng ta triển khai thực hiện chức năng Go 29: Implement IUserLogin - RegisterUser sẽ nhận được OTP được gửi qua EMAIL or SMS đã đăng ký. Sau nó nếu User nhập OTP vào bước tiếp theo thì hãy bắt đầu active account cho User. Và đây chính là mô hình như sau, với nhiều bước cải thiện hệ thống so với trước kia.

Sơ đồ xác thực OTP khi user đăng ký

Dành cho các bạn ít thời gian: FULL CODE: GO 31: Phương pháp VerifyOTP() khi User ĐĂNG KÝ thành công

Tham số VerifyOTP

Request Parameters:

FieldTypeRequiredDescription
VerifyKeystringRequiredUser token
VerifyCodestringRequiredUser otp

Response Content:

json
{
    "code": "200",
    "msg": "OK",
    "result": {
        "token": "string, secret",
        "userId": xxx,
        "message": "verify success"
    }
}

Xác thực OTP khi user đăng ký - Quy trình thực hiện

Step1: Trước tiên phải hashKey tài khoản và tìm kiếm trong Redis, vì chúng ta add OTP vào redis ở video trước.

go

// Bước 1: hashKey
	hashKey := crypto.GetHash(strings.ToLower(in.VerifyKey))

	// Bước 2: get otp đã lưu ở video trước với mã hoá
	otpFound, err := global.Rdb.Get(ctx, utils.GetUserKey(hashKey)).Result()
	if err != nil {
		return out, err
	}
    // Bước 3: Nếu như otp user nhập vào không đúng với otp lưu trữ
	if in.VerifyCode != otpFound {
		// Neu nhu ma sai 3 lan trong vong 1 phut - video

		return out, fmt.Errorf("OTP not match")
	}
    // Bước 4: Cẩn thận hơn hãy check trong DBS và kết hợp Redis càng tốt
	infoOTP, err := s.r.GetInfoOTP(ctx, hashKey)

	// Bước 5: Bước quan trọng, nếu như YES thì cố gắng update isVerified = 1
	err = s.r.UpdateUserVerificationStatus(ctx, hashKey)
	// output
	out.Token = tokenSecret // token temp
	out.Message = "success"

	return out, err

Run Code

bash

> make docker_up

> makedev

Lưu ý về VerifyOTP

Trong quá trình phát triển chức năng, chúng ta nhận thấy, việc mã hoá OTP và VerifyKey là một việc hết sức quan trọng, và việc thứ hai cố gắng hanler limit vì user có thể spam otp để dò xem có đúng hay không? Do đó, cố gắng hạn ché điều này. Viếc sử dụng redis cũng là một sức mạnh cho phép chúng ta chống chọi với SPAM và bảo hệ tầng database. Nhưng phải kèm theo đó là chức năng rate_limit 3 tier mà sắp tới chúng ta sẽ được học về điều này. Nhưng trước mắt, nếu bạn là một lập trình viên có trách nhiệm với hệ thống thì nên lưu ý những điểm sau:

  • Thời hạn của OTP: OTP nên có thời hạn ngắn, ví dụ 5 phút, để giảm rủi ro bị đánh cắp hoặc lạm dụng.

  • Số lần thử sai giới hạn: Giới hạn số lần nhập sai OTP, thường từ 3 đến 5 lần, để ngăn việc đoán mã.

  • OTP ngẫu nhiên và không dễ đoán: Đảm bảo OTP là chuỗi ngẫu nhiên, không theo mẫu để tránh việc đoán được mã.

  • Kiểm soát OTP theo phiên làm việc: OTP phải chỉ áp dụng cho phiên giao dịch hiện tại, không thể tái sử dụng cho các giao dịch khác.

  • Gửi OTP qua kênh bảo mật: Đảm bảo rằng hệ thống SMS không dễ bị xâm nhập hoặc bị chặn tin nhắn. Sử dụng nhà cung cấp dịch vụ SMS đáng tin cậy.

  • Thông báo rõ ràng cho người dùng: Tin nhắn OTP cần có hướng dẫn ngắn gọn, thông báo rõ thời gian hết hạn, và cảnh báo nếu người dùng không yêu cầu OTP.

  • Xác thực hai lớp (2FA): OTP nên là một phần của 2FA để tăng cường bảo mật.

  • Theo dõi và ghi log: Ghi lại các lần gửi OTP và các lần đăng nhập để phát hiện sớm các hoạt động đáng ngờ.

  • Bảo mật thông tin cá nhân: Không gửi thông tin nhạy cảm khác (như tài khoản, mật khẩu) cùng với OTP trong tin nhắn.

  • Tránh sử dụng số điện thoại tạm thời: Nếu có thể, xác minh số điện thoại của người dùng trước khi gửi OTP để tránh việc sử dụng số điện thoại giả hoặc tạm thời.

Xem video FULL để hiểu rõ hơn tại: GO 31: Phương pháp VerifyOTP() khi User ĐĂNG KÝ thành công

Released under the MIT License.