[ Better ] Chức năng xác thực cho bảng user và 2 chức năng login và logout

Avatar admin | June 27, 2024

Chức năng xác thực và cách sử dụng bảng user xây dựng chức năng authentication từ một sơ đồ thực thể quan hệ (ERD), bạn cần bao gồm một bảng user cơ bản.
Dưới đây là một ví dụ về cấu trúc bảng user đơn giản:

Chức năng xác thực cho bảng user và 2 chức năng login và logout
Chức năng xác thực cho bảng user và 2 chức năng login và logout

Bảng User

Trường Kiểu dữ liệu Mô tả
id INT Khóa chính duy nhất của người dùng
username VARCHAR(n) Tên đăng nhập của người dùng
password_hash VARCHAR(n) Băm mật khẩu của người dùng
email VARCHAR(n) Địa chỉ email của người dùng
full_name VARCHAR(n) Họ và tên đầy đủ của người dùng
created_at TIMESTAMP Thời điểm tạo tài khoản
updated_at TIMESTAMP Thời điểm cập nhật thông tin

Trong bảng này:

  • id: Là khóa chính của bảng, đại diện cho mỗi người dùng một cách duy nhất.
  • username: Tên đăng nhập của người dùng, được sử dụng để đăng nhập vào hệ thống.
  • password_hash: Một phiên bản băm (hash) của mật khẩu người dùng, để bảo mật thông tin mật khẩu.
  • email: Địa chỉ email của người dùng, có thể dùng để liên lạc hoặc khôi phục tài khoản.
  • full_name: Họ và tên đầy đủ của người dùng.
  • created_at: Thời điểm tài khoản được tạo ra.
  • updated_at: Thời điểm cập nhật thông tin người dùng lần cuối.

Cấu trúc này có thể được mở rộng thêm tùy theo yêu cầu cụ thể của hệ thống authentication và các tính năng liên quan.
Bảng user là một phần quan trọng trong việc xây dựng chức năng authentication để lưu trữ và quản lý thông tin người dùng một cách an toàn và hiệu quả.

Để mở rộng thêm chức năng authentication và bao gồm các yêu cầu như token, số lần đăng nhập, và các tính năng như quên mật khẩu và refresh token, bạn có thể điều chỉnh bảng user như sau:

Bảng User

Trường Kiểu dữ liệu Mô tả
id INT Khóa chính duy nhất của người dùng
username VARCHAR(n) Tên đăng nhập của người dùng
password_hash VARCHAR(n) Băm mật khẩu của người dùng
email VARCHAR(n) Địa chỉ email của người dùng
full_name VARCHAR(n) Họ và tên đầy đủ của người dùng
created_at TIMESTAMP Thời điểm tạo tài khoản
updated_at TIMESTAMP Thời điểm cập nhật thông tin người dùng
login_attempts INT Số lần đăng nhập sai
token VARCHAR(n) Token đăng nhập của người dùng
token_expiry TIMESTAMP Thời điểm hết hạn của token đăng nhập
refresh_token VARCHAR(n) Refresh token để làm mới token đăng nhập
refresh_token_expiry TIMESTAMP Thời điểm hết hạn của refresh token
reset_password_token VARCHAR(n) Token để đặt lại mật khẩu khi người dùng quên
reset_token_expiry TIMESTAMP Thời điểm hết hạn của token đặt lại mật khẩu

Mô tả các trường mới:

  • login_attempts: Số lần người dùng đã đăng nhập sai.
    Có thể sử dụng để áp dụng các biện pháp bảo mật như tạm thời khóa tài khoản sau một số lần thử không thành công.
  • token: Token được cấp cho người dùng sau khi xác thực thành công để xác định danh tính trong các yêu cầu sau này.
  • token_expiry: Thời điểm khi token đăng nhập hết hạn.
    Sau thời gian này, người dùng sẽ cần phải xác thực lại.
  • refresh_token: Refresh token được sử dụng để tái tạo (refresh) token đăng nhập khi token chính hết hạn mà không cần phải yêu cầu người dùng đăng nhập lại.
  • refresh_token_expiry: Thời điểm khi refresh token hết hạn.
  • reset_password_token: Token dùng để đặt lại mật khẩu khi người dùng quên mật khẩu.
  • reset_token_expiry: Thời điểm hết hạn của token để đặt lại mật khẩu.

login_attempts: Số lần người dùng đã đăng nhập sai.
Có thể sử dụng để áp dụng các biện pháp bảo mật như tạm thời khóa tài khoản sau một số lần thử không thành công.

token: Token được cấp cho người dùng sau khi xác thực thành công để xác định danh tính trong các yêu cầu sau này.

token_expiry: Thời điểm khi token đăng nhập hết hạn.
Sau thời gian này, người dùng sẽ cần phải xác thực lại.

refresh_token: Refresh token được sử dụng để tái tạo (refresh) token đăng nhập khi token chính hết hạn mà không cần phải yêu cầu người dùng đăng nhập lại.

refresh_token_expiry: Thời điểm khi refresh token hết hạn.

reset_password_token: Token dùng để đặt lại mật khẩu khi người dùng quên mật khẩu.

reset_token_expiry: Thời điểm hết hạn của token để đặt lại mật khẩu.

Lưu ý chức năng xác thực có token:

  • Các trường như token, refresh_token, và reset_password_token thường có thể là các chuỗi ngẫu nhiên được tạo ra và lưu trữ trong cơ sở dữ liệu để xác định và quản lý quyền truy cập của người dùng.
  • Các trường token_expiry, refresh_token_expiry, và reset_token_expiry giúp quản lý thời gian hiệu lực của các token để đảm bảo tính bảo mật và tránh lạm dụng.
  • Điều chỉnh các trường này phải đi kèm với các phần mềm xử lý logic để quản lý và cập nhật thông tin một cách an toàn và hiệu quả.

Các trường như token, refresh_token, và reset_password_token thường có thể là các chuỗi ngẫu nhiên được tạo ra và lưu trữ trong cơ sở dữ liệu để xác định và quản lý quyền truy cập của người dùng.

Các trường token_expiry, refresh_token_expiry, và reset_token_expiry giúp quản lý thời gian hiệu lực của các token để đảm bảo tính bảo mật và tránh lạm dụng.

Chức năng xác thực cho bảng user và 2 chức năng login và logout
Chức năng xác thực cho bảng user và 2 chức năng login và logout

Điều chỉnh các trường này phải đi kèm với các phần mềm xử lý logic để quản lý và cập nhật thông tin một cách an toàn và hiệu quả.

