会话访问和路由保护
在服务端,你可以像这样访问当前会话
ts
import { getServerSession } from '#auth'
export default eventHandler(async (event) => {
const session = await getServerSession(event)
})
这受到了 NextAuth.js 的 getServerSession
的启发。它也避免了对 /api/auth/sessions
端点的外部 HTTP GET
请求,而是直接调用一个纯 JS 方法。
注意
如果你从你的应用组件中使用 Nuxt 的 useFetch
来从使用 getServerSession
或 getToken
的端点获取数据,你将需要手动传递 cookies,因为 Nuxt 3 的通用渲染在服务端运行时不会默认这样做。不传递 cookies 将导致 getServerSession
在从服务端调用时返回 null
,因为届时不会存在身份验证 cookies。这是一个手动传递 cookies 的示例
ts
const headers = useRequestHeaders(['cookie']) as HeadersInit
const { data: token } = await useFetch('/api/token', { headers })
端点保护
要保护一个端点,在获取之后检查会话
ts
// file: ~/server/api/protected.get.ts
import { getServerSession } from '#auth'
export default eventHandler(async (event) => {
const session = await getServerSession(event)
if (!session) {
return { status: 'unauthenticated!' }
}
return { status: 'authenticated!' }
})
服务端中间件
你也可以在 Nuxt 服务端中间件中使用它来一次性保护多个页面,并将身份验证逻辑从你的端点中分离出来
ts
// file: ~/server/middleware/auth.ts
import { getServerSession } from '#auth'
export default eventHandler(async (event) => {
const session = await getServerSession(event)
if (!session) {
throw createError({
statusMessage: 'Unauthenticated',
statusCode: 403
})
}
})