如何过滤登录请求响应,移除多余headers与config敏感数据
问题根因
axios发送请求后返回的完整响应对象默认包含data(后端返回的业务数据)、status、statusText、headers、config、request六个字段,你最初的代码直接将整个响应对象存入了Redux和localStorage,config字段中会保留请求时传入的账号密码等敏感参数,才会出现安全风险。
解决步骤
- 第一步:清理缓存避免旧代码影响
先删除浏览器中已存储的旧userInfolocalStorage数据,停止本地开发服务后重新启动编译,确保修改后的代码完全生效。 - 第二步:修正请求取值与存储逻辑
你修改为解构data的写法是正确的,要确保dispatch和存储localStorage两个位置都使用解构后的业务数据,参考修正后的代码:
export const signin = (email, password) => async (dispatch) => { dispatch({type: user.USER_SIGNIN_REQUEST, payload: {email, password}}) try { // 解构axios响应对象,仅取业务数据字段 const { data } = await axios.post("/api/users/login", {email, password}) dispatch({type: user.USER_SIGNIN_SUCCESS, payload: data}) localStorage.setItem("userInfo", JSON.stringify(data)) } catch(err) { // 修正原错误处理的逻辑漏洞:原写法err.response不存在时访问err.response.data会抛出异常 dispatch({ type: user.USER_SIGNIN_ERROR, payload: err.response?.data?.message ?? err.message }) } }
- 第三步:增加数据显式提取逻辑(可选推荐)
为了避免后续接口返回结构变动意外带入冗余信息,你可以显式提取需要的业务字段,完全杜绝敏感信息被写入存储的可能:
const { data: rawRes } = await axios.post("/api/users/login", {email, password}) const formattedUserInfo = { id: rawRes.id, name: rawRes.name, email: rawRes.email, role: rawRes.role, message: rawRes.message, token: rawRes.token } dispatch({type: user.USER_SIGNIN_SUCCESS, payload: formattedUserInfo}) localStorage.setItem("userInfo", JSON.stringify(formattedUserInfo))
额外安全建议
- 不要在任何持久化存储(Redux持久化、localStorage、sessionStorage)中保存用户密码,你当前的
USER_SIGNIN_REQUESTaction中携带的账号密码仅用于请求触发,不要将该payload的内容存入持久化状态。 - 如果项目中使用了
redux-persist之类的Redux状态持久化插件,需要将登录请求相关的临时状态排除在持久化名单之外。
内容的提问来源于stack exchange,提问作者Alex Motor
相关产品推荐
相关产品推荐

