Refactor authentication flow and ticket handling in add-in
All checks were successful
Deploy eCourt Note Web to Server / Validate Database Schema (Drizzle) (push) Successful in 4s
Deploy eCourt Note Web to Server / Build Web Docker Image (push) Successful in 1m23s
Deploy eCourt Note Web to Server / Deploy eCourt Note Web to Server (push) Successful in 5s
Deploy eCourt Note Web to Server / Notify Deployment Status (push) Successful in 0s
All checks were successful
Deploy eCourt Note Web to Server / Validate Database Schema (Drizzle) (push) Successful in 4s
Deploy eCourt Note Web to Server / Build Web Docker Image (push) Successful in 1m23s
Deploy eCourt Note Web to Server / Deploy eCourt Note Web to Server (push) Successful in 5s
Deploy eCourt Note Web to Server / Notify Deployment Status (push) Successful in 0s
- Removed client-side HMAC verification; server now handles all HMAC checks. - Updated ticket processing logic to improve UX and security. - Adjusted API request handling to return discriminated results based on HTTP status. - Enhanced error messages for better clarity on authentication failures. - Added unit tests for the new token endpoint to ensure compliance with updated contract. - Cleaned up unused code and comments related to previous HMAC handling.
This commit is contained in:
parent
2e951f99f4
commit
c0833c00f7
24 changed files with 858 additions and 460 deletions
|
|
@ -1,7 +1,9 @@
|
|||
// PLAN-ADDIN-AUTH.md §4 — ticket ของ add-in (custom properties `ticket_data` +
|
||||
// `HmacSha256` ที่ e-Court ผ่านกลุ่ม template stamp ลงไฟล์) — ส่วน pure ที่
|
||||
// ใช้ร่วมกันทั้งฝั่ง server (lib/addin-ticket.ts — route /api/documents/token)
|
||||
// และฝั่ง client ของ add-in (wordaddin/services/ticketService.ts)
|
||||
// และฝั่ง client ของ add-in (wordaddin/services/authService.ts — ใช้แค่
|
||||
// parse + exp เป็น UX gate การตรวจ HMAC เป็นของ server อย่างเดียวตาม
|
||||
// PLAN-SSO.md D13, 2026-11-04)
|
||||
//
|
||||
// กติกา (docs/requirement/addin-workflow.md + lib/lib-utils.ts generateHmacSha256
|
||||
// ของตัว stamp ฝั่ง template):
|
||||
|
|
@ -10,8 +12,7 @@
|
|||
// - HmacSha256 เป็น hex lowercase 64 ตัว (การเทียบ normalize เป็น lowercase
|
||||
// ให้ก่อน — ฝั่ง stamp ตัวพิมพ์ใหญ่ก็ผ่านได้)
|
||||
// - ห้าม import อะไรที่เป็น platform-specific (node:crypto/crypto.subtle) —
|
||||
// module นี้ต้องรันได้ทั้งใน route handler และ webview ของ Word โดยส่ง
|
||||
// ตัวคำนวณ HMAC เข้ามาทาง parameter แทน
|
||||
// module นี้ต้องรันได้ทั้งใน route handler และ webview ของ Word
|
||||
|
||||
/** ticket ที่แกะจาก ticket_data — ชื่อ field ตามที่ e-Court กำหนด (requirement) */
|
||||
export interface DocverTicket {
|
||||
|
|
@ -216,25 +217,9 @@ export function isTicketExpired(exp: number, nowSec: number = Math.floor(Date.no
|
|||
/**
|
||||
* normalize ค่า digest ที่ได้รับ (property `HmacSha256` / body field) —
|
||||
* trim + lowercase แล้วตรวจว่าเป็น hex ครบ 64 ตัว คืน null เมื่อรูปไม่ใช่
|
||||
* (ใช้ฝั่ง server ตอนเทียบ HMAC — lib/addin-ticket.ts)
|
||||
*/
|
||||
export function normalizeHexDigest(value: string): string | null {
|
||||
const normalized = value.trim().toLowerCase();
|
||||
return /^[0-9a-f]{64}$/.test(normalized) ? normalized : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* เทียบ hex digest สองค่าแบบ constant-time (best-effort ของ pure JS —
|
||||
* ฝั่ง server จริงใช้ node:crypto timingSafeEqual ผ่าน lib/addin-ticket.ts
|
||||
* ตัวนี้ใช้กับ UX gate ฝั่ง client เป็นหลัก) — ค่าที่ส่งเข้าควร normalize แล้ว
|
||||
*/
|
||||
export function timingSafeEqualHex(a: string, b: string): boolean {
|
||||
if (a.length !== b.length) return false;
|
||||
let diff = 0;
|
||||
for (let i = 0; i < a.length; i++) {
|
||||
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
||||
}
|
||||
return diff === 0;
|
||||
}
|
||||
|
||||
/** ตัวคำนวณ HMAC-SHA256 คืนค่าเป็น hex lowercase — สองฝั่งฉีดของตัวเอง (Web Crypto / node:crypto) */
|
||||
export type HmacSha256Hex = (message: string, secret: string) => Promise<string>;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue