api_auth_otp.md 7.5 KB

EsimLao Authentication API Documentation

Overview

API xác thực người dùng qua email với OTP (One-Time Password).


1. Request OTP

Gửi mã OTP đến email người dùng để xác thực đăng nhập.

Endpoint

POST /apis/auth/request-otp

Request Headers

Header Value Required
Content-Type application/json Yes

Request Body

{
    "email": "user@example.com",
    "lang": "vi"
}

Parameters

Field Type Required Default Description
email string Yes - Email address của người dùng
lang string No "vi" Ngôn ngữ email: vi (Tiếng Việt), en (English), lo (ລາວ)

Response Success (200)

{
    "code": 0,
    "message": "OTP sent successfully",
    "data": {
        "email": "user@example.com",
        "expireInSeconds": 300
    }
}

Response Error (200)

{
    "code": 1,
    "message": "Email is required",
    "data": {}
}

Response Fields

Field Type Description
code int 0 = Success, khác 0 = Error
message string Thông báo kết quả
data.email string Email đã gửi OTP
data.expireInSeconds int Thời gian OTP hết hạn (giây)

Notes

  • OTP gồm 6 chữ số
  • OTP có hiệu lực trong 5 phút
  • Mỗi lần request mới sẽ hủy các OTP cũ chưa sử dụng
  • Nếu email chưa tồn tại, hệ thống tự động tạo tài khoản mới

2. Verify OTP

Xác thực mã OTP và hoàn tất đăng nhập.

Endpoint

POST /apis/auth/verify-otp

Request Headers

Header Value Required
Content-Type application/json Yes

Request Body

{
    "email": "user@example.com",
    "otpCode": "123456"
}

Parameters

Field Type Required Description
email string Yes Email đã nhận OTP
otpCode string Yes Mã OTP 6 số

Response Success (200)

{
    "code": 0,
    "message": "Login successful",
    "data": {
        "userId": 12345,
        "email": "user@example.com",
        "fullName": "Nguyen Van A",
        "avatarUrl": "https://example.com/avatar.jpg",
        "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
        "refreshToken": "dGhpcyBpcyBhIHJlZnJlc2ggdG9rZW4...",
        "expiresAt": "2024-12-30T10:00:00Z"
    }
}

Response Error Cases

// OTP không hợp lệ
{
    "code": 1,
    "message": "Invalid OTP",
    "data": {}
}

// OTP đã được sử dụng
{
    "code": 1,
    "message": "OTP has already been used",
    "data": {}
}

// OTP đã hết hạn
{
    "code": 1,
    "message": "OTP has expired",
    "data": {}
}

Response Fields

Field Type Description
code int 0 = Success, khác 0 = Error
message string Thông báo kết quả
data.userId int ID người dùng
data.email string Email người dùng
data.fullName string Họ tên đầy đủ
data.avatarUrl string URL ảnh đại diện (nullable)
data.accessToken string JWT access token
data.refreshToken string Refresh token để làm mới access token
data.expiresAt datetime Thời điểm access token hết hạn

Notes

  • Access token có hiệu lực 24 giờ
  • Refresh token có hiệu lực 30 ngày
  • Mỗi lần đăng nhập thành công, các token cũ sẽ bị thu hồi

Error Codes

Success

Code Constant Description
0 Success Thành công (mọi request thành công đều trả về 0)

General Errors (-1 to -99)

Code Constant Description
-1 Error Lỗi chung
-6 SystemError Lỗi hệ thống

OTP Errors (-200 to -299)

Code Constant Description
-200 OtpRequired Yêu cầu OTP
-201 OtpInvalid OTP không hợp lệ
-202 OtpExpired OTP đã hết hạn
-203 OtpAlreadyUsed OTP đã được sử dụng
-204 OtpMaxAttemptsExceeded Vượt quá số lần thử
-205 OtpSendFailed Gửi OTP thất bại
-206 OtpTooManyRequests Request quá nhiều

User Errors (-300 to -399)

Code Constant Description
-300 UserNotFound Không tìm thấy người dùng
-304 InvalidEmail Email không hợp lệ

Validation Errors (-800 to -899)

Code Constant Description
-801 RequiredFieldMissing Thiếu trường bắt buộc

Authentication

Sau khi đăng nhập thành công, sử dụng accessToken trong header cho các API yêu cầu xác thực:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Flow Diagram

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Client    │     │   API       │     │   Email     │
└──────┬──────┘     └──────┬──────┘     └──────┬──────┘
       │                   │                   │
       │ POST /request-otp │                   │
       │──────────────────>│                   │
       │                   │                   │
       │                   │ Generate OTP      │
       │                   │ Save to DB        │
       │                   │ Queue Email       │
       │                   │                   │
       │    Response       │                   │
       │<──────────────────│                   │
       │                   │                   │
       │                   │  Send OTP Email   │
       │                   │──────────────────>│
       │                   │                   │
       │                   │                   │ OTP Email
       │<──────────────────────────────────────│
       │                   │                   │
       │ POST /verify-otp  │                   │
       │──────────────────>│                   │
       │                   │                   │
       │                   │ Verify OTP        │
       │                   │ Generate JWT      │
       │                   │                   │
       │ Token Response    │                   │
       │<──────────────────│                   │
       │                   │                   │

Example Usage (cURL)

Request OTP

curl -X POST https://api.esimlao.com/apis/auth/request-otp \
  -H "Content-Type: application/json" \
  -d '{
    "email": "user@example.com",
    "lang": "vi"
  }'

Verify OTP

curl -X POST https://api.esimlao.com/apis/auth/verify-otp \
  -H "Content-Type: application/json" \
  -d '{
    "email": "user@example.com",
    "otpCode": "123456"
  }'

Use Token

curl -X GET https://api.esimlao.com/apis/user/profile \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."