Để xây dựng chức năng authentication hoàn chỉnh trong một ứng dụng web hoặc dịch vụ, bạn cần cung cấp một số route cơ bản để quản lý người dùng và xác thực.
Dưới đây là một danh sách gồm 10 route cần có:

  1. POST /api/auth/register: Đăng ký người dùng mới.Body request: username, password, email, full_name (các thông tin cần thiết cho việc đăng ký).
  2. Body request: username, password, email, full_name (các thông tin cần thiết cho việc đăng ký).
  3. POST /api/auth/login: Đăng nhập người dùng.Body request: username, password.Trả về: Token đăng nhập và các thông tin người dùng (ví dụ: id, username).
  4. Body request: username, password.
  5. Trả về: Token đăng nhập và các thông tin người dùng (ví dụ: id, username).
  6. POST /api/auth/logout: Đăng xuất người dùng.Header: Authorization Bearer token.Cập nhật dữ liệu liên quan (ví dụ: xóa refresh token).
  7. Header: Authorization Bearer token.
  8. Cập nhật dữ liệu liên quan (ví dụ: xóa refresh token).
  9. POST /api/auth/refresh: Làm mới token đăng nhập.Body request: refresh_token.Trả về: Token mới nếu refresh_token hợp lệ.
  10. Body request: refresh_token.
  11. Trả về: Token mới nếu refresh_token hợp lệ.
  12. POST /api/auth/forgot-password: Yêu cầu đặt lại mật khẩu.Body request: email.Tạo và gửi email chứa token để đặt lại mật khẩu.
  13. Body request: email.
  14. Tạo và gửi email chứa token để đặt lại mật khẩu.
  15. POST /api/auth/reset-password: Đặt lại mật khẩu mới sau khi quên mật khẩu.Body request: reset_password_token, new_password.Cập nhật mật khẩu mới của người dùng.
  16. Body request: reset_password_token, new_password.
  17. Cập nhật mật khẩu mới của người dùng.
  18. GET /api/users/: Lấy thông tin người dùng theo ID.Header: Authorization Bearer token.Trả về: Thông tin chi tiết của người dùng (ví dụ: id, username, email, full_name).
  19. Header: Authorization Bearer token.
  20. Trả về: Thông tin chi tiết của người dùng (ví dụ: id, username, email, full_name).
  21. PUT /api/users/: Cập nhật thông tin người dùng.Header: Authorization Bearer token.Body request: Các thông tin cần cập nhật (ví dụ: email, full_name).
  22. Header: Authorization Bearer token.
  23. Body request: Các thông tin cần cập nhật (ví dụ: email, full_name).
  24. DELETE /api/users/: Xóa người dùng.Header: Authorization Bearer token.Xóa tài khoản người dùng và dữ liệu liên quan.
  25. Header: Authorization Bearer token.
  26. Xóa tài khoản người dùng và dữ liệu liên quan.
  27. GET /api/users: Lấy danh sách tất cả người dùng (admin route).Header: Authorization Bearer token của admin.Trả về: Danh sách các người dùng trong hệ thống.
  28. Header: Authorization Bearer token của admin.
  29. Trả về: Danh sách các người dùng trong hệ thống.

POST /api/auth/register: Đăng ký người dùng mới.

  • Body request: username, password, email, full_name (các thông tin cần thiết cho việc đăng ký).

POST /api/auth/login: Đăng nhập người dùng.

  • Body request: username, password.
  • Trả về: Token đăng nhập và các thông tin người dùng (ví dụ: id, username).

POST /api/auth/logout: Đăng xuất người dùng.

  • Header: Authorization Bearer token.
  • Cập nhật dữ liệu liên quan (ví dụ: xóa refresh token).

POST /api/auth/refresh: Làm mới token đăng nhập.

  • Body request: refresh_token.
  • Trả về: Token mới nếu refresh_token hợp lệ.

POST /api/auth/forgot-password: Yêu cầu đặt lại mật khẩu.

  • Body request: email.
  • Tạo và gửi email chứa token để đặt lại mật khẩu.

POST /api/auth/reset-password: Đặt lại mật khẩu mới sau khi quên mật khẩu.

  • Body request: reset_password_token, new_password.
  • Cập nhật mật khẩu mới của người dùng.

GET /api/users/: Lấy thông tin người dùng theo ID.

  • Header: Authorization Bearer token.
  • Trả về: Thông tin chi tiết của người dùng (ví dụ: id, username, email, full_name).

PUT /api/users/: Cập nhật thông tin người dùng.

  • Header: Authorization Bearer token.
  • Body request: Các thông tin cần cập nhật (ví dụ: email, full_name).

DELETE /api/users/: Xóa người dùng.

  • Header: Authorization Bearer token.
  • Xóa tài khoản người dùng và dữ liệu liên quan.

GET /api/users: Lấy danh sách tất cả người dùng (admin route).

  • Header: Authorization Bearer token của admin.
  • Trả về: Danh sách các người dùng trong hệ thống.

Đây là một số route cơ bản để quản lý người dùng và xác thực trong một hệ thống.
Bạn có thể điều chỉnh và mở rộng các route này tùy thuộc vào yêu cầu cụ thể của ứng dụng của bạn, ví dụ như thêm các route để quản lý vai trò (roles), quản lý phiên đăng nhập (sessions), hoặc các tính năng khác liên quan đến bảo mật và quản lý người dùng.

Dưới đây là một bổ sung chi tiết về payload và params cho từng route mà bạn có thể cần trong hệ thống xác thực và quản lý người dùng:

  1. POST /api/auth/registerPayload:
    {
      "username": "string",
      "password": "string",
      "email": "string",
      "full_name": "string"
    }
    
  2. Payload:
    {
      "username": "string",
      "password": "string",
      "email": "string",
      "full_name": "string"
    }
    
  3. POST /api/auth/loginPayload:
    {
      "username": "string",
      "password": "string"
    }
    
  4. Payload:
    {
      "username": "string",
      "password": "string"
    }
    
  5. POST /api/auth/logoutNo Payload: Header Authorization Bearer token.
  6. No Payload: Header Authorization Bearer token.
  7. POST /api/auth/refreshPayload:
    {
      "refresh_token": "string"
    }
    
  8. Payload:
    {
      "refresh_token": "string"
    }
    
  9. POST /api/auth/forgot-passwordPayload:
    {
      "email": "string"
    }
    
  10. Payload:
    {
      "email": "string"
    }
    
  11. POST /api/auth/reset-passwordPayload:
    {
      "reset_password_token": "string",
      "new_password": "string"
    }
    
  12. Payload:
    {
      "reset_password_token": "string",
      "new_password": "string"
    }
    
  13. GET /api/users/No Payload: Header Authorization Bearer token.Params:
    id: ID của người dùng (integer)
    
  14. No Payload: Header Authorization Bearer token.
  15. Params:
    id: ID của người dùng (integer)
    
  16. PUT /api/users/Payload:
    {
      "email": "string",
      "full_name": "string"
    }
    
    Header: Authorization Bearer token.Params:
    id: ID của người dùng (integer)
    
  17. Payload:
    {
      "email": "string",
      "full_name": "string"
    }
    
  18. Header: Authorization Bearer token.
  19. Params:
    id: ID của người dùng (integer)
    
  20. DELETE /api/users/No Payload: Header Authorization Bearer token.Params:
    id: ID của người dùng (integer)
    
  21. No Payload: Header Authorization Bearer token.
  22. Params:
    id: ID của người dùng (integer)
    
  23. GET /api/usersNo Payload: Header Authorization Bearer token của admin.No Params
  24. No Payload: Header Authorization Bearer token của admin.
  25. No Params

POST /api/auth/register

  • Payload:
    {
      "username": "string",
      "password": "string",
      "email": "string",
      "full_name": "string"
    }
    
{
  "username": "string",
  "password": "string",
  "email": "string",
  "full_name": "string"
}

POST /api/auth/login

  • Payload:
    {
      "username": "string",
      "password": "string"
    }
    
{
  "username": "string",
  "password": "string"
}

POST /api/auth/logout

  • No Payload: Header Authorization Bearer token.

POST /api/auth/refresh

  • Payload:
    {
      "refresh_token": "string"
    }
    
{
  "refresh_token": "string"
}

POST /api/auth/forgot-password

  • Payload:
    {
      "email": "string"
    }
    
{
  "email": "string"
}

POST /api/auth/reset-password

  • Payload:
    {
      "reset_password_token": "string",
      "new_password": "string"
    }
    
{
  "reset_password_token": "string",
  "new_password": "string"
}

