在Redux-Saga中获取JWT刷新令牌的过程通常涉及以下几个步骤:
在需要长时间运行的单页应用(SPA)中,用户登录后,服务器会返回一个访问令牌和一个刷新令牌。当访问令牌过期时,可以使用刷新令牌来获取新的访问令牌,而不需要用户重新登录。
以下是一个简单的示例,展示如何在Redux-Saga中使用刷新令牌:
import { call, put, takeLatest } from 'redux-saga/effects';
import axios from 'axios';
function* refreshToken(action) {
try {
const response = yield call(axios.post, '/api/refresh-token', { refreshToken: action.payload });
const newAccessToken = response.data.accessToken;
// 更新本地存储或Redux状态中的访问令牌
yield put({ type: 'UPDATE_ACCESS_TOKEN', payload: newAccessToken });
} catch (error) {
// 处理刷新令牌失败的情况,例如清除用户信息并重定向到登录页面
yield put({ type: 'LOGOUT' });
}
}
function* watchRefreshToken() {
yield takeLatest('REFRESH_TOKEN_REQUEST', refreshToken);
}
export default watchRefreshToken;
在你的Redux reducer中,当检测到访问令牌过期时,可以分发一个REFRESH_TOKEN_REQUEST
动作来触发Saga。
// 示例reducer
const initialState = {
accessToken: localStorage.getItem('accessToken'),
refreshToken: localStorage.getItem('refreshToken'),
};
function authReducer(state = initialState, action) {
switch (action.type) {
case 'UPDATE_ACCESS_TOKEN':
localStorage.setItem('accessToken', action.payload);
return { ...state, accessToken: action.payload };
case 'LOGOUT':
localStorage.removeItem('accessToken');
localStorage.removeItem('refreshToken');
return { ...state, accessToken: null, refreshToken: null };
default:
return state;
}
}
在你的应用中,当检测到访问令牌过期时(例如通过Axios的拦截器),分发REFRESH_TOKEN_REQUEST
动作。
import axios from 'axios';
import { store } from './store'; // 假设你已经配置好了Redux store
axios.interceptors.response.use(
response => response,
error => {
const originalRequest = error.config;
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
const refreshToken = store.getState().auth.refreshToken;
return store.dispatch({ type: 'REFRESH_TOKEN_REQUEST', payload: refreshToken })
.then(() => {
originalRequest.headers['Authorization'] = `Bearer ${store.getState().auth.accessToken}`;
return axios.request(originalRequest);
});
}
return Promise.reject(error);
}
);
通过上述步骤,你可以在Redux-Saga中有效地处理JWT刷新令牌,确保用户会话的持续性和安全性。
领取专属 10元无门槛券
手把手带您无忧上云