跳到内容

JWT 访问

获取当前用户的(解码后的)JWT令牌可能很有帮助,例如,使用它来访问需要此令牌进行身份验证或授权的外部API。

您可以使用 getToken 获取随请求一起传递的 JWT 令牌

ts
// file: ~/server/api/token.get.ts
import { getToken } from '#auth'

export default eventHandler(async (event) => {
  const token = await getToken({ event })

  return token || 'no token present'
})

此函数的行为与 getToken 函数从 NextAuth.js 完全相同,但有一个变化:您必须传入 h3-event 而不是 req。这是因为在 h3 上访问 Cookie 的方式:不是通过 req.cookies 而是通过 useCookies(event)

您无需传入任何其他参数,例如 secret, secureCookie, ...。如果未设置,它们会自动推断为您配置的值,并且令牌读取将开箱即用。您可以传递这些选项,例如,要获取原始的、编码的 JWT 令牌,您可以传递 raw: true

应用侧 JWT 令牌访问

要在应用侧(例如,在 .vue 页面中)访问 JWT 令牌,您可以选择

  • 创建一个 API 端点以返回解码后的 JWT 令牌
  • 修改 NuxtAuthHandler 中的 jwt 回调以将令牌数据注入到应用侧会话中。在此处阅读更多信息 here

通过 API 端点访问 JWT 令牌

要通过 API 端点访问 JWT 令牌,您首先需要创建一个新的服务端路由,该路由可以处理 JWT 令牌的请求。

ts
// file: ~/server/api/token.get.ts
import { getToken } from '#auth'

export default eventHandler(event => getToken({ event }))

然后从您的应用侧代码,您可以像这样获取它

vue
<script setup lang="ts">
const headers = useRequestHeaders(['cookie']) as HeadersInit
const { data: token } = await useFetch('/api/token', { headers })
</script>

<template>
  <div>{{ token || 'no token present, are you logged in?' }}</div>
</template>

注意

为了使此功能正常工作,您需要使用 useRequestHeaders 手动传递 cookie-header,以便在此页面在通用渲染过程中在服务端渲染时,Cookie 也能被正确传递。

在 MIT 许可证下发布。