GET /api/users/

  • No Payload: Header Authorization Bearer token.
  • Params:
    id: ID của người dùng (integer)
    
id: ID của người dùng (integer)

PUT /api/users/

  • Payload:
    {
      "email": "string",
      "full_name": "string"
    }
    
  • Header: Authorization Bearer token.
  • Params:
    id: ID của người dùng (integer)
    
{
  "email": "string",
  "full_name": "string"
}
id: ID của người dùng (integer)

DELETE /api/users/

  • No Payload: Header Authorization Bearer token.
  • Params:
    id: ID của người dùng (integer)
    
id: ID của người dùng (integer)

GET /api/users

  • No Payload: Header Authorization Bearer token của admin.
  • No Params

Giải thích:

  • Payload: Là dữ liệu được gửi từ client lên server thông qua phần body của request.
    Payload thường chứa các thông tin như username, password, email, etc.
  • Params: Là các tham số dùng để xác định và xử lý các tài nguyên cụ thể trên server.
    Params có thể là ID của người dùng hoặc các tham số khác cần thiết cho việc xác định tài nguyên mà request đang tương tác.
  • Header Authorization Bearer token: Được sử dụng để xác thực và xác định người dùng đã đăng nhập.
    Token này thường được gửi trong phần header của request.
  • No Payload: Các route không yêu cầu dữ liệu từ client sẽ không có payload.

Payload: Là dữ liệu được gửi từ client lên server thông qua phần body của request.
Payload thường chứa các thông tin như username, password, email, etc.

Params: Là các tham số dùng để xác định và xử lý các tài nguyên cụ thể trên server.
Params có thể là ID của người dùng hoặc các tham số khác cần thiết cho việc xác định tài nguyên mà request đang tương tác.

Header Authorization Bearer token: Được sử dụng để xác thực và xác định người dùng đã đăng nhập.
Token này thường được gửi trong phần header của request.

No Payload: Các route không yêu cầu dữ liệu từ client sẽ không có payload.

Qua các thông tin này, bạn có thể hiểu rõ hơn về cách mà các route được cấu trúc và sử dụng trong việc quản lý và xác thực người dùng trong một ứng dụng hoặc dịch vụ web.

Dưới đây là một ví dụ về JSON mẫu trả về cho mỗi route trong hệ thống xác thực và quản lý người dùng:

  1. POST /api/auth/registerMẫu trả về thành công (HTTP status code 201):
    {
      "message": "User registered successfully"
    }
    
  2. Mẫu trả về thành công (HTTP status code 201):
    {
      "message": "User registered successfully"
    }
    
  3. POST /api/auth/loginMẫu trả về thành công (HTTP status code 200):
    {
      "user": {
        "id": 1,
        "username": "example_user",
        "email": "[email protected]",
        "full_name": "John Doe"
      },
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
  4. Mẫu trả về thành công (HTTP status code 200):
    {
      "user": {
        "id": 1,
        "username": "example_user",
        "email": "[email protected]",
        "full_name": "John Doe"
      },
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
  5. POST /api/auth/logoutMẫu trả về thành công (HTTP status code 200):
    {
      "message": "User logged out successfully"
    }
    
  6. Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User logged out successfully"
    }
    
  7. POST /api/auth/refreshMẫu trả về thành công (HTTP status code 200):
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
  8. Mẫu trả về thành công (HTTP status code 200):
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
  9. POST /api/auth/forgot-passwordMẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset email sent successfully"
    }
    
  10. Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset email sent successfully"
    }
    
  11. POST /api/auth/reset-passwordMẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset successfully"
    }
    
  12. Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset successfully"
    }
    
  13. GET /api/users/Mẫu trả về thành công (HTTP status code 200):
    {
      "id": 1,
      "username": "example_user",
      "email": "[email protected]",
      "full_name": "John Doe",
      "created_at": "2024-06-23T10:00:00Z",
      "updated_at": "2024-06-23T10:30:00Z"
    }
    
  14. Mẫu trả về thành công (HTTP status code 200):
    {
      "id": 1,
      "username": "example_user",
      "email": "[email protected]",
      "full_name": "John Doe",
      "created_at": "2024-06-23T10:00:00Z",
      "updated_at": "2024-06-23T10:30:00Z"
    }
    
  15. PUT /api/users/Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User updated successfully"
    }
    
  16. Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User updated successfully"
    }
    
  17. DELETE /api/users/Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User deleted successfully"
    }
    
  18. Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User deleted successfully"
    }
    
  19. GET /api/usersMẫu trả về thành công (HTTP status code 200):
    {
      "users": [
        {
          "id": 1,
          "username": "example_user",
          "email": "[email protected]",
          "full_name": "John Doe",
          "created_at": "2024-06-23T10:00:00Z",
          "updated_at": "2024-06-23T10:30:00Z"
        },
        {
          "id": 2,
          "username": "another_user",
          "email": "[email protected]",
          "full_name": "Jane Doe",
          "created_at": "2024-06-23T11:00:00Z",
          "updated_at": "2024-06-23T11:30:00Z"
        }
      ]
    }
    
  20. Mẫu trả về thành công (HTTP status code 200):
    {
      "users": [
        {
          "id": 1,
          "username": "example_user",
          "email": "[email protected]",
          "full_name": "John Doe",
          "created_at": "2024-06-23T10:00:00Z",
          "updated_at": "2024-06-23T10:30:00Z"
        },
        {
          "id": 2,
          "username": "another_user",
          "email": "[email protected]",
          "full_name": "Jane Doe",
          "created_at": "2024-06-23T11:00:00Z",
          "updated_at": "2024-06-23T11:30:00Z"
        }
      ]
    }
    

POST /api/auth/register

  • Mẫu trả về thành công (HTTP status code 201):
    {
      "message": "User registered successfully"
    }
    
{
  "message": "User registered successfully"
}

POST /api/auth/login

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "user": {
        "id": 1,
        "username": "example_user",
        "email": "[email protected]",
        "full_name": "John Doe"
      },
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
{
  "user": {
    "id": 1,
    "username": "example_user",
    "email": "[email protected]",
    "full_name": "John Doe"
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_expiry": "2024-06-23T12:00:00Z"
}

POST /api/auth/logout

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User logged out successfully"
    }
    
{
  "message": "User logged out successfully"
}

POST /api/auth/refresh

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
      "token_expiry": "2024-06-23T12:00:00Z"
    }
    
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_expiry": "2024-06-23T12:00:00Z"
}

POST /api/auth/forgot-password

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset email sent successfully"
    }
    
{
  "message": "Password reset email sent successfully"
}

POST /api/auth/reset-password

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "Password reset successfully"
    }
    
{
  "message": "Password reset successfully"
}

GET /api/users/

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "id": 1,
      "username": "example_user",
      "email": "[email protected]",
      "full_name": "John Doe",
      "created_at": "2024-06-23T10:00:00Z",
      "updated_at": "2024-06-23T10:30:00Z"
    }
    
{
  "id": 1,
  "username": "example_user",
  "email": "[email protected]",
  "full_name": "John Doe",
  "created_at": "2024-06-23T10:00:00Z",
  "updated_at": "2024-06-23T10:30:00Z"
}

PUT /api/users/

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User updated successfully"
    }
    
{
  "message": "User updated successfully"
}

DELETE /api/users/

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "message": "User deleted successfully"
    }
    
{
  "message": "User deleted successfully"
}

