Xác Thực Google
Mô Tả Tổng Quan
Tính năng Xác thực Google cung cấp xác thực và đăng ký dựa trên OAuth cho người dùng có tài khoản Google. Người dùng xác thực thông qua Google OAuth ở phía client, nhận được Firebase ID token, sau đó gửi token này đến API để xác minh và tạo phiên đăng nhập. Hệ thống sử dụng Firebase Authentication để xác minh token an toàn và quản lý người dùng. Đây là phương thức xác thực dựa trên OAuth không liên quan đến đăng ký email/mật khẩu truyền thống.
API: Google Authentication API
Biểu Đồ Hoạt Động
flowchart TD
A[Người dùng khởi tạo xác thực Google] --> B[Google OAuth Flow ở Client]
B --> C[Client nhận Firebase ID Token]
C --> D{Gửi token đến API?}
D -->|Có| E[Xác minh token với Firebase]
D -->|Không| F[Chờ user action]
F --> D
E --> G{Token có hợp lệ?}
G -->|Không| H[Trả về lỗi token]
G -->|Có| I[Tìm người dùng theo Google UID]
I --> J{Người dùng có tồn tại?}
J -->|Không| K[Luồng Đăng Ký Google]
J -->|Có| L[Luồng Đăng Nhập Google]
K --> M[Tạo tài khoản người dùng mới]
M --> N[Gán vai trò mặc định]
N --> O[Tạo phiên và cookie]
L --> P[Kiểm tra trạng thái người dùng]
P --> Q{Người dùng có hoạt động?}
Q -->|Không| R[Trả về lỗi không hoạt động]
Q -->|Có| S[Tạo phiên và cookie]
O --> T[Trả về phản hồi thành công]
S --> T
H --> U[Trả về lỗi xác thực]
style A fill:#e1f5fe
style T fill:#c8e6c9
style H fill:#ffcdd2
style R fill:#ffcdd2
style U fill:#ffcdd2
style B fill:#fff3cd
style C fill:#fff3cd
Biểu Đồ Tuần Tự
Luồng Đăng Ký Google
sequenceDiagram
participant Client
participant GoogleOAuth as Google OAuth Client
participant GoogleController
participant AuthService
participant Firebase
participant Database
Note over Client,Database: Luồng Đăng Ký Google OAuth
rect rgb(255, 243, 205)
Note right of Client: Client-Side OAuth Flow
Client->>GoogleOAuth: Khởi tạo Google Sign-In
GoogleOAuth->>GoogleOAuth: Xử lý OAuth flow
GoogleOAuth-->>Client: Trả về Firebase ID Token
end
rect rgb(200, 255, 200)
Note right of Client: API Registration Flow
Client->>GoogleController: POST /api/v1/general/auth/google/register
Note over Client,GoogleController: {email, name, companyName} + firebase-token header
rect rgb(200, 230, 255)
Note right of GoogleController: Xác Thực Đầu Vào
GoogleController->>GoogleController: Xác thực dữ liệu yêu cầu
end
rect rgb(200, 255, 255)
Note right of GoogleController: Logic Nghiệp Vụ
GoogleController->>AuthService: registerByGoogle(email, name, companyName, token)
AuthService->>Firebase: verifyIdToken(token)
Firebase-->>AuthService: Token đã xác minh + thông tin người dùng
AuthService->>Database: Kiểm tra người dùng có tồn tại
Database-->>AuthService: Người dùng không tìm thấy
AuthService->>Database: Tạo người dùng từ dữ liệu Google
Database-->>AuthService: Người dùng đã tạo
AuthService->>Database: Gán vai trò nhóm mặc định
Database-->>AuthService: Vai trò đã gán
end
rect rgb(230, 200, 255)
Note right of AuthService: Tạo Phiên
AuthService->>AuthService: createAuthCookieByUser()
AuthService-->>GoogleController: Dữ liệu người dùng + cookie
end
GoogleController->>Client: 201 Created + Set-Cookie headers
end
rect rgb(255, 200, 200)
Note right of Client: Error Handling
rect rgb(255, 230, 230)
alt Lỗi Xác Thực
GoogleController->>Client: 422 Validation Error
else Email Đã Tồn Tại
Database-->>AuthService: Email tồn tại
AuthService-->>GoogleController: Email conflict
GoogleController->>Client: 409 Conflict
else Token Google Không Hợp Lệ
Firebase-->>AuthService: Token verification failed
AuthService-->>GoogleController: Authentication error
GoogleController->>Client: 401 Unauthorized
end
end
end
Các Bước
Quy Trình Đăng Ký Google
Bước 1: Client-Side Google OAuth
- Mô tả: Người dùng xác thực với Google ở phía client
- Hành động:
- Client khởi tạo Google Sign-In
- Google xử lý OAuth flow
- Client nhận Firebase ID Token
- Không có POST đến Firebase - chỉ nhận token
Bước 2: Gửi Dữ Liệu Đăng Ký
- Mô tả: Người dùng gửi đăng ký với thông tin xác thực Google
- Yêu cầu:
POST /api/v1/general/auth/google/register - Headers:
firebase-token: {google_id_token} - Dữ liệu: email, name, companyName từ tài khoản Google
- Xác thực: Các trường bắt buộc và định dạng
Bước 3: Xác Minh Token Google
- Mô tả: Xác thực người dùng thông qua Google OAuth
- Hành động:
- Xác minh Google ID token với Firebase
- Trích xuất thông tin người dùng đã xác minh
- Đảm bảo tính xác thực của token
Bước 4: Kiểm Tra Sự Tồn Tại Của Người Dùng
- Mô tả: Xác minh người dùng chưa được đăng ký
- Hành động:
- Truy vấn cơ sở dữ liệu cho email hiện có
- Trả về lỗi nếu người dùng đã tồn tại
- Tiếp tục đăng ký nếu là người dùng mới
Bước 5: Tạo Tài Khoản Người Dùng
- Mô tả: Tạo người dùng mới từ dữ liệu Google
- Hành động:
- Lưu thông tin người dùng từ Google
- Tạo ánh xạ Firebase UID
- Đặt trạng thái tài khoản thành hoạt động
Bước 6: Gán Vai Trò Mặc Định
- Mô tả: Thiết lập thành viên nhóm ban đầu của người dùng
- Hành động:
- Tạo bản ghi thành viên nhóm
- Gán vai trò nhóm mặc định
- Thiết lập quyền người dùng
Bước 7: Tạo Phiên
- Mô tả: Tự động đăng nhập người dùng mới
- Hành động:
- Tạo cookie xác thực
- Tạo trạng thái đã đăng nhập
- Trả về dữ liệu người dùng với phiên
Xử Lý Lỗi
| HTTP Status | Error Code | Mô Tả |
|---|---|---|
| 400 | BAD_REQUEST | Yêu cầu không hợp lệ hoặc thiếu tham số |
| 401 | UNAUTHORIZED | Firebase token không hợp lệ hoặc đã hết hạn |
| 409 | EMAIL_ALREADY_EXISTS | Địa chỉ email đã được đăng ký trong hệ thống |
| 422 | UNPROCESSABLE_ENTITY | Lỗi xác thực trong dữ liệu yêu cầu |
| 500 | INTERNAL_SERVER_ERROR | Lỗi máy chủ trong quá trình xử lý |
Ghi Chú Bổ Sung
- Client-Side OAuth: Google OAuth flow xảy ra hoàn toàn ở phía client
- Firebase Token: Client nhận Firebase ID token từ Google OAuth, không tạo token
- Token Verification: API chỉ xác minh token với Firebase, không tạo token mới
- No POST to Firebase: Hệ thống không gửi POST request đến Firebase để tạo token
- Security: Token được xác minh với Firebase để đảm bảo tính xác thực
- Flow: Client OAuth → Nhận Token → Gửi Token đến API → Xác minh → Tạo Session