Module 01: Chatbot Service (API)1.5 GraphQL API & Code Examples
Module 01 • API Gateway
1.5.2 Đăng Nhập Hệ Thống (ExternalLogin)
MUTATION
Yêu cầu Header Checksum MD5
ExternalLogin.gql
Variables
Response 200 OK
externalLogin.ts
Dữ Liệu Trả Về (
Xác thực định danh người dùng từ hệ thống đối tác vào Pango AI Platform. Kết quả trả về gồm accessToken (JWT) dùng cho các request tiếp theo và thông tin tài khoản người dùng (account).
Yêu Cầu Header Checksum
Khi gọi mutation này, bạn bắt buộc phải đính kèm HTTP Header
Checksumđược tạo theo công thức MD5 quy định tại Cơ chế Checksum.
💻 Chi Tiết Truy Vấn & Mã Nguồn Mẫu
GraphQL Mutation & Payload:
GraphQL Mutation
mutation ExternalLogin($request: ExternalLoginRequestDtoInput!) {
externalLogin(request: $request) {
accessToken
account {
id
email
fullName
phone
avatarUrl
role
status
lastLogin
}
}
}Variables (JSON)
{
"request": {
"platformUserId": "737a445da12ddbd3d5d40a88ee314864",
"platformCode": "CARESOFT",
"platformEmail": "user@example.com",
"platformUsername": "Nguyen Van A",
"platformPhone": "0902442992",
"requestTime": 1740200000000
}
}Phản Hồi Thành Công (JSON Response)
{
"data": {
"externalLogin": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI3MzdhNDQ1ZGE...",
"account": {
"id": "737a445da12ddbd3d5d40a88ee314864",
"email": "user@example.com",
"fullName": "Nguyen Van A",
"phone": "0902442992",
"avatarUrl": null,
"role": "USER",
"status": "ACTIVE",
"lastLogin": 1740200000000
}
}
}
}TypeScript / Axios:
import axios from 'axios';
import md5 from 'crypto-js/md5';
export interface ExternalLoginParams {
platformUserId: string;
platformCode: string;
platformEmail: string;
platformUsername: string;
platformPhone?: string;
requestTime?: number;
}
export interface LoginResponse {
accessToken: string;
account: {
id: string;
email: string;
fullName: string;
phone?: string;
role: string;
status: string;
};
}
/**
* Đăng nhập người dùng từ hệ thống đối tác vào Pango AI Platform
*/
export async function externalLogin(
apiUrl: string = process.env.VITE_API_URL!,
params: ExternalLoginParams
): Promise<LoginResponse> {
const requestTime = params.requestTime || Date.now();
const request = { ...params, requestTime };
// 1. Tạo Checksum MD5: platformCode:requestTime:platformUserId
const checkSumString = `${params.platformCode}:${requestTime}:${params.platformUserId}`;
const checksum = md5(checkSumString).toString().toLowerCase();
const query = `
mutation ExternalLogin($request: ExternalLoginRequestDtoInput!) {
externalLogin(request: $request) {
accessToken
account {
id
email
fullName
phone
avatarUrl
role
status
lastLogin
}
}
}
`;
const response = await axios.post(
apiUrl,
{
query,
variables: { request },
operationName: 'ExternalLogin',
},
{
headers: {
'Content-Type': 'application/json',
'orgId': process.env.VITE_ORG_ID,
'x-org-id': process.env.VITE_ORG_ID,
'x-client-type': 'app',
'x-external-private-key': process.env.VITE_EXTERNAL_PRIVATE_KEY,
'Checksum': checksum,
},
}
);
const data = response.data?.data?.externalLogin;
if (!data?.accessToken) {
throw new Error('Đăng nhập thất bại: Không tìm thấy accessToken trong phản hồi.');
}
// Lưu accessToken vào LocalStorage / SecureStorage
localStorage.setItem('access_token', data.accessToken);
localStorage.setItem('user_info', JSON.stringify(params));
return data;
}📑 Bảng Tham Số (Schema Definition)
ExternalLoginRequestDtoInput
| Thuộc Tính | Kiểu Dữ Liệu | Bắt Buộc | Mô Tả |
|---|---|---|---|
platformUserId | String! | Có | ID duy nhất của người dùng phía hệ thống đối tác |
platformCode | String! | Có | Mã nền tảng đối tác (ví dụ: "CARESOFT", "APP") |
platformEmail | String! | Có | Địa chỉ Email của người dùng |
platformUsername | String! | Có | Tên đầy đủ hiển thị của người dùng |
platformPhone | String | Không | Số điện thoại người dùng |
requestTime | Long! | Có | Timestamp mili-giây tại thời điểm tạo request (Date.now()) |
Dữ Liệu Trả Về (ExternalLoginResponse)
| Thuộc Tính | Kiểu Dữ Liệu | Mô Tả |
|---|---|---|
accessToken | String! | Chuỗi JWT Token dùng để xác thực các request sau này |
account.id | String! | ID định danh tài khoản trên hệ thống Pango |
account.role | String! | Vai trò người dùng (ví dụ: "USER") |
account.status | String! | Trạng thái tài khoản ("ACTIVE", "LOCKED") |