Nội dung bài viết
Video học lập trình mỗi ngày
Thời gian chúng ta có hạn, hãy cố gắng đi con đường ngắn nhất và hiệu quả nhất...
Bài viết được cho phép xuất bản trên Con đường BACKEND của BIGTECH
Hiện tại chúng ta đang đi đến phần Verify OTP
nhưng hiện tại bạn đang ở vị trí BE và là một người lập trình viên có trách nhiệm thì cố gắng lưu ý những điểm sau.
Hoàn cảnh nhiệm vụ
Nếu hệ thống của bạn đang có chức năng Send OTP to SMS or EMAIL thì nên cố gắng handler những 7 điểm lưu ý sau, ở đây chúng ta sẽ triển khai tất cả nhưng điểm trên.
Tham số VerifyOTP
Request Parameters:
Field | Type | Required | Description |
---|---|---|---|
VerifyKey | string | Required | User token |
VerifyCode | string | Required | User otp |
Response Content:
{
"code": "200",
"msg": "OK",
"result": {
"token": "string, secret",
"userId": xxx,
"message": "verify success"
}
}
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 - Register và User
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.
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
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.
// 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
> 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