GET /api/users

  • Mẫu trả về thành công (HTTP status code 200):
    {
      "users": [
        {
          "id": 1,
          "username": "example_user",
          "email": "[email protected]",
          "full_name": "John Doe",
          "created_at": "2024-06-23T10:00:00Z",
          "updated_at": "2024-06-23T10:30:00Z"
        },
        {
          "id": 2,
          "username": "another_user",
          "email": "[email protected]",
          "full_name": "Jane Doe",
          "created_at": "2024-06-23T11:00:00Z",
          "updated_at": "2024-06-23T11:30:00Z"
        }
      ]
    }
    
{
  "users": [
    {
      "id": 1,
      "username": "example_user",
      "email": "[email protected]",
      "full_name": "John Doe",
      "created_at": "2024-06-23T10:00:00Z",
      "updated_at": "2024-06-23T10:30:00Z"
    },
    {
      "id": 2,
      "username": "another_user",
      "email": "[email protected]",
      "full_name": "Jane Doe",
      "created_at": "2024-06-23T11:00:00Z",
      "updated_at": "2024-06-23T11:30:00Z"
    }
  ]
}

Giải thích:

  • Mỗi ví dụ JSON trả về cho các route khác nhau phản ánh các thông tin quan trọng hoặc kết quả của hoạt động.
  • Mỗi object JSON bao gồm các trường dữ liệu thường được trả về, chẳng hạn như id, username, email, full_name, created_at, updated_at.
  • Các message như “User registered successfully”, “User updated successfully”, “Password reset successfully” là các thông báo mô tả kết quả của hành động được thực hiện.
  • Các route cũng có thể có các mã lỗi và thông báo tương ứng khi xảy ra lỗi, ví dụ như Unauthorized, Bad Request, hoặc Internal Server Error, nhưng ở đây chỉ trình bày mẫu trả về thành công.

Mỗi ví dụ JSON trả về cho các route khác nhau phản ánh các thông tin quan trọng hoặc kết quả của hoạt động.

Mỗi object JSON bao gồm các trường dữ liệu thường được trả về, chẳng hạn như id, username, email, full_name, created_at, updated_at.

Các message như “User registered successfully”, “User updated successfully”, “Password reset successfully” là các thông báo mô tả kết quả của hành động được thực hiện.

Các route cũng có thể có các mã lỗi và thông báo tương ứng khi xảy ra lỗi, ví dụ như Unauthorized, Bad Request, hoặc Internal Server Error, nhưng ở đây chỉ trình bày mẫu trả về thành công.

Thông tin này giúp bạn hiểu rõ hơn về cách dữ liệu được trả về từ server cho client sau mỗi lần gọi API, phục vụ cho việc phát triển ứng dụng hoặc dịch vụ web.

Dưới đây là một số ví dụ về các thông báo lỗi có thể xảy ra và mã lỗi tương ứng cho từng route trong hệ thống xác thực và quản lý người dùng:

  1. POST /api/auth/registerCác lỗi có thể xảy ra:Username đã tồn tại.Email đã được sử dụng bởi một tài khoản khác.Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).Mã lỗi HTTP:400 Bad Request: Dữ liệu đầu vào không hợp lệ.409 Conflict: Username hoặc Email đã tồn tại.
  2. Các lỗi có thể xảy ra:Username đã tồn tại.Email đã được sử dụng bởi một tài khoản khác.Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).
  3. Username đã tồn tại.
  4. Email đã được sử dụng bởi một tài khoản khác.
  5. Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).
  6. Mã lỗi HTTP:400 Bad Request: Dữ liệu đầu vào không hợp lệ.409 Conflict: Username hoặc Email đã tồn tại.
  7. 400 Bad Request: Dữ liệu đầu vào không hợp lệ.
  8. 409 Conflict: Username hoặc Email đã tồn tại.
  9. POST /api/auth/loginCác lỗi có thể xảy ra:Sai tên đăng nhập hoặc mật khẩu.Mã lỗi HTTP:401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.
  10. Các lỗi có thể xảy ra:Sai tên đăng nhập hoặc mật khẩu.
  11. Sai tên đăng nhập hoặc mật khẩu.
  12. Mã lỗi HTTP:401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.
  13. 401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.
  14. POST /api/auth/logoutCác lỗi có thể xảy ra:Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).Mã lỗi HTTP:401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.
  15. Các lỗi có thể xảy ra:Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).
  16. Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).
  17. Mã lỗi HTTP:401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.
  18. 401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.
  19. POST /api/auth/refreshCác lỗi có thể xảy ra:Refresh token không hợp lệ hoặc đã hết hạn.Mã lỗi HTTP:401 Unauthorized: Refresh token không hợp lệ.
  20. Các lỗi có thể xảy ra:Refresh token không hợp lệ hoặc đã hết hạn.
  21. Refresh token không hợp lệ hoặc đã hết hạn.
  22. Mã lỗi HTTP:401 Unauthorized: Refresh token không hợp lệ.
  23. 401 Unauthorized: Refresh token không hợp lệ.
  24. POST /api/auth/forgot-passwordCác lỗi có thể xảy ra:Email không tồn tại trong hệ thống.Mã lỗi HTTP:404 Not Found: Không tìm thấy email trong hệ thống.
  25. Các lỗi có thể xảy ra:Email không tồn tại trong hệ thống.
  26. Email không tồn tại trong hệ thống.
  27. Mã lỗi HTTP:404 Not Found: Không tìm thấy email trong hệ thống.
  28. 404 Not Found: Không tìm thấy email trong hệ thống.
  29. POST /api/auth/reset-passwordCác lỗi có thể xảy ra:Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.Mã lỗi HTTP:400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  30. Các lỗi có thể xảy ra:Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  31. Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  32. Mã lỗi HTTP:400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  33. 400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  34. GET /api/users/Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  35. Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).
  36. Người dùng không tồn tại.
  37. Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).
  38. Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  39. 404 Not Found: Không tìm thấy người dùng.
  40. 403 Forbidden: Không có quyền truy cập.
  41. PUT /api/users/Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  42. Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).
  43. Người dùng không tồn tại.
  44. Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).
  45. Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  46. 404 Not Found: Không tìm thấy người dùng.
  47. 403 Forbidden: Không có quyền truy cập.
  48. DELETE /api/users/Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  49. Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).
  50. Người dùng không tồn tại.
  51. Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).
  52. Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  53. 404 Not Found: Không tìm thấy người dùng.
  54. 403 Forbidden: Không có quyền truy cập.
  55. GET /api/usersCác lỗi có thể xảy ra:Không có quyền truy cập (yêu cầu phải là admin).Mã lỗi HTTP:403 Forbidden: Không có quyền truy cập.
  56. Các lỗi có thể xảy ra:Không có quyền truy cập (yêu cầu phải là admin).
  57. Không có quyền truy cập (yêu cầu phải là admin).
  58. Mã lỗi HTTP:403 Forbidden: Không có quyền truy cập.
  59. 403 Forbidden: Không có quyền truy cập.

POST /api/auth/register

  • Các lỗi có thể xảy ra:Username đã tồn tại.Email đã được sử dụng bởi một tài khoản khác.Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).
  • Username đã tồn tại.
  • Email đã được sử dụng bởi một tài khoản khác.
  • Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).
  • Mã lỗi HTTP:400 Bad Request: Dữ liệu đầu vào không hợp lệ.409 Conflict: Username hoặc Email đã tồn tại.
  • 400 Bad Request: Dữ liệu đầu vào không hợp lệ.
  • 409 Conflict: Username hoặc Email đã tồn tại.
  • Username đã tồn tại.
  • Email đã được sử dụng bởi một tài khoản khác.
  • Dữ liệu đầu vào không hợp lệ (ví dụ: thiếu trường bắt buộc, độ dài không đúng,…).
  • 400 Bad Request: Dữ liệu đầu vào không hợp lệ.
  • 409 Conflict: Username hoặc Email đã tồn tại.

