အကြောင်းအရာသို့ ကရန်

စစ်မှန်ကြောင်းအထောက်အထားပြခြင်း။

SMSBAT ChatHub API သည် ကုမ္ပဏီ တိုကင်များနှင့် အော်ပရေတာ တိုကင်များပါရှိသော အဆင့်နှစ်ဆင့် JWT တိုကင်-အခြေခံ စစ်မှန်ကြောင်း အထောက်အထားပြစနစ်ကို အသုံးပြုသည်။

Authentication Flow

graph TD
    A[Login Credentials] --> B[Get Company Token]
    B --> C[Use Company Token]
    C --> D[Get Operator Token]
    D --> E[Use Operator Token]
    E --> F[Validate Token]

ကုမ္ပဏီ တိုကင်

ကုမ္ပဏီ တိုကင်များသည် ChatHub API သို့ အဖွဲ့အစည်းအဆင့် အသုံးပြုခွင့်ကို ပေးပါသည်။

ကုမ္ပဏီ တိုကင် ရယူပါ။

အဆုံးမှတ်- POST /api/company/get-token

တောင်းဆိုချက်

curl -X POST https://chatapi.smsbat.com/api/company/get-token \
  -H "Content-Type: application/json" \
  -d '{
    "login": "your-company-login",
    "password": "your-company-password"
  }'

** တောင်းခံလွှာ-**

{
  "login": "string",
  "password": "string"
}

တုံ့ပြန်ချက်

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

တုံ့ပြန်မှုသည် JWT တိုကင်စာကြောင်းဖြစ်သည်။

ကုမ္ပဏီ တိုကင်ကို သုံးပါ။

နည်းလမ်းနှစ်ခုထဲမှ တစ်ခုကို အသုံးပြု၍ API တောင်းဆိုချက်များတွင် ကုမ္ပဏီ တိုကင်ကို ထည့်သွင်းပါ-

နည်းလမ်း 1- ခွင့်ပြုချက် ခေါင်းစီး (အကြံပြုထားသည်)

curl -X GET https://chatapi.smsbat.com/api/company/organization \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

နည်းလမ်း 2- X-Authorization-Key ခေါင်းစီး

curl -X GET https://chatapi.smsbat.com/api/company/organization \
  -H "X-Authorization-Key: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

အော်ပရေတာ တိုကင်

အော်ပရေတာ တိုကင်များသည် အဖွဲ့အစည်းတစ်ခုအတွင်းရှိ အော်ပရေတာတစ်ဦးချင်းစီအတွက် အသုံးပြုသူ၏ သီးခြားဝင်ရောက်ခွင့်ကို ပေးပါသည်။

အော်ပရေတာတိုကင်ရယူပါ။

** အဆုံးမှတ်-** POST /api/operator/get-token

တောင်းဆိုချက်

curl -X POST https://chatapi.smsbat.com/api/operator/get-token \
  -H "Authorization: Bearer {company-token}" \
  -H "Content-Type: application/json" \
  -d '{
    "id": 123,
    "expiresAt": "2025-12-31T23:59:59Z"
  }'

** တောင်းခံလွှာ-**

{
  "id": 0,
  "expiresAt": "2025-01-20T14:33:34.147Z"
}

ကန့်သတ်ချက်များ-

ကန့်သတ်ချက် ရိုက် လိုအပ်သည် ဖော်ပြချက်
id ကိန်းပြည့် ဟုတ်တယ် အော်ပရေတာ ID
expiresAt string (ISO 8601) ဟုတ်တယ် တိုကင် သက်တမ်းကုန်ဆုံးရက်နှင့် အချိန် (ယခုမှ အများဆုံး 24 နာရီ)

အရေးကြီးသည်- တိုကင်သက်တမ်းသည် 24 နာရီဖြစ်သည်။ expiresAt ကန့်သတ်ချက်သည် အနာဂတ်တွင် 24 နာရီထက် မပိုနိုင်ပါ။

တုံ့ပြန်ချက်

"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcGVyYXRvcl9pZCI6MTIzLCJleHAiOjE3Mzc0MTI3OTl9.example_signature"

Operator Token ကိုသုံးပါ။

API တောင်းဆိုချက်များတွင် အော်ပရေတာ တိုကင်ကို ထည့်သွင်းပါ-

curl -X GET https://chatapi.smsbat.com/api/operator \
  -H "Authorization: Bearer {operator-token}"

