คู่มือเชื่อมต่อสำหรับผู้พัฒนาระบบ
- ทำช่องทางตรวจรหัสผ่านใน lblhmed (ข้อ 1) ให้หน้ากลางเรียกใช้
- เพิ่มหน้า
/ssoทั้งสองระบบ (ข้อ 2) - ตั้งค่ารหัสลับในหน้ากลาง: LBLH_AUTH_URL, LBLH_AUTH_API_KEY, LBLH_SESSION_SECRET, LBLH_SSO_SECRET (ค่า LBLH_SSO_SECRET ต้องตรงกันทั้ง 3 ระบบ)
1. ช่องทางตรวจรหัสผ่าน
// POST (ตั้งค่า URL นี้เป็น LBLH_AUTH_URL)
// Header: X-Portal-Key: <LBLH_AUTH_API_KEY>
// Body: {"username":"...","password":"..."}
// ตอบกลับเมื่อสำเร็จ:
{"ok": true, "user_id": 123, "name": "นพ.สมชาย", "role": "แพทย์แผนไทย"}
// ไม่สำเร็จ: HTTP 401 {"ok": false}2. หน้า /sso (ตัวอย่าง PHP)
<?php // /sso (วางไว้ทั้ง lblhmed และ lblhq)
$secret = getenv('LBLH_SSO_SECRET');
$aud = 'lblhmed'; // ฝั่ง HQ ใช้ 'lblhq'
$t = explode('.', $_GET['token'] ?? '');
if (count($t) !== 3) { http_response_code(400); exit('bad token'); }
[$h, $b, $s] = $t;
$b64 = fn($x) => rtrim(strtr(base64_encode($x), '+/', '-_'), '=');
$sig = $b64(hash_hmac('sha256', "$h.$b", $secret, true));
if (!hash_equals($sig, $s)) { http_response_code(401); exit('invalid'); }
$p = json_decode(base64_decode(strtr($b, '-_', '+/')), true);
if ($p['aud'] !== $aud || $p['exp'] < time()) { http_response_code(401); exit('expired'); }
// กันใช้ซ้ำ: บันทึก $p['jti'] ลงตาราง sso_used_tokens (UNIQUE) ถ้าซ้ำให้ปฏิเสธ
// แล้วสร้าง session ของระบบตามปกติจาก $p['sub']
session_start();
$_SESSION['user_id'] = $p['sub'];
header('Location: /');บัตรผ่านมีอายุ 60 วินาที ใช้ได้ครั้งเดียว และระบุปลายทาง (aud) ชัดเจน