POST /api/auth/login

  • Các lỗi có thể xảy ra:Sai tên đăng nhập hoặc mật khẩu.
  • Sai tên đăng nhập hoặc mật khẩu.
  • Mã lỗi HTTP:401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.
  • 401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.
  • Sai tên đăng nhập hoặc mật khẩu.
  • 401 Unauthorized: Tên đăng nhập hoặc mật khẩu không chính xác.

POST /api/auth/logout

  • Các lỗi có thể xảy ra:Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).
  • Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).
  • Mã lỗi HTTP:401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.
  • 401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.
  • Lỗi xảy ra khi đăng xuất (ví dụ: token không hợp lệ).
  • 401 Unauthorized: Không thể xác định người dùng hoặc token không hợp lệ.

POST /api/auth/refresh

  • Các lỗi có thể xảy ra:Refresh token không hợp lệ hoặc đã hết hạn.
  • Refresh token không hợp lệ hoặc đã hết hạn.
  • Mã lỗi HTTP:401 Unauthorized: Refresh token không hợp lệ.
  • 401 Unauthorized: Refresh token không hợp lệ.
  • Refresh token không hợp lệ hoặc đã hết hạn.
  • 401 Unauthorized: Refresh token không hợp lệ.

POST /api/auth/forgot-password

  • Các lỗi có thể xảy ra:Email không tồn tại trong hệ thống.
  • Email không tồn tại trong hệ thống.
  • Mã lỗi HTTP:404 Not Found: Không tìm thấy email trong hệ thống.
  • 404 Not Found: Không tìm thấy email trong hệ thống.
  • Email không tồn tại trong hệ thống.
  • 404 Not Found: Không tìm thấy email trong hệ thống.

POST /api/auth/reset-password

  • Các lỗi có thể xảy ra:Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  • Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  • Mã lỗi HTTP:400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  • 400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  • Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.
  • 400 Bad Request: Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn.

GET /api/users/

  • Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).
  • Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu thông tin người dùng khác).
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.

PUT /api/users/

  • Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).
  • Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu cập nhật thông tin người dùng khác).
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.

DELETE /api/users/

  • Các lỗi có thể xảy ra:Người dùng không tồn tại.Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).
  • Mã lỗi HTTP:404 Not Found: Không tìm thấy người dùng.403 Forbidden: Không có quyền truy cập.
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.
  • Người dùng không tồn tại.
  • Không có quyền truy cập vào người dùng (ví dụ: không phải là admin và yêu cầu xóa người dùng).
  • 404 Not Found: Không tìm thấy người dùng.
  • 403 Forbidden: Không có quyền truy cập.

GET /api/users

  • Các lỗi có thể xảy ra:Không có quyền truy cập (yêu cầu phải là admin).
  • Không có quyền truy cập (yêu cầu phải là admin).
  • Mã lỗi HTTP:403 Forbidden: Không có quyền truy cập.
  • 403 Forbidden: Không có quyền truy cập.
  • Không có quyền truy cập (yêu cầu phải là admin).
  • 403 Forbidden: Không có quyền truy cập.

Giải thích:

  • Các thông báo lỗi và mã lỗi HTTP được trả về cung cấp thông tin chi tiết về lỗi xảy ra trong quá trình xử lý request từ client.
  • Mã lỗi HTTP như 400, 401, 403, 404, và 409 được sử dụng để định danh các loại lỗi khác nhau, cho phép client và developer hiểu rõ nguyên nhân gây ra lỗi và xử lý phản hồi phù hợp.
  • Các thông báo lỗi như “Username đã tồn tại”, “Sai mật khẩu”, “Không có quyền truy cập” giúp người dùng hiểu được vấn đề xảy ra và có thể điều chỉnh hành vi hoặc liên hệ hỗ trợ.

Các thông báo lỗi và mã lỗi HTTP được trả về cung cấp thông tin chi tiết về lỗi xảy ra trong quá trình xử lý request từ client.

Mã lỗi HTTP như 400, 401, 403, 404, và 409 được sử dụng để định danh các loại lỗi khác nhau, cho phép client và developer hiểu rõ nguyên nhân gây ra lỗi và xử lý phản hồi phù hợp.

Chức năng xác thực cho bảng user và 2 chức năng login và logout
Chức năng xác thực cho bảng user và 2 chức năng login và logout

Các thông báo lỗi như “Username đã tồn tại”, “Sai mật khẩu”, “Không có quyền truy cập” giúp người dùng hiểu được vấn đề xảy ra và có thể điều chỉnh hành vi hoặc liên hệ hỗ trợ.

Thông tin này sẽ giúp bạn hiểu rõ hơn về các lỗi có thể xảy ra và cách xử lý chúng khi phát triển hệ thống xác thực và quản lý người dùng.

Dưới đây là một số ví dụ về các thông báo lỗi JSON có thể được trả về từ các route trong hệ thống xác thực và quản lý người dùng:

  1. Username đã tồn tại:
    {
      "error": {
        "message": "Username đã được sử dụng. Vui lòng chọn username khác."
      }
    }
    
  2. Email đã tồn tại:
    {
      "error": {
        "message": "Email đã được sử dụng. Vui lòng sử dụng email khác."
      }
    }
    
  3. Dữ liệu đầu vào không hợp lệ:
    {
      "error": {
        "message": "Dữ liệu đầu vào không hợp lệ. Vui lòng kiểm tra lại các trường bắt buộc."
      }
    }
    
  4. Sai tên đăng nhập hoặc mật khẩu:
    {
      "error": {
        "message": "Tên đăng nhập hoặc mật khẩu không đúng. Vui lòng thử lại."
      }
    }
    
  5. Token không hợp lệ:
    {
      "error": {
        "message": "Token không hợp lệ. Vui lòng đăng nhập lại."
      }
    }
    
  6. Không tìm thấy email trong hệ thống:
    {
      "error": {
        "message": "Không tìm thấy email trong hệ thống. Vui lòng kiểm tra lại."
      }
    }
    
  7. Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn:
    {
      "error": {
        "message": "Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn."
      }
    }
    
  8. Không tìm thấy người dùng:
    {
      "error": {
        "message": "Không tìm thấy người dùng."
      }
    }
    
  9. Không có quyền truy cập:
    {
      "error": {
        "message": "Bạn không có quyền truy cập."
      }
    }
    
  10. Lỗi chưa xác định:
    {
      "error": {
        "message": "Đã xảy ra lỗi không xác định. Vui lòng liên hệ bộ phận hỗ trợ."
      }
    }
    

Username đã tồn tại:

{
  "error": {
    "message": "Username đã được sử dụng. Vui lòng chọn username khác."
  }
}

Email đã tồn tại:

{
  "error": {
    "message": "Email đã được sử dụng. Vui lòng sử dụng email khác."
  }
}

Dữ liệu đầu vào không hợp lệ:

{
  "error": {
    "message": "Dữ liệu đầu vào không hợp lệ. Vui lòng kiểm tra lại các trường bắt buộc."
  }
}

Sai tên đăng nhập hoặc mật khẩu:

{
  "error": {
    "message": "Tên đăng nhập hoặc mật khẩu không đúng. Vui lòng thử lại."
  }
}

Token không hợp lệ:

{
  "error": {
    "message": "Token không hợp lệ. Vui lòng đăng nhập lại."
  }
}

Không tìm thấy email trong hệ thống:

{
  "error": {
    "message": "Không tìm thấy email trong hệ thống. Vui lòng kiểm tra lại."
  }
}

Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn:

