`/api/auth/otp`:發送一次性驗證碼
以 `sid` 生成匿名學校電郵格式,並使用 KV 做 60 秒限流與 5 分鐘 OTP 保存。
await env.KV.put(`OTP:${email}`, otp, { expirationTtl: 300 });
本頁是整理系統之設計承諾及公開審查摘要,供讀者了解系統架構與實踐現況。
文件中將提供 Onyx Secret 部分後端系統架構、認證流程、主要 API 路由及行為規則等核心設計決策,供安全研究人員及一般用戶參考。歡迎提出建議與改進意見。基於安全考量,我們不會公開真實後端的完整原始碼。
以 `sid` 生成匿名學校電郵格式,並使用 KV 做 60 秒限流與 5 分鐘 OTP 保存。
await env.KV.put(`OTP:${email}`, otp, { expirationTtl: 300 });驗證成功後刪除 OTP、建立 `users` 記錄、再把 `SESSION:*` 存入 KV,cookie 使用 `HttpOnly`、`Secure`、`SameSite=Strict`。
const sessionToken = crypto.randomUUID();
await env.KV.put(`SESSION:${sessionToken}`, hashId, { expirationTtl: 604800 });密碼登入、首次設定 username/password、以及條款確認都以相同的 session 檢查運作。
未登入回傳 `loggedIn: false`;已登入則回傳匿名 mask,供前端顯示狀態。
使用者以 `hash_id` 作為主鍵;顯示時只露出前 8 碼 mask。電郵與密碼都經 `hashData()` + salt 處理。
`is_burnable` 文章在發布 24 小時後於 API 層直接隱藏,不再回傳內容。
const isBurned = post.is_burnable && (Date.now() - new Date(post.created_at).getTime() > 86400000);