跳转到内容

会话访问和路由保护

在服务端,你可以像这样访问当前会话

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 来从使用 getServerSessiongetToken 的端点获取数据,你将需要手动传递 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
    })
  }
})

在 MIT 许可证下发布。