ต่อระบบ
ล็อกอินบัญชีทดสอบใน CI
ให้ e2e ได้ session ของบัญชีทดสอบเองด้วย createTestSession โดยไม่คัดลอก cookie
ให้ e2e ใน CI ได้ session ของ บัญชีทดสอบ เอง โดยไม่ต้องมีคนคัดลอก cookie — ใช้ createTestSession จาก @suphark/auth-client/testing (≥ 0.8.0)
ทำไมปลอดภัย
คำขอต้องผ่านทุกด่านพร้อมกัน และทุกด่านปิดเป็นค่าเริ่มต้น:
- สวิตช์ของแพลตฟอร์มเปิดอยู่ และสวิตช์ของแอปเปิดอยู่
- แอปเป็น แอป dev (redirect URI ทุกตัวเป็น localhost) — แอป production เปิดไม่ได้เด็ดขาด
- บัญชีอยู่ในรายชื่อบัญชีทดสอบของแอป ไม่มีสิทธิ์ผู้ดูแลแพลตฟอร์ม และไม่เป็นสมาชิกองค์กร production
- ใช้ได้เฉพาะองค์กรชนิด SANDBOX ที่ติดตั้งแอปนี้ — token ใช้ได้กับแอปนี้เท่านั้น ไม่มี Management API ไม่มี refresh token
session อายุ 15 นาที ทุกครั้งที่ออกหรือถูกปฏิเสธบันทึก audit (test_login.issued / test_login.denied)
ตั้งค่าครั้งเดียว
ผู้ดูแลแพลตฟอร์ม: เปิดสวิตช์และเตรียมองค์กรทดสอบ
แพลตฟอร์ม → ตั้งค่า → "ล็อกอินบัญชีทดสอบของ CI" → เปิด (ยืนยันตัวตนซ้ำ) แล้วสร้างองค์กรทดสอบและตั้ง environment เป็น SANDBOXผู้ดูแลองค์กรทดสอบ: ติดตั้งแอปและเชิญบัญชีทดสอบ
ติดตั้งแอป ให้ role ที่ e2e ต้องใช้ แล้วเชิญบัญชีทดสอบเป็นสมาชิก — ตั้งนโยบาย MFA ขององค์กรนี้เป็น "ไม่บังคับ"เจ้าของแอป: ลงทะเบียนแอป dev
เจ้าของแอป: เปิดล็อกอินทดสอบ
หน้าแอป → ตั้งค่า → "ล็อกอินทดสอบ (CI)" → เปิดสวิตช์และใส่อีเมลบัญชีทดสอบ (ตรวจบัญชีให้ตอนบันทึก)
env ที่ CI ต้องมี (เก็บเป็น secret)
| ตัวแปร | ค่า |
|---|---|
PI_AUTH_ISSUER | https://auth.suphark.com (ไม่มี /api/auth) |
PI_AUTH_CLIENT_ID / PI_AUTH_CLIENT_SECRET | ของแอป dev (ไม่ใช่ production) |
PI_AUTH_SESSION_SECRET | ≥ 32 ตัวอักษร — ค่าเดียวกับที่แอปที่รันใน CI ใช้ |
PI_AUTH_TEST_EMAIL | อีเมลบัญชีทดสอบ |
PI_AUTH_TEST_TENANT | (ไม่บังคับ) slug องค์กร SANDBOX ถ้าบัญชีอยู่หลายองค์กร |
Playwright
e2e/global-setup.ts
import fs from "node:fs";
import { createTestSession } from "@suphark/auth-client/testing";
export default async function globalSetup() {
const s = await createTestSession({
issuer: process.env.PI_AUTH_ISSUER!,
clientId: process.env.PI_AUTH_CLIENT_ID!, // แอป dev ที่เปิดล็อกอินทดสอบไว้
clientSecret: process.env.PI_AUTH_CLIENT_SECRET!,
sessionSecret: process.env.PI_AUTH_SESSION_SECRET!,
email: process.env.PI_AUTH_TEST_EMAIL!,
cookieName: "my-app.session", // = session.cookieName ใน createPiAuth
appUrl: "http://localhost:3000",
});
fs.writeFileSync("e2e/.auth/state.json", JSON.stringify(s.storageState));
}
// playwright.config.ts: globalSetup + use: { storageState: "e2e/.auth/state.json" }- session ไม่มี refresh — ชุดทดสอบที่ยาวเกิน 15 นาทีให้เรียก
createTestSessionซ้ำ (เช่น fixture ต่อ worker) - ใช้ใน runtime ของแอปจริงไม่ได้ (ปฏิเสธเมื่อ
NODE_ENV=production) - เคยเก็บ cookie ของคนจริงเป็น secret ของ CI → ลบ secret นั้น และ sign out session นั้นทิ้ง
ถูกปฏิเสธ
error บอกเหตุผล (test-user grant denied: <เหตุผล> / TestSessionError.message):
| เหตุผล | แก้อย่างไร |
|---|---|
platform_disabled | สวิตช์แพลตฟอร์มปิด (ตอบเหมือนไม่มีความสามารถนี้) |
client_disabled | เปิดล็อกอินทดสอบที่หน้าแอป |
client_not_dev | redirect URI ของแอปต้องเป็น localhost ทั้งหมด |
user_not_listed / user_not_found | เพิ่มอีเมลในรายชื่อบัญชีทดสอบของแอป |
user_platform_role / user_in_production | ใช้บัญชีที่ไม่มีสิทธิ์แพลตฟอร์มและไม่อยู่ในองค์กร production |
no_sandbox_membership / tenant_not_sandbox / ambiguous_tenant | เชิญบัญชีเข้าองค์กร SANDBOX หรือระบุ PI_AUTH_TEST_TENANT |
app_not_installed | ติดตั้งแอปในองค์กร SANDBOX |
invalid_scope / rate_limited | ลด scope ที่ขอ / รอแล้วลองใหม่ |