16 changed files with 87 additions and 43 deletions
@ -1,14 +1,14 @@ |
|||||
const PUBLIC_PATHS = ["/", "/index", "/login", "/register"]; |
const PUBLIC_PATHS = ["/", "/index"]; |
||||
|
const AUTH_PATHS = ["/login", "/register"]; |
||||
|
|
||||
export default defineNuxtRouteMiddleware(async (to) => { |
export default defineNuxtRouteMiddleware((to) => { |
||||
if (PUBLIC_PATHS.includes(to.path)) return; |
const { isLoggedIn } = useAuth(); |
||||
|
|
||||
try { |
if (isLoggedIn.value && AUTH_PATHS.includes(to.path)) { |
||||
const res = await $fetch<{ code: number }>("/api/auth/me"); |
return navigateTo("/"); |
||||
if (res.code !== 0) { |
|
||||
return navigateTo("/login?redirect=" + encodeURIComponent(to.fullPath)); |
|
||||
} |
} |
||||
} catch { |
|
||||
|
if (!AUTH_PATHS.includes(to.path) && !PUBLIC_PATHS.includes(to.path) && !isLoggedIn.value) { |
||||
return navigateTo("/login?redirect=" + encodeURIComponent(to.fullPath)); |
return navigateTo("/login?redirect=" + encodeURIComponent(to.fullPath)); |
||||
} |
} |
||||
}); |
}); |
||||
|
|||||
@ -1,10 +1,12 @@ |
|||||
<script setup lang="ts"> |
<script setup lang="ts"> |
||||
|
const { user, isLoggedIn } = useAuth() |
||||
</script> |
</script> |
||||
|
|
||||
<template> |
<template> |
||||
<div class="flex flex-col items-center justify-center min-h-screen"> |
<div class="flex flex-col items-center justify-center min-h-screen"> |
||||
<h1 class="text-4xl font-bold mb-4">Welcome to Nuxt 3!</h1> |
<h1 class="text-4xl font-bold mb-4">Welcome to Nuxt 3!</h1> |
||||
<p class="text-lg text-gray-600">This is the index page.</p> |
<p class="text-lg text-gray-600">This is the index page.</p> |
||||
|
<p>{{ isLoggedIn }}</p> |
||||
|
<p>{{ user }}</p> |
||||
</div> |
</div> |
||||
</template> |
</template> |
||||
@ -0,0 +1,4 @@ |
|||||
|
export default defineNuxtPlugin(async () => { |
||||
|
const { loadUser } = useAuth() |
||||
|
await loadUser() |
||||
|
}) |
||||
Binary file not shown.
@ -1,6 +1,6 @@ |
|||||
import { createCaptcha } from "#server/service/auth"; |
import { createCaptcha } from "#server/service/auth"; |
||||
|
|
||||
export default defineWrappedResponseHandler(async () => { |
export default defineWrappedResponseHandler({ auth: 'public' }, async () => { |
||||
const result = await createCaptcha(); |
const result = await createCaptcha(); |
||||
return R.success(result); |
return R.success(result); |
||||
}); |
}); |
||||
|
|||||
@ -1,4 +1,4 @@ |
|||||
export default defineWrappedResponseHandler(async (event) => { |
export default defineWrappedResponseHandler({ auth: 'public' }, async (event) => { |
||||
deleteCookie(event, "token", { path: "/" }); |
deleteCookie(event, "token", { path: "/" }); |
||||
return R.success(null); |
return R.success(null); |
||||
}); |
}); |
||||
|
|||||
@ -1,16 +1,5 @@ |
|||||
import { getUserFromEvent } from "#server/utils/jwt"; |
import { getContextUser } from "#server/utils/context"; |
||||
import { getCurrentUser } from "#server/service/auth"; |
|
||||
|
|
||||
export default defineWrappedResponseHandler(async (event) => { |
export default defineWrappedResponseHandler(async (event) => { |
||||
const payload = getUserFromEvent(event); |
return R.success({ user: getContextUser(event) }); |
||||
if (!payload) { |
|
||||
return R.error("未登录", null); |
|
||||
} |
|
||||
|
|
||||
const user = await getCurrentUser(payload); |
|
||||
if (!user) { |
|
||||
return R.error("用户不存在", null); |
|
||||
} |
|
||||
|
|
||||
return R.success({ user }); |
|
||||
}); |
}); |
||||
|
|||||
@ -0,0 +1,9 @@ |
|||||
|
import type { getCurrentUser } from "#server/service/auth"; |
||||
|
|
||||
|
type CurrentUser = Exclude<Awaited<ReturnType<typeof getCurrentUser>>, null>; |
||||
|
|
||||
|
declare module "h3" { |
||||
|
interface H3EventContext { |
||||
|
user?: CurrentUser; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
import type { H3Event } from "h3"; |
||||
|
import type { getCurrentUser } from "#server/service/auth"; |
||||
|
|
||||
|
type CurrentUser = Exclude<Awaited<ReturnType<typeof getCurrentUser>>, null>; |
||||
|
|
||||
|
/** |
||||
|
* 设置当前登录用户到 event.context |
||||
|
*/ |
||||
|
export function setContextUser(event: H3Event, user: CurrentUser): void { |
||||
|
(event.context as Record<string, unknown>).user = user; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 从 event.context 获取当前登录用户 |
||||
|
*/ |
||||
|
export function getContextUser(event: H3Event): CurrentUser | undefined { |
||||
|
return (event.context as Record<string, unknown>).user as CurrentUser | undefined; |
||||
|
} |
||||
Loading…
Reference in new issue