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

如何在Axios拦截器中传递JWT至外部API且无需调用getSession?

解决方案:避免Axios拦截器中调用/api/session获取令牌

问题根源

getSession是NextAuth的客户端方法,它默认会向/api/session发起请求,从后端拉取并验证会话数据,所以每次调用都会产生不必要的网络请求。要在组件外部直接获取令牌,应该使用NextAuth提供的getToken方法,它在客户端环境下会直接从本地存储(Cookie或LocalStorage)读取JWT令牌,无需与后端交互。

改造后的Axios拦截器代码

import { AxiosRequestHeaders, InternalAxiosRequestConfig } from 'axios';
import { getToken } from 'next-auth/jwt';
import { AccessToken } from './types';

export const UserToken = async (config: InternalAxiosRequestConfig) => {
  // 区分客户端/服务端环境:客户端无需传入req参数
  const token = await getToken({
    req: typeof window === 'undefined' ? config?.req : undefined,
    secret: process.env.NEXTAUTH_SECRET
  });

  if (!token?.accessToken) return config;

  config.headers = {
    ...config.headers,
    Authorization: `Bearer ${token.accessToken as AccessToken}`
  } as AxiosRequestHeaders;

  return config;
};

关键配置说明

  1. 确保JWT会话策略
    NextAuth默认使用JWT策略,若你显式配置了Database策略,需切换回JWT(在[...nextauth].ts中):

    export default NextAuth({
      providers: [AzureADB2CProvider({ /* 你的配置 */ })],
      session: { strategy: "jwt" }, // 显式声明JWT策略
      // ...其他配置
    });
    
  2. 正确存储accessToken到JWT
    在NextAuth的jwt回调中,将Azure AD B2C返回的accessToken存入JWT令牌,这样getToken才能读取到:

    callbacks: {
      async jwt({ token, account }) {
        // 用户首次登录时,将身份提供商返回的accessToken存入JWT
        if (account) {
          token.accessToken = account.access_token;
        }
        return token;
      }
    }
    
  3. 配置NEXTAUTH_SECRET
    环境变量中必须设置NEXTAUTH_SECRET,getToken需要用它来验证JWT的合法性。

额外提示

  • 若你在React组件中使用useSession,可以通过指定strategy: "jwt"让它直接从本地读取JWT,避免调用/api/session:
    const { data: session } = useSession({ strategy: "jwt" });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:28