拦截器中的 axios react-keycloak/web 令牌

Posted

技术标签:

【中文标题】拦截器中的 axios react-keycloak/web 令牌【英文标题】:axois react-keycloak/web token in inteceptor 【发布时间】:2021-12-20 14:18:45 【问题描述】:

我正在尝试将 request inteceptor 与 react-keycloak/web 一起使用 - 但是这样做时会出现一系列错误。

import axios from 'axios';
import  useKeycloak  from '@react-keycloak/web';

const  keycloak  = useKeycloak();

const instance = axios.create(
  baseURL: 'https://example.com/api/v1/',
  timeout: 30000,
);

instance.interceptors.request.use(
  (config) => 
    config.headers.Authorization = `$keycloak.token`;
    return config;
  ,
  (error) => 
    return Promise.reject(error);
  
);

但我明白了:

React Hook "useKeycloak" 不能在顶层调用。 React Hooks 必须在 React 函数组件或自定义 React Hook 函数 react-hooks/rules-of-hooks 中调用

现在我当然尝试使用例如 GetToken() 创建一个函数:

function GetToken() 
  const  keycloak  = useKeycloak();
  return keycloak.token

但这样做会让我:

错误:无效的挂钩调用。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一:

    您的 React 和渲染器版本可能不匹配(例如 React DOM) 您可能违反了 Hooks 规则 您可能在同一个应用中拥有多个 React 副本

我在这里做错了什么?

【问题讨论】:

【参考方案1】:

你不能使用反应树之外的反应钩子。

您可以导出 axoios 实例并将其导入 react 内部的其他位置(例如:App.js)并在那里设置拦截器。

例如:

import axiosIns from 'api';
import  useKeycloak  from '@react-keycloak/web';
import  useEffect  from "react";
import WholeApp from "WholeApp";

const App = () => 
    const  keycloak  = useKeycloak();

    useEffect(() => 
        axiosIns.interceptors.request.use(
            (config) => 
                config.headers.Authorization = `$keycloak.token`;
                return config;
            ,
            (error) => 
                return Promise.reject(error);
            
        );
    , []);

    return <WholeApp />;

【讨论】:

谢谢,我在 ReactKeycloakProvider 上遇到错误 - 如果我们围绕它包装整个应用程序,我不确定应该在哪里创建它。 实际上,我有这个工作 - 我可以在 ReactDom.render() 中初始化 ReactKeycloakProvider 这似乎工作。

以上是关于拦截器中的 axios react-keycloak/web 令牌的主要内容,如果未能解决你的问题,请参考以下文章

Axios 中的单元测试拦截器逻辑

axios拦截器中的Vue-Router

拦截器中的 axios react-keycloak/web 令牌

axios拦截器?

#yyds干货盘点# vue中的数据请求axios简单封装和使用

axios拦截器