Pango AIPango AI Team
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

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

ExternalLogin.gql
mutation ExternalLogin($request: ExternalLoginRequestDtoInput!) {
  externalLogin(request: $request) {
    accessToken
    account {
      id
      email
      fullName
      phone
      avatarUrl
      role
      status
      lastLogin
    }
  }
}

Variables (JSON)

Variables
{
  "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)

Response 200 OK
{
  "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:

externalLogin.ts
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ínhKiểu Dữ LiệuBắt BuộcMô Tả
platformUserIdString!ID duy nhất của người dùng phía hệ thống đối tác
platformCodeString!Mã nền tảng đối tác (ví dụ: "CARESOFT", "APP")
platformEmailString!Địa chỉ Email của người dùng
platformUsernameString!Tên đầy đủ hiển thị của người dùng
platformPhoneStringKhôngSố điện thoại người dùng
requestTimeLong!Timestamp mili-giây tại thời điểm tạo request (Date.now())

Dữ Liệu Trả Về (ExternalLoginResponse)

Thuộc TínhKiểu Dữ LiệuMô Tả
accessTokenString!Chuỗi JWT Token dùng để xác thực các request sau này
account.idString!ID định danh tài khoản trên hệ thống Pango
account.roleString!Vai trò người dùng (ví dụ: "USER")
account.statusString!Trạng thái tài khoản ("ACTIVE", "LOCKED")