ระหว่างลองเชื่อม Better Auth บน Cloudflare Pages พบว่าเกิดข้อผิดพลาด CPU time limit อย่างต่อเนื่อง จึงลองทำสิ่งนี้ขึ้นมาร่วมกับ Codex

Cloudflare เปิดให้ Worker แต่ละตัวสื่อสารกันโดยตรงได้ผ่าน Service Binding และ WorkerEntrypoint RPC โดยไม่ต้องมี public URL ทำให้ฟังก์ชันที่มีลักษณะเป็นโครงสร้างพื้นฐานภายในเหมาะกับแนวทางนี้มากกว่า จึงได้ลองออกแบบเทมเพลต private password hasher Worker ที่สามารถใช้กับตรรกะยืนยันตัวตนอย่าง Better Auth ได้

โครงสร้างนั้นเรียบง่าย โดย caller Worker ที่รับผิดชอบ auth จะเชื่อม hasher Worker ผ่าน private service binding และการแฮชกับการตรวจสอบจริงจะถูกเรียกผ่านเมธอด RPC อย่าง hashPassword() / verifyPassword() เท่านั้น ส่วน HTTP สาธารณะจะมีไว้ขั้นต่ำเพียง GET / สำหรับ metadata/health เท่านั้น และตั้งสมมติฐานพื้นฐานว่าจะไม่เปิดเผยการแฮชรหัสผ่านออกเป็น external endpoint กล่าวคือ แทนที่จะเป็น “การเปิดเผย hash API” จะใกล้เคียงกับ “การแยก password hashing ออกเป็นคอมโพเนนต์ Worker ภายใน Cloudflare” มากกว่า

การติดตั้งใช้งานวาง TypeScript Worker shell ไว้ด้านบนและใช้ Rust/Wasm kernel ด้านล่าง (ตัดสินใจหลังทดสอบ benchmark แบบง่ายเพื่อเทียบกับการใช้ Rust ทั้งหมด) โดยเลือก Argon2id เป็นอัลกอริทึมแฮช หลักสำคัญของเทมเพลตนี้ไม่ได้อยู่ที่การแนะนำ Argon2id เอง แต่อยู่ที่การแยกขอบเขตการทำงานของ password hashing ภายใน Cloudflare Workers เพื่อการปฏิบัติการ แอป Worker จะโฟกัสกับ authentication flow และการจัดการ session ขณะที่ hasher Worker แยกมารับผิดชอบการแฮชและการตรวจสอบ

ยังได้คำนึงถึงโฟลว์การใช้งานร่วมกับ Better Auth ด้วย โดย Better Auth ใช้ scrypt เป็นค่าเริ่มต้น แต่สามารถปรับแต่ง password hash/verify ได้ จึงเชื่อมในลักษณะที่ caller Worker เรียก hasher Worker ได้ และแม้บัญชีเดิมจะใช้ฟอร์แมต legacy scrypt ก็สมมติให้สามารถตรวจสอบตอนล็อกอินแล้วค่อยอัปเกรดแบบค่อยเป็นค่อยไปไปเป็นแฮช Argon2id ใหม่ผ่าน verifyAndMaybeRehash() กล่าวคือ แทนที่จะบังคับให้ผู้ใช้เดิมเปลี่ยนรหัสผ่านทั้งหมดในคราวเดียว แนวคิดคือย้ายไปใช้ preset ที่แข็งแกร่งกว่าทีละน้อยตามทราฟฟิกการล็อกอินจริง

ในมุมของการปฏิบัติการ ยังสะท้อนด้วยว่าไม่ควรมอง Cloudflare Free และ Paid ด้วยเกณฑ์เดียวกัน บน Free นั้นข้อจำกัด CPU ต่ำกว่า ทำให้การใช้ค่าเริ่มต้นของ Argon2id ตรง ๆ อาจหนักเกินไป จึงคิดถึงการแยก preset อย่าง standard-2026q1 และ free-tier-fallback-2026q1 เอาไว้ต่างหาก อย่างไรก็ตาม fallback preset เป็นเพียงทางประนีประนอมเชิงปฏิบัติการที่คำนึงถึงข้อจำกัดของแพลตฟอร์ม ไม่ได้ตั้งใจนำเสนอเป็นค่ามาตรฐานด้านความปลอดภัย แม้จะเริ่มต้นบน Free ก็ยังสามารถค่อย ๆ rehash ไปใช้ Argon2id preset ที่แข็งแกร่งขึ้นภายหลังเมื่ออัปเกรดเป็น Paid ได้ โดยเอกสารและตัวอย่างได้ใส่โฟลว์ gradual migration ไว้ด้วย

สรุปแล้ว เทมเพลตนี้ไม่ได้ใกล้กับคำถามว่า “จะคำนวณ password hash บน Cloudflare Workers อย่างไร” เท่ากับคำถามว่า “จะจัดแยกขอบเขตการทำงานของ password hashing บน Cloudflare Workers เพื่อใช้งานจริงอย่างไร” มากกว่า น่าจะเป็นจุดเริ่มต้นที่ดีสำหรับกรณีที่ต้องการรัน Better Auth บน Workers และแยกภาระของช่วงแฮชออกมา ไม่ต้องการเปิด public hash endpoint หรืออยากย้ายบัญชี legacy scrypt ไปเป็น Argon2id แบบค่อยเป็นค่อยไป

repo: https://github.com/imjlk/cloudflare-auth-hasher-template
benchmark: https://github.com/imjlk/cloudflare-auth-hasher-template/tree/codex/benchmark-workspace
deploy: [ลิงก์ Deploy to Cloudflare] (หลังจากเข้าสู่ระบบบัญชี Cloudflare แล้ว สามารถลอง deploy ได้ทันที)

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น