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) => { |
|||
if (PUBLIC_PATHS.includes(to.path)) return; |
|||
export default defineNuxtRouteMiddleware((to) => { |
|||
const { isLoggedIn } = useAuth(); |
|||
|
|||
try { |
|||
const res = await $fetch<{ code: number }>("/api/auth/me"); |
|||
if (res.code !== 0) { |
|||
return navigateTo("/login?redirect=" + encodeURIComponent(to.fullPath)); |
|||
if (isLoggedIn.value && AUTH_PATHS.includes(to.path)) { |
|||
return navigateTo("/"); |
|||
} |
|||
} catch { |
|||
|
|||
if (!AUTH_PATHS.includes(to.path) && !PUBLIC_PATHS.includes(to.path) && !isLoggedIn.value) { |
|||
return navigateTo("/login?redirect=" + encodeURIComponent(to.fullPath)); |
|||
} |
|||
}); |
|||
|
|||
@ -1,10 +1,12 @@ |
|||
<script setup lang="ts"> |
|||
|
|||
const { user, isLoggedIn } = useAuth() |
|||
</script> |
|||
|
|||
<template> |
|||
<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> |
|||
<p class="text-lg text-gray-600">This is the index page.</p> |
|||
<p>{{ isLoggedIn }}</p> |
|||
<p>{{ user }}</p> |
|||
</div> |
|||
</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"; |
|||
|
|||
export default defineWrappedResponseHandler(async () => { |
|||
export default defineWrappedResponseHandler({ auth: 'public' }, async () => { |
|||
const result = await createCaptcha(); |
|||
return R.success(result); |
|||
}); |
|||
|
|||
@ -1,4 +1,4 @@ |
|||
export default defineWrappedResponseHandler(async (event) => { |
|||
export default defineWrappedResponseHandler({ auth: 'public' }, async (event) => { |
|||
deleteCookie(event, "token", { path: "/" }); |
|||
return R.success(null); |
|||
}); |
|||
|
|||
@ -1,16 +1,5 @@ |
|||
import { getUserFromEvent } from "#server/utils/jwt"; |
|||
import { getCurrentUser } from "#server/service/auth"; |
|||
import { getContextUser } from "#server/utils/context"; |
|||
|
|||
export default defineWrappedResponseHandler(async (event) => { |
|||
const payload = getUserFromEvent(event); |
|||
if (!payload) { |
|||
return R.error("未登录", null); |
|||
} |
|||
|
|||
const user = await getCurrentUser(payload); |
|||
if (!user) { |
|||
return R.error("用户不存在", null); |
|||
} |
|||
|
|||
return R.success({ user }); |
|||
return R.success({ user: getContextUser(event) }); |
|||
}); |
|||
|
|||
@ -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