如何将我的 JWT 令牌附加到每个 axios 调用?

Posted

技术标签:

【中文标题】如何将我的 JWT 令牌附加到每个 axios 调用?【英文标题】:How can I attach my JWT token to every axios call? 【发布时间】:2021-09-27 08:30:24 【问题描述】:

我正在开发我的第一个 nextjs 应用程序。我正在使用 axios 实例来处理我对后端的调用

export const httpClient = axios.create(
  baseURL: `$process.env.BASE_URL`,
  headers: 
    'Content-Type': 'application/json',
    Accept: 'application/json',
  ,
);

我也在使用 next-auth 来处理我的身份验证和授权

const callbacks = 
  async jwt(token, user) 
    if (user) 
      token.accessToken = user.access_token;
    
    return token;
  ,

  async session(session, token) 
    session.accessToken = token.accessToken;
    return session;
  ,
;

对身份验证端点的调用工作正常。如果我console.log() api 响应,我可以看到返回的 JWT 令牌。

我现在尝试将该 JWT 令牌附加到每个 axios 请求,但调用 await getSession() 始终是 null。我写了以下请求拦截器

httpClient.interceptors.request.use(
  async (config) => 
    const session = await getSession();
    if (session)  // this never evaluates to true. Session is always `null`
      console.log(session);
      config.headers.Authorization = `Bearer $session?.accessToken`;
    

    return config;
  ,
  (error) => 
    return Promise.reject(error);
  ,
);

按照文档,我将_app.js <Component> 包装为

<Provider session=pageProps.session>
   <Component ...pageProps />
</Provider>

有什么我可以尝试的想法吗?

编辑: 我在代码的另一部分(在 nextjs 前端)调用 const [session, loading] = useSession();,一切似乎都在工作

【问题讨论】:

也许你的 getSession() 函数有问题。你也可以发一下吗? getSession() 函数是 next-auth 库的一部分。不是自己写的。 axios 实例和拦截器在哪里声明? 我不确定我明白你在问什么。你是什​​么意思? 我遇到了同样的问题,getSession() 总是返回 null,你能解决这个问题吗? 【参考方案1】:

问题是如果axios调用是在服务端进行的,那么拦截器也会在服务端执行。

如果是这种情况,在服务器端调用getSession() 时,您还必须将请求或上下文传递给它(参见manual entry for getSession 底部的注释)

【讨论】:

以上是关于如何将我的 JWT 令牌附加到每个 axios 调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node、Express、Axios 在 ReactJS 前端设置带有 JWT 令牌的 cookie

如何将我的 JWT 令牌存储在我的状态中?

如何将我的 JWT 令牌存储在本地存储中?

URL 编码后,数字 1 随机附加到我的 JWT 密码的末尾

如何在客户端上保存 JWT 令牌,在节点中使用 Hapi js。?

如何使用 Axios 将 JWT 存储在 cookie 中?