{
  "error": {
    "message": "Token đặt lại mật khẩu không hợp lệ hoặc đã hết hạn."
  }
}

Không tìm thấy người dùng:

{
  "error": {
    "message": "Không tìm thấy người dùng."
  }
}

Không có quyền truy cập:

{
  "error": {
    "message": "Bạn không có quyền truy cập."
  }
}

Lỗi chưa xác định:

{
  "error": {
    "message": "Đã xảy ra lỗi không xác định. Vui lòng liên hệ bộ phận hỗ trợ."
  }
}

Giải thích:

  • Các thông báo lỗi JSON này cung cấp các tin nhắn dễ hiểu cho người dùng hoặc các developer khi xảy ra lỗi trong quá trình xử lý request từ client.
  • Mỗi thông báo lỗi có thể chứa một object error với trường message mô tả lỗi cụ thể.
  • Việc cung cấp thông báo lỗi rõ ràng và chi tiết giúp người dùng hiểu rõ hơn về vấn đề xảy ra và có thể thực hiện các hành động khắc phục.

Các thông báo lỗi JSON này cung cấp các tin nhắn dễ hiểu cho người dùng hoặc các developer khi xảy ra lỗi trong quá trình xử lý request từ client.

Mỗi thông báo lỗi có thể chứa một object error với trường message mô tả lỗi cụ thể.

Việc cung cấp thông báo lỗi rõ ràng và chi tiết giúp người dùng hiểu rõ hơn về vấn đề xảy ra và có thể thực hiện các hành động khắc phục.

Các ví dụ này sẽ giúp bạn xây dựng và cấu hình các thông báo lỗi phù hợp cho hệ thống của mình, từ đó cải thiện trải nghiệm người dùng và hỗ trợ việc phát triển và bảo trì ứng dụng một cách hiệu quả.

Dưới đây là một số mã lỗi HTTP phổ biến có thể được sử dụng trong các route của hệ thống xác thực và quản lý người dùng, cùng với một số ví dụ về cách chúng có thể được áp dụng:

  1. 400 Bad Request:Ví dụ: Dữ liệu đầu vào không hợp lệ.
    {
      "error": {
        "message": "Dữ liệu đầu vào không hợp lệ."
      }
    }
    
  2. Ví dụ: Dữ liệu đầu vào không hợp lệ.
  3. 401 Unauthorized:Ví dụ: Tên đăng nhập hoặc mật khẩu không chính xác.
    {
      "error": {
        "message": "Tên đăng nhập hoặc mật khẩu không đúng."
      }
    }
    
  4. Ví dụ: Tên đăng nhập hoặc mật khẩu không chính xác.
  5. 403 Forbidden:Ví dụ: Không có quyền truy cập vào tài nguyên.
    {
      "error": {
        "message": "Bạn không có quyền truy cập vào tài nguyên này."
      }
    }
    
  6. Ví dụ: Không có quyền truy cập vào tài nguyên.
  7. 404 Not Found:Ví dụ: Không tìm thấy người dùng hoặc tài nguyên khác trong hệ thống.
    {
      "error": {
        "message": "Không tìm thấy người dùng."
      }
    }
    
  8. Ví dụ: Không tìm thấy người dùng hoặc tài nguyên khác trong hệ thống.
  9. 409 Conflict:Ví dụ: Trùng lặp dữ liệu, ví dụ như username hoặc email đã tồn tại.
    {
      "error": {
        "message": "Username đã tồn tại trong hệ thống."
      }
    }
    
  10. Ví dụ: Trùng lặp dữ liệu, ví dụ như username hoặc email đã tồn tại.
  11. 500 Internal Server Error:Ví dụ: Lỗi server không xác định.
    {
      "error": {
        "message": "Đã xảy ra lỗi không xác định. Vui lòng thử lại sau."
      }
    }
    
  12. Ví dụ: Lỗi server không xác định.
  13. 503 Service Unavailable:Ví dụ: Dịch vụ không khả dụng tạm thời.
    {
      "error": {
        "message": "Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau."
      }
    }
    
  14. Ví dụ: Dịch vụ không khả dụng tạm thời.
  15. 504 Gateway Timeout:Ví dụ: Đã quá thời gian chờ khi kết nối đến một dịch vụ khác.
    {
      "error": {
        "message": "Không thể kết nối đến dịch vụ. Vui lòng thử lại sau."
      }
    }
    
  16. Ví dụ: Đã quá thời gian chờ khi kết nối đến một dịch vụ khác.

400 Bad Request:

  • Ví dụ: Dữ liệu đầu vào không hợp lệ.
{
  "error": {
    "message": "Dữ liệu đầu vào không hợp lệ."
  }
}

401 Unauthorized:

  • Ví dụ: Tên đăng nhập hoặc mật khẩu không chính xác.
{
  "error": {
    "message": "Tên đăng nhập hoặc mật khẩu không đúng."
  }
}

403 Forbidden:

  • Ví dụ: Không có quyền truy cập vào tài nguyên.
{
  "error": {
    "message": "Bạn không có quyền truy cập vào tài nguyên này."
  }
}

404 Not Found:

  • Ví dụ: Không tìm thấy người dùng hoặc tài nguyên khác trong hệ thống.
{
  "error": {
    "message": "Không tìm thấy người dùng."
  }
}

409 Conflict:

  • Ví dụ: Trùng lặp dữ liệu, ví dụ như username hoặc email đã tồn tại.
{
  "error": {
    "message": "Username đã tồn tại trong hệ thống."
  }
}

500 Internal Server Error:

  • Ví dụ: Lỗi server không xác định.
{
  "error": {
    "message": "Đã xảy ra lỗi không xác định. Vui lòng thử lại sau."
  }
}

503 Service Unavailable:

  • Ví dụ: Dịch vụ không khả dụng tạm thời.
{
  "error": {
    "message": "Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau."
  }
}

504 Gateway Timeout:

  • Ví dụ: Đã quá thời gian chờ khi kết nối đến một dịch vụ khác.
{
  "error": {
    "message": "Không thể kết nối đến dịch vụ. Vui lòng thử lại sau."
  }
}

Giải thích:

  • Các mã lỗi HTTP này cung cấp thông tin về trạng thái của request và giúp client hiểu rõ nguyên nhân của lỗi xảy ra.
  • Mỗi mã lỗi có thể được kết hợp với một thông báo lỗi JSON để cung cấp thông tin chi tiết hơn về vấn đề xảy ra.
  • Việc sử dụng các mã lỗi phù hợp và cung cấp thông báo lỗi rõ ràng là rất quan trọng để cải thiện trải nghiệm người dùng và giúp cho việc xử lý lỗi dễ dàng hơn trong quá trình phát triển và bảo trì hệ thống.

Các mã lỗi HTTP này cung cấp thông tin về trạng thái của request và giúp client hiểu rõ nguyên nhân của lỗi xảy ra.

Mỗi mã lỗi có thể được kết hợp với một thông báo lỗi JSON để cung cấp thông tin chi tiết hơn về vấn đề xảy ra.

Việc sử dụng các mã lỗi phù hợp và cung cấp thông báo lỗi rõ ràng là rất quan trọng để cải thiện trải nghiệm người dùng và giúp cho việc xử lý lỗi dễ dàng hơn trong quá trình phát triển và bảo trì hệ thống.

Thông tin này sẽ giúp bạn hiểu rõ hơn về các mã lỗi có thể áp dụng và cách áp dụng chúng trong hệ thống của mình để cung cấp trải nghiệm tốt nhất cho người dùng.