တိုကင်အတည်ပြုခြင်း။

၎င်းကိုအသုံးမပြုမီ တိုကင်တစ်ခုသည် တရားဝင်နေသေးကြောင်း စစ်ဆေးပါ။

အဆုံးမှတ်- POST /api/operator/validate-token

တောင်းဆိုချက်

curl -X POST https://chatapi.smsbat.com/api/operator/validate-token \
  -H "Authorization: Bearer {company-token}" \
  -H "Content-Type: application/json" \
  -d '{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  }'

** တောင်းခံလွှာ-**

{
  "token": "string"
}

** တုံ့ပြန်မှု (တရားဝင်တိုကင်) :**

{
  "isValid": true,
  "operatorId": 123,
  "clientId": 0,
  "expiresAt": "2025-12-31T23:59:59Z",
  "error": null
}

တုံ့ပြန်မှု (မမှန်ကန်သော တိုကင်):

{
  "isValid": false,
  "error": "Invalid token"
}

တိုကင်သက်တမ်းကုန်ဆုံးခြင်း။

ကုမ္ပဏီတိုကင်

  • API တွင် တိကျသော သက်တမ်းကုန်ဆုံးခြင်းမရှိပါ။
  • တိုကင်ဘဝသံသရာမူဝါဒများအတွက် သင့်အကောင့်မန်နေဂျာထံ ဆက်သွယ်ပါ။
  • လုံခြုံရေးအတွက် တိုကင်များကို အခါအားလျော်စွာ လှည့်ပါ။

အော်ပရေတာတိုကင်များ

  • တိုကင်တောင်းဆိုသည့်အခါ သက်တမ်းကုန်ဆုံးချိန် သတ်မှတ်ထားသည် (expiresAt ကန့်သတ်ချက်)
  • အသုံးမပြုမီ တိုကင်များကို စစ်ဆေးပါ။
  • သက်တမ်းမကုန်ဆုံးမီ တိုကင်အသစ်များကို တောင်းဆိုပါ။

အကောင်အထည်ဖော်မှု ဥပမာများ

Python

import requests
from datetime import datetime, timedelta

class ChatHubAuth:
    def __init__(self, base_url):
        self.base_url = base_url
        self.company_token = None
        self.operator_tokens = {}

    def get_company_token(self, login, password):
        """Get company authentication token"""
        response = requests.post(
            f"{self.base_url}/api/company/get-token",
            json={"login": login, "password": password}
        )
        response.raise_for_status()
        self.company_token = response.json()
        return self.company_token

    def get_operator_token(self, operator_id, expires_days=30):
        """Get operator token with expiration"""
        expires_at = (
            datetime.utcnow() + timedelta(days=expires_days)
        ).isoformat() + "Z"

        response = requests.post(
            f"{self.base_url}/api/operator/get-token",
            headers={"Authorization": f"Bearer {self.company_token}"},
            json={"id": operator_id, "expiresAt": expires_at}
        )
        response.raise_for_status()

        token = response.json()
        self.operator_tokens[operator_id] = token
        return token

    def validate_token(self, token):
        """Validate if token is still valid"""
        response = requests.post(
            f"{self.base_url}/api/operator/validate-token",
            headers={"Authorization": f"Bearer {self.company_token}"},
            json={"token": token}
        )
        response.raise_for_status()
        return response.json()

# Usage
auth = ChatHubAuth("https://chatapi.smsbat.com")

# Get company token
company_token = auth.get_company_token("login", "password")

# Get operator token
operator_token = auth.get_operator_token(operator_id=123, expires_days=30)

# Validate token
is_valid = auth.validate_token(operator_token)
print(f"Token valid: {is_valid['valid']}")

JavaScript (Node.js)

const axios = require('axios');

class ChatHubAuth {
  constructor(baseUrl) {
    this.baseUrl = baseUrl;
    this.companyToken = null;
    this.operatorTokens = {};
  }

  async getCompanyToken(login, password) {
    const response = await axios.post(
      `${this.baseUrl}/api/company/get-token`,
      { login, password }
    );

    this.companyToken = response.data;
    return this.companyToken;
  }

