สารบัญ

ต่อระบบ

ล็อกอินบัญชีทดสอบใน CI

ให้ e2e ได้ session ของบัญชีทดสอบเองด้วย createTestSession โดยไม่คัดลอก cookie

ให้ e2e ใน CI ได้ session ของ บัญชีทดสอบ เอง โดยไม่ต้องมีคนคัดลอก cookie — ใช้ createTestSession จาก @suphark/auth-client/testing (≥ 0.8.0)

ทำไมปลอดภัย

คำขอต้องผ่านทุกด่านพร้อมกัน และทุกด่านปิดเป็นค่าเริ่มต้น:

  1. สวิตช์ของแพลตฟอร์มเปิดอยู่ และสวิตช์ของแอปเปิดอยู่
  2. แอปเป็น แอป dev (redirect URI ทุกตัวเป็น localhost) — แอป production เปิดไม่ได้เด็ดขาด
  3. บัญชีอยู่ในรายชื่อบัญชีทดสอบของแอป ไม่มีสิทธิ์ผู้ดูแลแพลตฟอร์ม และไม่เป็นสมาชิกองค์กร production
  4. ใช้ได้เฉพาะองค์กรชนิด SANDBOX ที่ติดตั้งแอปนี้ — token ใช้ได้กับแอปนี้เท่านั้น ไม่มี Management API ไม่มี refresh token

session อายุ 15 นาที ทุกครั้งที่ออกหรือถูกปฏิเสธบันทึก audit (test_login.issued / test_login.denied)

ตั้งค่าครั้งเดียว

  1. ผู้ดูแลแพลตฟอร์ม: เปิดสวิตช์และเตรียมองค์กรทดสอบ

    แพลตฟอร์ม → ตั้งค่า → "ล็อกอินบัญชีทดสอบของ CI" → เปิด (ยืนยันตัวตนซ้ำ) แล้วสร้างองค์กรทดสอบและตั้ง environment เป็น SANDBOX
  2. ผู้ดูแลองค์กรทดสอบ: ติดตั้งแอปและเชิญบัญชีทดสอบ

    ติดตั้งแอป ให้ role ที่ e2e ต้องใช้ แล้วเชิญบัญชีทดสอบเป็นสมาชิก — ตั้งนโยบาย MFA ขององค์กรนี้เป็น "ไม่บังคับ"
  3. เจ้าของแอป: ลงทะเบียนแอป dev

    ชื่อ <แอป>-dev redirect เป็น http://localhost:… ทั้งหมด (ดู แอป dev กับ production)
  4. เจ้าของแอป: เปิดล็อกอินทดสอบ

    หน้าแอป → ตั้งค่า → "ล็อกอินทดสอบ (CI)" → เปิดสวิตช์และใส่อีเมลบัญชีทดสอบ (ตรวจบัญชีให้ตอนบันทึก)

env ที่ CI ต้องมี (เก็บเป็น secret)

ตัวแปรค่า
PI_AUTH_ISSUERhttps://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_devredirect 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 ที่ขอ / รอแล้วลองใหม่