Để giúp bạn dựng mẫu API authentication từ khi nhận route đến khi cho kết quả thông báo, chúng ta sẽ cùng xem xét một ví dụ cụ thể với các bước và mã lệnh tương ứng.
Trong ví dụ này, chúng ta sẽ xây dựng một API endpoint đăng nhập (/api/auth/login) như sau:

Bước 1: Nhận route và xử lý request

  1. Express Route Definition (Backend)Đầu tiên, bạn cần định nghĩa route trong Express để xử lý yêu cầu đăng nhập.
    // Định nghĩa route đăng nhập
    app.post('/api/auth/login', async (req, res) => {
        // Xử lý request ở đây
    });
    

Express Route Definition (Backend)

Đầu tiên, bạn cần định nghĩa route trong Express để xử lý yêu cầu đăng nhập.

// Định nghĩa route đăng nhập
app.post('/api/auth/login', async (req, res) => {
    // Xử lý request ở đây
});

Bước 2: Xử lý yêu cầu đăng nhập

  1. Xử lý yêu cầu đăng nhậpTrong phần này, bạn cần kiểm tra và xác minh thông tin đăng nhập của người dùng.
    Sau đó, bạn cần tạo và trả về token JWT nếu thông tin đăng nhập hợp lệ.
    const jwt = require('jsonwebtoken');
    const bcrypt = require('bcryptjs');
    const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án
    
    app.post('/api/auth/login', async (req, res) => {
        const { username, password } = req.body;
    
        try {
            // Kiểm tra xem người dùng có tồn tại trong database không
            let user = await User.findOne({ username });
    
            if (!user) {
                return res.status(401).json({ error: { message: 'Tên đăng nhập hoặc mật khẩu không đúng.' } });
            }
    
            // Kiểm tra mật khẩu
            const isMatch = await bcrypt.compare(password, user.password);
    
            if (!isMatch) {
                return res.status(401).json({ error: { message: 'Tên đăng nhập hoặc mật khẩu không đúng.' } });
            }
    
            // Nếu tên đăng nhập và mật khẩu hợp lệ, tạo JWT token
            const payload = {
                user: {
                    id: user.id,
                    username: user.username,
                    email: user.email
                    // Thêm các thông tin khác của người dùng nếu cần thiết
                }
            };
    
            jwt.sign(
                payload,
                process.env.JWT_SECRET,
                { expiresIn: '1h' }, // Thời hạn của token, ví dụ 1 giờ
                (err, token) => {
                    if (err) throw err;
                    res.json({
                        token,
                        message: 'Đăng nhập thành công'
                    });
                }
            );
        } catch (err) {
            console.error(err.message);
            res.status(500).json({ error: { message: 'Lỗi server, vui lòng thử lại sau.' } });
        }
    });
    

Xử lý yêu cầu đăng nhập

Trong phần này, bạn cần kiểm tra và xác minh thông tin đăng nhập của người dùng.
Sau đó, bạn cần tạo và trả về token JWT nếu thông tin đăng nhập hợp lệ.

const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án

app.post('/api/auth/login', async (req, res) => {
    const { username, password } = req.body;

    try {
        // Kiểm tra xem người dùng có tồn tại trong database không
        let user = await User.findOne({ username });

        if (!user) {
            return res.status(401).json({ error: { message: 'Tên đăng nhập hoặc mật khẩu không đúng.' } });
        }

        // Kiểm tra mật khẩu
        const isMatch = await bcrypt.compare(password, user.password);

        if (!isMatch) {
            return res.status(401).json({ error: { message: 'Tên đăng nhập hoặc mật khẩu không đúng.' } });
        }

        // Nếu tên đăng nhập và mật khẩu hợp lệ, tạo JWT token
        const payload = {
            user: {
                id: user.id,
                username: user.username,
                email: user.email
                // Thêm các thông tin khác của người dùng nếu cần thiết
            }
        };

        jwt.sign(
            payload,
            process.env.JWT_SECRET,
            { expiresIn: '1h' }, // Thời hạn của token, ví dụ 1 giờ
            (err, token) => {
                if (err) throw err;
                res.json({
                    token,
                    message: 'Đăng nhập thành công'
                });
            }
        );
    } catch (err) {
        console.error(err.message);
        res.status(500).json({ error: { message: 'Lỗi server, vui lòng thử lại sau.' } });
    }
});

Giải thích:

  • Express Route: Chúng ta định nghĩa route /api/auth/login để nhận yêu cầu POST từ client.
  • Xử lý yêu cầu đăng nhập: Trong hàm xử lý route này, chúng ta sử dụng async/await để đảm bảo xử lý bất đồng bộ (asynchronous handling).
  • Kiểm tra và xác minh thông tin đăng nhập: Chúng ta kiểm tra xem username có tồn tại trong cơ sở dữ liệu không và so sánh mật khẩu với bcrypt.
  • Tạo và trả về token JWT: Nếu thông tin đăng nhập hợp lệ, chúng ta tạo một JWT token và trả về cho client trong phần res.json.
  • Thông báo lỗi: Nếu có lỗi xảy ra trong quá trình xử lý, chúng ta trả về mã lỗi HTTP tương ứng và thông báo lỗi JSON.

Express Route: Chúng ta định nghĩa route /api/auth/login để nhận yêu cầu POST từ client.

Xử lý yêu cầu đăng nhập: Trong hàm xử lý route này, chúng ta sử dụng async/await để đảm bảo xử lý bất đồng bộ (asynchronous handling).

Kiểm tra và xác minh thông tin đăng nhập: Chúng ta kiểm tra xem username có tồn tại trong cơ sở dữ liệu không và so sánh mật khẩu với bcrypt.

Tạo và trả về token JWT: Nếu thông tin đăng nhập hợp lệ, chúng ta tạo một JWT token và trả về cho client trong phần res.json.

Thông báo lỗi: Nếu có lỗi xảy ra trong quá trình xử lý, chúng ta trả về mã lỗi HTTP tương ứng và thông báo lỗi JSON.

Lưu ý:

  • Đây chỉ là một ví dụ đơn giản để minh họa quá trình xử lý đăng nhập và trả về kết quả thông báo.
    Trong thực tế, bạn cần điều chỉnh và bổ sung cho phù hợp với cấu trúc dự án và yêu cầu cụ thể của bạn.
  • Bạn cần đảm bảo rằng mã lệnh được bảo mật và phù hợp với các tiêu chuẩn an toàn, ví dụ như băm mật khẩu, sử dụng HTTPS, và kiểm tra các lỗ hổng bảo mật khác.
  • Các thư viện như jsonwebtoken và bcryptjs được sử dụng trong ví dụ này để tạo và xác minh JWT token và băm mật khẩu.
    Bạn cần cài đặt và sử dụng chúng trong dự án thực tế của mình.

Đây chỉ là một ví dụ đơn giản để minh họa quá trình xử lý đăng nhập và trả về kết quả thông báo.
Trong thực tế, bạn cần điều chỉnh và bổ sung cho phù hợp với cấu trúc dự án và yêu cầu cụ thể của bạn.

Bạn cần đảm bảo rằng mã lệnh được bảo mật và phù hợp với các tiêu chuẩn an toàn, ví dụ như băm mật khẩu, sử dụng HTTPS, và kiểm tra các lỗ hổng bảo mật khác.

Các thư viện như jsonwebtoken và bcryptjs được sử dụng trong ví dụ này để tạo và xác minh JWT token và băm mật khẩu.
Bạn cần cài đặt và sử dụng chúng trong dự án thực tế của mình.

Thông tin này sẽ giúp bạn có một cái nhìn tổng quan về cách xây dựng một API endpoint cho quá trình đăng nhập và trả về kết quả thông báo trong hệ thống của mình.