  async getOperatorToken(operatorId, expiresDays = 30) {
    const expiresAt = new Date(
      Date.now() + expiresDays * 24 * 60 * 60 * 1000
    ).toISOString();

    const response = await axios.post(
      `${this.baseUrl}/api/operator/get-token`,
      { id: operatorId, expiresAt },
      {
        headers: {
          Authorization: `Bearer ${this.companyToken}`
        }
      }
    );

    const token = response.data;
    this.operatorTokens[operatorId] = token;
    return token;
  }

  async validateToken(token) {
    const response = await axios.post(
      `${this.baseUrl}/api/operator/validate-token`,
      { token },
      {
        headers: {
          Authorization: `Bearer ${this.companyToken}`
        }
      }
    );

    return response.data;
  }
}

// Usage
const auth = new ChatHubAuth('https://chatapi.smsbat.com');

async function authenticate() {
  // Get company token
  const companyToken = await auth.getCompanyToken('login', 'password');

  // Get operator token
  const operatorToken = await auth.getOperatorToken(123, 30);

  // Validate token
  const validation = await auth.validateToken(operatorToken);
  console.log('Token valid:', validation.isValid);
}

authenticate();

PHP

<?php

class ChatHubAuth {
    private $baseUrl;
    private $companyToken;
    private $operatorTokens = [];

    public function __construct($baseUrl) {
        $this->baseUrl = $baseUrl;
    }

    public function getCompanyToken($login, $password) {
        $ch = curl_init($this->baseUrl . '/api/company/get-token');

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json'
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
            'login' => $login,
            'password' => $password
        ]));

        $response = curl_exec($ch);
        curl_close($ch);

        $this->companyToken = json_decode($response);
        return $this->companyToken;
    }

    public function getOperatorToken($operatorId, $expiresDays = 30) {
        $expiresAt = date(
            'Y-m-d\TH:i:s\Z',
            time() + ($expiresDays * 24 * 60 * 60)
        );

        $ch = curl_init($this->baseUrl . '/api/operator/get-token');

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $this->companyToken
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
            'id' => $operatorId,
            'expiresAt' => $expiresAt
        ]));

        $response = curl_exec($ch);
        curl_close($ch);

        $token = json_decode($response);
        $this->operatorTokens[$operatorId] = $token;
        return $token;
    }

    public function validateToken($token) {
        $ch = curl_init($this->baseUrl . '/api/operator/validate-token');

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $this->companyToken
        ]);
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
            'token' => $token
        ]));

        $response = curl_exec($ch);
        curl_close($ch);

        return json_decode($response, true);
    }
}

// Usage
$auth = new ChatHubAuth('https://chatapi.smsbat.com');

// Get company token
$companyToken = $auth->getCompanyToken('login', 'password');

// Get operator token
$operatorToken = $auth->getOperatorToken(123, 30);

// Validate token
$validation = $auth->validateToken($operatorToken);
echo "Token valid: " . ($validation['isValid'] ? 'Yes' : 'No');

အကောင်းဆုံးအလေ့အကျင့်များ

တိုကင်သိုလှောင်မှု

  • ✅ တိုကင်များကို လုံခြုံစွာ သိမ်းဆည်းပါ (ကုဒ်ဝှက်ထားသော ဒေတာဘေ့စ်၊ လျှို့ဝှက်မန်နေဂျာ)
  • ✅ ဗားရှင်းထိန်းချုပ်မှုတွင် တိုကင်များကို ဘယ်တော့မှ မကျူးလွန်ပါနှင့်
  • ✅ အထောက်အထားများအတွက် ပတ်၀န်းကျင်ပြောင်းလွဲချက်များကို အသုံးပြုပါ။
  • ❌ တိုကင်များကို ရိုးရိုးစာသားဖြင့် မသိမ်းဆည်းပါနှင့်
  • ❌ client-side code တွင် တိုကင်များကို မဖော်ပြပါနှင့်

တိုကင်လှည့်ခြင်း။

  • ကုမ္ပဏီတိုကင်များကို အခါအားလျော်စွာ လှည့်ပါ (3-6 လတစ်ကြိမ်)
  • အော်ပရေတာတိုကင်များအတွက် ကျိုးကြောင်းဆီလျော်သော သက်တမ်းကုန်ဆုံးချိန်ကို သတ်မှတ်ပါ (7-30 ရက်)
  • သက်တမ်းမကုန်ဆုံးမီ အလိုအလျောက် တိုကင်အသစ်ပြန်လည်ဆန်းသစ်မှုကို အကောင်အထည်ဖော်ပါ။
  • အော်ပရေတာများထွက်ခွာသောအခါတိုကင်များကိုပြန်လည်ရုပ်သိမ်းပါ။

