如何在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; };
关键配置说明
确保JWT会话策略
NextAuth默认使用JWT策略,若你显式配置了Database策略,需切换回JWT(在[...nextauth].ts中):export default NextAuth({ providers: [AzureADB2CProvider({ /* 你的配置 */ })], session: { strategy: "jwt" }, // 显式声明JWT策略 // ...其他配置 });正确存储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; } }配置NEXTAUTH_SECRET
环境变量中必须设置NEXTAUTH_SECRET,getToken需要用它来验证JWT的合法性。
额外提示
- 若你在React组件中使用
useSession,可以通过指定strategy: "jwt"让它直接从本地读取JWT,避免调用/api/session:const { data: session } = useSession({ strategy: "jwt" });
内容的提问来源于stack exchange,提问作者Chuckatron
相关产品推荐
相关产品推荐