Chức năng logout trong hệ thống xác thực và quản lý người dùng thường được sử dụng để đăng xuất người dùng khỏi ứng dụng.
Dưới đây là một ví dụ về cách xây dựng chức năng logout trong một API:

Ví dụ về API cho chức năng logout

  1. Express Route Definition (Backend)Đầu tiên, bạn cần định nghĩa route trong Express để xử lý yêu cầu logout.
    const express = require('express');
    const router = express.Router();
    const auth = require('../middleware/auth'); // Middleware để xác thực token
    const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án
    
    // Định nghĩa route logout
    router.post('/logout', auth, async (req, res) => {
        try {
            // Xóa token của người dùng đang đăng nhập
            req.user.tokens = req.user.tokens.filter(token => token.token !== req.token);
            await req.user.save();
    
            res.json({ message: 'Đăng xuất thành công' });
        } catch (err) {
            console.error(err.message);
            res.status(500).json({ error: { message: 'Lỗi server, vui lòng thử lại sau.' } });
        }
    });
    
    module.exports = router;
    
  2. Middleware Authentication (auth.js)Trong ví dụ này, chúng ta sử dụng một middleware auth để xác thực token.
    Middleware này sẽ kiểm tra tính hợp lệ của token và giải mã thông tin người dùng từ token để sử dụng trong các route bảo vệ.
    const jwt = require('jsonwebtoken');
    const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án
    
    const auth = async (req, res, next) => {
        try {
            const token = req.header('Authorization').replace('Bearer ', '');
            const decoded = jwt.verify(token, process.env.JWT_SECRET);
            const user = await User.findOne({ _id: decoded._id, 'tokens.token': token });
    
            if (!user) {
                throw new Error();
            }
    
            req.token = token;
            req.user = user;
            next();
        } catch (err) {
            console.error(err.message);
            res.status(401).json({ error: { message: 'Không được phép truy cập.' } });
        }
    };
    
    module.exports = auth;
    

Express Route Definition (Backend)

Đầu tiên, bạn cần định nghĩa route trong Express để xử lý yêu cầu logout.

const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth'); // Middleware để xác thực token
const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án

// Định nghĩa route logout
router.post('/logout', auth, async (req, res) => {
    try {
        // Xóa token của người dùng đang đăng nhập
        req.user.tokens = req.user.tokens.filter(token => token.token !== req.token);
        await req.user.save();

        res.json({ message: 'Đăng xuất thành công' });
    } catch (err) {
        console.error(err.message);
        res.status(500).json({ error: { message: 'Lỗi server, vui lòng thử lại sau.' } });
    }
});

module.exports = router;

Middleware Authentication (auth.js)

Trong ví dụ này, chúng ta sử dụng một middleware auth để xác thực token.
Middleware này sẽ kiểm tra tính hợp lệ của token và giải mã thông tin người dùng từ token để sử dụng trong các route bảo vệ.

const jwt = require('jsonwebtoken');
const User = require('../models/User'); // Đây là ví dụ, phần này cần thay đổi tùy vào cấu trúc dự án

const auth = async (req, res, next) => {
    try {
        const token = req.header('Authorization').replace('Bearer ', '');
        const decoded = jwt.verify(token, process.env.JWT_SECRET);
        const user = await User.findOne({ _id: decoded._id, 'tokens.token': token });

        if (!user) {
            throw new Error();
        }

        req.token = token;
        req.user = user;
        next();
    } catch (err) {
        console.error(err.message);
        res.status(401).json({ error: { message: 'Không được phép truy cập.' } });
    }
};

module.exports = auth;

Giải thích:

  • Express Route: Chúng ta định nghĩa route /logout trong file router để xử lý yêu cầu POST từ client.
    Middleware auth được sử dụng để xác thực token của người dùng trước khi thực hiện logout.
  • Middleware Authentication (auth): Middleware này giúp xác thực token JWT.
    Nó sẽ kiểm tra tính hợp lệ của token trong header Authorization, giải mã thông tin người dùng và lấy thông tin người dùng từ cơ sở dữ liệu để sử dụng trong route bảo vệ.
    Nếu token không hợp lệ hoặc không tìm thấy người dùng, nó sẽ trả về mã lỗi HTTP 401.
  • Xử lý yêu cầu logout: Trong hàm xử lý route /logout, chúng ta xóa token hiện tại của người dùng từ mảng các token lưu trên server và lưu lại thông tin người dùng đã được cập nhật.
    Sau đó, trả về thông báo JSON cho client để xác nhận đã đăng xuất thành công.
  • Thông báo lỗi: Nếu có lỗi xảy ra trong quá trình xử lý, chúng ta trả về mã lỗi HTTP tương ứng và thông báo lỗi JSON.

Express Route: Chúng ta định nghĩa route /logout trong file router để xử lý yêu cầu POST từ client.
Middleware auth được sử dụng để xác thực token của người dùng trước khi thực hiện logout.

Middleware Authentication (auth): Middleware này giúp xác thực token JWT.
Nó sẽ kiểm tra tính hợp lệ của token trong header Authorization, giải mã thông tin người dùng và lấy thông tin người dùng từ cơ sở dữ liệu để sử dụng trong route bảo vệ.
Nếu token không hợp lệ hoặc không tìm thấy người dùng, nó sẽ trả về mã lỗi HTTP 401.

Xử lý yêu cầu logout: Trong hàm xử lý route /logout, chúng ta xóa token hiện tại của người dùng từ mảng các token lưu trên server và lưu lại thông tin người dùng đã được cập nhật.
Sau đó, trả về thông báo JSON cho client để xác nhận đã đăng xuất thành công.

Thông báo lỗi: Nếu có lỗi xảy ra trong quá trình xử lý, chúng ta trả về mã lỗi HTTP tương ứng và thông báo lỗi JSON.

Lưu ý:

  • Đảm bảo rằng mã lệnh được bảo mật và phù hợp với các tiêu chuẩn an toàn, ví dụ như sử dụng HTTPS, kiểm tra lỗ hổng bảo mật, và xóa các token lưu trên client sau khi logout.
  • Bạn cần điều chỉnh và bổ sung cho phù hợp với cấu trúc dự án và yêu cầu cụ thể của bạn, ví dụ như lưu trữ token trong cơ sở dữ liệu nếu cần thiết.

Đảm bảo rằng mã lệnh được bảo mật và phù hợp với các tiêu chuẩn an toàn, ví dụ như sử dụng HTTPS, kiểm tra lỗ hổng bảo mật, và xóa các token lưu trên client sau khi logout.

Bạn cần điều chỉnh và bổ sung cho phù hợp với cấu trúc dự án và yêu cầu cụ thể của bạn, ví dụ như lưu trữ token trong cơ sở dữ liệu nếu cần thiết.

Thông tin này sẽ giúp bạn hiểu rõ hơn về cách xây dựng chức năng logout trong hệ thống của mình sử dụng Express và JWT trong Node.js.

#Mtips5s #Contact

Fanpage: https://www.facebook.com/mtipscoder

Group trao đổi, chia sẻ: https://www.facebook.com/groups/mtipscoder

Website: https://mtips5s.com

Youtube: https://mtips5s.com

Twitter(X): @takagiks99

Instagram: @khuongkara

Threads: @khuongkara

Google Maps: @khuongkara

#Base Code #Souce Code

Bộ công cụ My Self: @tools.mtips5s.com

Github: @github

Npm: @npm

Docker: @docker

Chúc các bạn thành công!


Written by admin


Comments

This post currently has no responses.

Leave a Reply