မှားယွင်းကိုင်တွယ်ခြင်း။

async function authenticateWithRetry(login, password, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await getCompanyToken(login, password);
    } catch (error) {
      if (error.response?.status === 401) {
        throw new Error('Invalid credentials');
      }

      if (i === retries - 1) throw error;

      // Wait before retry
      await new Promise(resolve =>
        setTimeout(resolve, Math.pow(2, i) * 1000)
      );
    }
  }
}

တိုကင်အတည်ပြုခြင်း။

အရေးကြီးသောလုပ်ဆောင်မှုများမတိုင်မီ အမြဲတမ်းတိုကင်များကို တရားဝင်စစ်ဆေးပါ

async function performSecureOperation(token, operation) {
  // Validate token first
  const validation = await validateToken(token);

  if (!validation.isValid) {
    throw new Error('Token expired or invalid');
  }

  // Proceed with operation
  return await operation();
}

လုံခြုံရေး ထည့်သွင်းစဉ်းစားမှုများ

HTTPS သာလျှင်

အထောက်အထားစိစစ်ခြင်း တောင်းဆိုချက်များကို ပေးပို့သည့်အခါ HTTPS ကို အမြဲသုံးပါ-

// ✅ Correct
const baseUrl = 'https://chatapi.smsbat.com';

// ❌ Wrong - never use HTTP for authentication
const baseUrl = 'http://api.chathub.smsbat.com';

တိုကင်နယ်ပယ်

လုပ်ဆောင်ချက်တစ်ခုစီအတွက် သင့်လျော်သော တိုကင်ကို အသုံးပြုပါ-

  • Company Token- အဖွဲ့အစည်းစီမံခန့်ခွဲမှု၊ အော်ပရေတာဖန်တီးခြင်း။
  • အော်ပရေတာတိုကင်- ချက်တင်လုပ်ဆောင်မှုများ၊ မက်ဆေ့ချ်ကိုင်တွယ်ခြင်း။

နှုန်းထားကန့်သတ်ခြင်း။

အထောက်အထားစိစစ်ခြင်းတောင်းဆိုမှုများအတွက် နှုန်းကန့်သတ်ချက်ကို အကောင်အထည်ဖော်ပါ-

class RateLimitedAuth {
  constructor() {
    this.lastRequest = 0;
    this.minInterval = 1000; // 1 second between requests
  }

  async getToken(login, password) {
    const now = Date.now();
    const timeSinceLastRequest = now - this.lastRequest;

    if (timeSinceLastRequest < this.minInterval) {
      await new Promise(resolve =>
        setTimeout(resolve, this.minInterval - timeSinceLastRequest)
      );
    }

    this.lastRequest = Date.now();
    return await makeAuthRequest(login, password);
  }
}

ပြဿနာဖြေရှင်းခြင်း။

401 ခွင့်ပြုချက်မရှိပါ။

  • အထောက်အထားများ မှန်ကန်ကြောင်း အတည်ပြုပါ။
  • စစ်ဆေးရန် တိုကင်သည် သက်တမ်းမကုန်သေးပါ။
  • တောင်းဆိုချက်ခေါင်းစီးများတွင် တိုကင်ပါဝင်ကြောင်း သေချာပါစေ။
  • တိုကင်ဖော်မတ်ကို အတည်ပြုပါ။

၄၀၃ တားမြစ်ထားသည်။

  • တိုကင်တွင် ခွင့်ပြုချက်များ လိုအပ်ကြောင်း အတည်ပြုပါ။
  • မှန်ကန်သော တိုကင်အမျိုးအစားကို အသုံးပြုခြင်းရှိမရှိ စစ်ဆေးပါ (ကုမ္ပဏီနှင့် အော်ပရေတာ)
  • တိုကင်ကို မရုပ်သိမ်းကြောင်း သေချာပါစေ။

တိုကင် သက်တမ်းကုန်သွားပါပြီ။

  • တိုကင်အသစ်ကိုတောင်းဆိုပါ။
  • အလိုအလျောက် တိုကင်ပြန်လည်စတင်ခြင်းကို အကောင်အထည်ဖော်ပါ။
  • သင့်လျော်သော သက်တမ်းကုန်ဆုံးချိန်ကို သတ်မှတ်ပါ။

နောက်အဆင့်များ