You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3中如何访问app.$keycloak、获取token及自动注入请求头?

在Nuxt3中访问Keycloak实例、获取Token及自动注入认证请求头

一、在页面中访问app.$keycloak实例

Nuxt3中,插件挂载到app上的属性,推荐通过useNuxtApp()这个composable来访问,适配<script setup>和选项式API两种写法:

在<script setup>中使用

<script setup>
import { useNuxtApp } from '#app'

const nuxtApp = useNuxtApp()
// 获取keycloak实例
const keycloak = nuxtApp.$keycloak
</script>

在选项式API中使用

<script>
export default {
  mounted() {
    // 直接通过this访问实例
    const keycloak = this.$keycloak
  }
}
</script>

二、获取Access Token

拿到Keycloak实例后,直接读取token属性即可(对应keycloak-js中的access_token),注意要先确认实例已完成认证:

const nuxtApp = useNuxtApp()
const keycloak = nuxtApp.$keycloak

// 先判断认证状态,避免获取到undefined
if (keycloak.authenticated) {
  const accessToken = keycloak.token
  // 可直接用于后续请求或逻辑处理
  console.log('Access Token:', accessToken)
}

注意:如果Keycloak插件的init方法还未执行完毕,authenticated会是false,需等待初始化完成后再获取token。

三、自动注入Authorization: Bearer <token>请求头

有两种常用实现方式,按需选择:

方式1:全局请求拦截器(推荐)

在你的Keycloak插件中添加fetch:request钩子,拦截所有$fetch、useFetch、useAsyncData发起的请求,自动为指定路径的API添加认证头:

// plugins/keycloak.ts
export default defineNuxtPlugin((nuxtApp) => {
  const keycloak = nuxtApp.$keycloak

  // 拦截请求并注入认证头
  nuxtApp.hook('fetch:request', async (options) => {
    // 仅对目标外部API路径生效(这里以/api/开头为例)
    if (options.url.startsWith('/api/')) {
      if (keycloak.authenticated) {
        // 可选:提前刷新即将过期的token(30秒内过期则触发刷新)
        const isRefreshed = await keycloak.updateToken(30)
        if (isRefreshed) {
          console.log('Token refreshed successfully')
        }
        // 注入Authorization头
        options.headers = {
          ...options.headers,
          Authorization: `Bearer ${keycloak.token}`
        }
      }
    }
  })

  // 挂载keycloak到app实例(你的原有代码)
  nuxtApp.$keycloak = keycloak
})

方式2:封装自定义API请求Composable

如果不想全局拦截所有请求,可以封装专属的API请求函数,内部自动处理认证头:

// composables/useApiFetch.ts
import type { FetchOptions } from 'ofetch'

export const useApiFetch = (url: string, options: FetchOptions = {}) => {
  const nuxtApp = useNuxtApp()
  const keycloak = nuxtApp.$keycloak

  // 构建请求头
  const requestHeaders = {
    ...options.headers,
    // 已认证时才添加Authorization头
    ...(keycloak.authenticated ? { Authorization: `Bearer ${keycloak.token}` } : {})
  }

  return useFetch(url, {
    ...options,
    headers: requestHeaders,
    baseURL: '/api/' // 替换为你的外部API基础地址
  })
}

在页面中使用这个自定义Composable:

<script setup>
// 调用外部API时自动注入认证头
const { data, error } = await useApiFetch('users')
</script>

内容的提问来源于stack exchange,提问作者Naga Vijayapuram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:15:23