我有一个react/redux应用程序,它从API服务器获取一个令牌。在用户认证后,我希望所有的axios请求都有这个令牌作为授权头,而不必手动将它附加到每个请求中。我对react/redux相当陌生,不确定最好的方法,也没有在google上找到任何高质量的点击。
下面是我的redux设置:
// actions.js
import axios from 'axios';
export function loginUser(props) {
const url = `https://api.mydomain.com/login/`;
const { email, password } = props;
const request = axios.post(url, { email, password });
return {
type: LOGIN_USER,
payload: request
};
}
export function fetchPages() {
/* here is where I'd like the header to be attached automatically if the user
has logged in */
const request = axios.get(PAGES_URL);
return {
type: FETCH_PAGES,
payload: request
};
}
// reducers.js
const initialState = {
isAuthenticated: false,
token: null
};
export default (state = initialState, action) => {
switch(action.type) {
case LOGIN_USER:
// here is where I believe I should be attaching the header to all axios requests.
return {
token: action.payload.data.key,
isAuthenticated: true
};
case LOGOUT_USER:
// i would remove the header from all axios requests here.
return initialState;
default:
return state;
}
}
我的令牌存储在redux存储中的state.session.token
下。
我不知道该怎么做。我试过在我的根目录下的一个文件中创建一个axios示例,并更新/导入它,而不是从node_modules更新/导入,但是当状态改变时,它没有附加头文件。任何反馈/想法都非常感谢,谢谢。
9条答案
按热度按时间utugiqy61#
有多种方法可以实现这一点。在这里,我解释了两种最常见的方法。
1.可以使用Axios拦截器拦截任何请求并添加授权头。
2.从
axios
的文档中,您可以看到有一种机制允许您设置默认头,该头将随您发出的每个请求一起发送。所以在你的例子中:
如果需要,您可以创建一个可自执行的函数,当存储中存在令牌时,该函数将设置授权头本身。
现在你不再需要手动为每个请求附加令牌。你可以把上面的函数放在保证每次都执行的文件中(**例如:**包含路由的文件)。
xienkqul2#
创建axios示例:
然后,对于任何请求,将从localStorage中选择令牌,并将其添加到请求头中。
我在整个应用程序中使用相同的示例,代码如下:
祝你好运。
lnxxn5zx3#
对我来说,最好的解决方案是创建一个客户机服务,用令牌示例化该服务,然后用它来 Package
axios
。在这个客户端中,您还可以根据需要从localStorage / cookie中检索令牌。
yjghlzjz4#
类似地,我们有一个函数可以设置或删除调用中的令牌,如下所示:
我们总是在初始化时清理现有的令牌,然后建立接收到的令牌。
efzxgjgh5#
关键是为每个请求在拦截器上设置标记
r55awzrz6#
如果你想在将来调用其他API路由并将你的令牌保存在存储中,那么试试using redux middleware。
中间件可以监听an API操作,并相应地通过axios分派api请求。
下面是一个非常基本的例子:
行动/API.js
中间件/API.js
vbkedwbf7#
有时候,您会遇到这样的情况:使用axios发出的一些请求指向不接受授权头的端点。因此,仅在允许的域上设置授权头的另一种方法如下例所示。将以下函数放置在每次运行React应用程序时执行的任何文件中,如roues文件。
tcomlyy68#
尝试像我下面做的那样创建新示例
如何使用它
o7jaxewo9#
在尝试实现类似的东西时遇到了一些问题,基于这些答案,这是我得出的结论。我遇到的问题是:
1.如果使用axios来请求从存储中获取令牌,则需要在添加头之前检测路径。如果不这样做,它将尝试将头也添加到该调用中,并陷入循环路径问题。添加regex来检测其他调用的逆操作也可以工作
1.如果存储返回一个承诺,您需要返回对存储的调用,以便在authHandler函数中解析承诺。
1.如果对auth令牌的调用失败,或者调用的目的是获取令牌,您仍然希望使用config解决一个承诺