คีย์ Sandbox และการหมุนคีย์
หน้านี้ใช้ได้เฉพาะ Merchant ที่กำลังอยู่ใน home scope ของตัวเองบน sandbox เท่านั้น White Label, Agent, การสลับไปดูลูกข่าย และทุก live session จะไม่เห็นเมนูและเรียก route ไม่ได้
สิ่งที่หน้าจออ่านได้
GET /v1/bo/sandbox?scope_id=<merchant UUID> คืน metadata แบบไม่มี secret:
- current credential UUID, prefix
sk_test, fixed scopesdeposits:readและdeposits:write; - วันสร้างและวันหมดอายุที่ระบบกำหนดไว้ 90 วันพอดี;
- singleton-slot
revisionซึ่งต้องตรงกับ responseETag; - predecessor ที่ยังใช้ได้และเวลา
valid_untilถ้ามี overlap อยู่.
Plaintext, suffix, digest, R2 reference, ciphertext และ keyring metadata ไม่อยู่ใน response โดยโครงสร้าง หาก client พบ field นอก closed schema จะทิ้ง response ทั้งก้อน.
เลือกนโยบายก่อนหมุน
| ตัวเลือก | ผลที่เกิด |
|---|---|
ทันที (overlap_seconds=0) | คีย์ปัจจุบันและ predecessor ที่เหลือถูกยกเลิกใน commit เดียว เหมาะกับเหตุด้านความปลอดภัย |
ผ่อนผัน 5 นาที (overlap_seconds=300) | คีย์ใหม่ใช้ได้ทันที และคีย์เดิมใช้ต่อถึง DB clock +5 นาที เหมาะกับการสลับระบบตามแผน |
มี predecessor ที่ยัง active ได้สูงสุดหนึ่งคีย์ การขอ overlap ซ้อนตอบ 409 sandbox_overlap_active; กดหมุนทันทีได้เพื่อ collapse chain โดยไม่ต่ออายุเวลาเดิม.
Flow ที่ UI ต้องใช้
- อ่าน metadata ล่าสุดและเก็บ
credential.id,revisionกับETag. - ผู้ใช้เลือกทันทีหรือ 5 นาทีและยืนยันเหตุผล.
- UI เปิด fresh OIDC popup จาก click gesture แล้วเรียก
POST /v1/bo/auth/step-up/sandbox. Proof ผูก exact body bytes, revision, credential, scope, overlap และ idempotency key. - Callback ส่ง exact-origin message ชนิด
paygate:sandbox-step-up; token ต้องขึ้นต้นpgsba1.และเก็บใน memory เท่านั้น. - ส่ง body bytes เดิมไป
POST /v1/bo/sandbox/rotateพร้อมContent-Type: application/json; charset=utf-8,If-Match,Idempotency-Key,X-PG-Step-Up-TokenและX-PG-BO-Client: 1.
ครั้งแรกที่สำเร็จจะได้ secret รูป sk_test_<43 base64url chars> ครั้งเดียว. ให้คัดลอก ไปเก็บใน secret manager แล้วปิด dialog; UI ล้าง plaintext เมื่อปิด dialog เปลี่ยนหน้า หรือ logout. ระบบไม่มี endpoint สำหรับเปิดดูย้อนหลัง.
Response หายหลัง commit
Retry ด้วย idempotency key เดิมจะได้ metadata เดิมพร้อม Idempotency-Replayed: true, secret_available=false และ secret=null เพื่อไม่เปิด secret ซ้ำ หากไม่ได้เก็บ secret จาก response แรก ให้หมุนคีย์ใหม่อีกครั้ง.
Error ที่ต้องจัดการ
404 sandbox_credential_not_found— scope/session ไม่ใช่ exact Merchant sandbox หรือ slot เปลี่ยนไป;409 sandbox_version_conflict— refetch metadata และให้ผู้ใช้ตรวจใหม่;409 sandbox_overlap_active— รอvalid_untilหรือเลือกหมุนทันทีด้วย idempotency key ใหม่;401 step_up_required— เริ่ม fresh popup ใหม่ ห้าม reuse token;428 mutation_precondition_required—If-Matchหายหรือผิดรูป;503 sandbox_rotation_unavailable— หยุดและ retry แบบมี backoff; ห้ามสร้าง secret ฝั่ง browser.
Preview เป็น read-only และไม่จำลอง rotation สำเร็จหรือสร้าง secret.
