From f9e8be933e0f05d13f045648cbc8606e1fd3c09b Mon Sep 17 00:00:00 2001 From: npmrun <1549469775@qq.com> Date: Sun, 24 May 2026 21:55:43 +0800 Subject: [PATCH] feat(auth): implement session management and authentication middleware - Added constants for session management in `auth.ts`. - Created an authentication guard middleware in `02.auth-guard.ts` to protect API routes. - Introduced caching mechanism in `00.cache.ts` and `01.context.ts` for improved performance. - Developed user authentication context in `context.ts` to manage user sessions. - Implemented cookie handling functions in `cookie.ts` for session management. - Added error handling for authentication in `errors.ts`. - Enhanced user authentication logic in `index.ts` with session creation and validation. - Created captcha service for user registration and login in `captcha` directory. - Established configuration management with error handling in `config` directory. - Added utility functions for admin role verification and API route allowlisting. - Implemented rate limiting to prevent abuse of API endpoints. --- app/pages/auth/index.vue | 2 ++ packages/drizzle-pkg/db.sqlite | Bin 237568 -> 262144 bytes 2 files changed, 2 insertions(+) diff --git a/app/pages/auth/index.vue b/app/pages/auth/index.vue index 5b4c101..18e8c4f 100644 --- a/app/pages/auth/index.vue +++ b/app/pages/auth/index.vue @@ -25,6 +25,7 @@ const loginError = ref('') const registerError = ref('') const loginLoading = ref(false) const registerLoading = ref(false) +const { refresh } = useAuthSession() async function fetchCaptcha() { captcha.loading = true @@ -53,6 +54,7 @@ async function handleLogin() { captchaAnswer: captcha.answer, }, }) + await refresh(true) await navigateTo('/') } catch (e: any) { loginError.value = e?.data?.statusMessage || e?.message || '登录失败' diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite index a327d15eaa27224503770b08670f0cf800c8cdbf..f0d8f9ffcc76c4693a11f5c42fc315af22180cd8 100644 GIT binary patch delta 16532 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