စစ်မှန်ကြောင်းအထောက်အထားပြခြင်း။
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"
}'
** တောင်းခံလွှာ-**
တုံ့ပြန်ချက်
"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 |
ကိန်းပြည့် | ဟုတ်တယ် | အော်ပရေတာ ID |
expiresAt |
string (ISO 8601) | ဟုတ်တယ် | တိုကင် သက်တမ်းကုန်ဆုံးရက်နှင့် အချိန် (ယခုမှ အများဆုံး 24 နာရီ) |
အရေးကြီးသည်- တိုကင်သက်တမ်းသည် 24 နာရီဖြစ်သည်။ expiresAt ကန့်သတ်ချက်သည် အနာဂတ်တွင် 24 နာရီထက် မပိုနိုင်ပါ။
တုံ့ပြန်ချက်
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJvcGVyYXRvcl9pZCI6MTIzLCJleHAiOjE3Mzc0MTI3OTl9.example_signature"
Operator Token ကိုသုံးပါ။
API တောင်းဆိုချက်များတွင် အော်ပရေတာ တိုကင်ကို ထည့်သွင်းပါ-
တိုကင်အတည်ပြုခြင်း။
၎င်းကိုအသုံးမပြုမီ တိုကင်တစ်ခုသည် တရားဝင်နေသေးကြောင်း စစ်ဆေးပါ။
အဆုံးမှတ်- 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..."
}'
** တောင်းခံလွှာ-**
** တုံ့ပြန်မှု (တရားဝင်တိုကင်) :**
{
"isValid": true,
"operatorId": 123,
"clientId": 0,
"expiresAt": "2025-12-31T23:59:59Z",
"error": null
}
တုံ့ပြန်မှု (မမှန်ကန်သော တိုကင်):
တိုကင်သက်တမ်းကုန်ဆုံးခြင်း။
ကုမ္ပဏီတိုကင်
- 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 ခွင့်ပြုချက်မရှိပါ။
- အထောက်အထားများ မှန်ကန်ကြောင်း အတည်ပြုပါ။
- စစ်ဆေးရန် တိုကင်သည် သက်တမ်းမကုန်သေးပါ။
- တောင်းဆိုချက်ခေါင်းစီးများတွင် တိုကင်ပါဝင်ကြောင်း သေချာပါစေ။
- တိုကင်ဖော်မတ်ကို အတည်ပြုပါ။
၄၀၃ တားမြစ်ထားသည်။
- တိုကင်တွင် ခွင့်ပြုချက်များ လိုအပ်ကြောင်း အတည်ပြုပါ။
- မှန်ကန်သော တိုကင်အမျိုးအစားကို အသုံးပြုခြင်းရှိမရှိ စစ်ဆေးပါ (ကုမ္ပဏီနှင့် အော်ပရေတာ)
- တိုကင်ကို မရုပ်သိမ်းကြောင်း သေချာပါစေ။
တိုကင် သက်တမ်းကုန်သွားပါပြီ။
- တိုကင်အသစ်ကိုတောင်းဆိုပါ။
- အလိုအလျောက် တိုကင်ပြန်လည်စတင်ခြင်းကို အကောင်အထည်ဖော်ပါ။
- သင့်လျော်သော သက်တမ်းကုန်ဆုံးချိန်ကို သတ်မှတ်ပါ။
နောက်အဆင့်များ
- အဖွဲ့အစည်းများ - အဖွဲ့အစည်းများကို စီမံခန့်ခွဲပါ။
- အော်ပရေတာ - အော်ပရေတာများနှင့် အလုပ်လုပ်ပါ။
- Widget ပေါင်းစည်းခြင်း - ချတ်ဝစ်ဂျက်ကို ပေါင်းစပ်ပါ