环境:--这是我试图在经过尝试和测试的反应样板之上实现的代码。虽然这个样板很棒,但它不包含身份验证。我试图以与样板的现有逻辑相匹配的方式实现自己的身份验证逻辑。
上下文:
我有一个服务/实用程序函数,用于发送带有JWT身份验证头的服务器请求并返回其响应。
目标:
我试图实现逻辑,当使用过期令牌发出请求时,访问令牌会在请求发送到服务器之前自动刷新。
阻止我的是什么:
我觉得我想要完成的任务非常琐碎(我确信它已经实现了一百万次),但是,我想不出一个解决方案似乎不违背为什么使用Redux或Sagas的整个逻辑。
有人能提供一些见解吗?在附图中,红色文本是我正在努力实现的部分

见下面的代码:
/**
* Requests a URL, returning a promise
*
* @param {string} url The URL we want to request
* @param {object} [options] The options we want to pass to "fetch".
*
* @return {object} The response data
*/
export default function request( url, options ) {
const token = makeSelectAccessToken();
if (!token) throw new Error('No access token found.');
// Refresh access token if it's expired.
if (new Date(token.expires) - Date.now() <= 0) {
// TODO: Attempt to use refresh token to get new access token before continuing
/** dispatch(REFRESH_ACCESS_TOKEN) **/
// PROBLEM: can't dispatch actions because the store is not exposed to this service.
// Secondary challenge: Can't inject Saga or Reducer because the React-boilerplate injectors are React side-effects.
}
options = {
...options,
Authorization: `Bearer ${token.token}`, // Adding the JWT token to the request
};
return fetch(url, options)
}发布于 2022-06-27 09:17:32
有多种方法可以做到这一点
1-出口商店
创建新的store.js
import { createStore } from 'redux';
import reducer from './reducer';
//you can add your middleware, sagas, ...
const store = createStore(reducer);
export default store;将它导入到您的服务中,并在任何地方使用它,但是最终您将为所有用户提供一个单一的存储
2-您可以将func添加到中间件并拦截一个操作。
编辑创建存储代码并添加新的中间件以进行授权
const refreshAuthToken = store => next => action => {
const token = makeSelectAccessToken();
if (!token) throw new Error('No access token found.');
if(new Date(token.expires) - Date.now() <= 0) {
// you can dispatch inside store
this.store.dispatch(REFRESH_ACCESS_TOKEN);
}
// continue processing this action
return next(action);
}
const store = createStore(
... //add to your middleware list
applyMiddleware(refreshAuthToken)
);3-或者您可以将存储作为参数从组件发送到请求方法。
发布于 2022-06-26 20:30:02
也许更好的方法是将令牌存储在localStorage上,这样您就不需要访问Redux存储来获得它了。只需获取令牌并以如下方式存储:
localStorage.setItem('token', JSON.stringify(token))稍后在您的服务中,只需像这样检索:
const token = JSON.parse(localStorage.getItem('token'));如果您觉得在本地存储中存储令牌不安全,那么还有一个安全-包,它允许对保存到本地存储的数据进行加密。
https://stackoverflow.com/questions/72748878
复制相似问题