如何确保RTK Query不缓存含敏感数据的特定端点?含逻辑合理性问询
问题解答
1. 你的逻辑是否合理?
完全合理,具体原因如下:
- Redux Store 存储在内存中,用户名、密码这类敏感凭证存放在这里,确实存在被从内存提取的风险,安全性不足。
- React Native 的设备安全存储(如
SecureStore)是加密后存储在设备本地,能有效降低凭证泄露风险,是存放敏感登录信息的正确选择。 - Token 本身有有效期,即使存在内存中的 Redux Store,风险也远低于明文的用户名密码;且后续接口请求需要快速获取 Token,存在内存中能提升使用效率,这个设计没问题。
- RTK Query 默认缓存请求参数的特性确实会把用户名密码带入 Redux Store,这会抵消你用安全存储的意义,所以确实需要处理这个缓存问题。
2. 如何为 RTK Query 的特定端点禁用缓存?
有两种更合适的处理方式:
方式一:改用 Mutation 处理登录请求
登录属于修改型操作(获取 Token 本质是发起认证并获取授权凭证),RTK Query 中的 mutation 接口默认不会缓存请求参数和结果,刚好符合你的需求。示例代码如下:
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; export const authApi = createApi({ reducerPath: 'authApi', baseQuery: fetchBaseQuery({ baseUrl: '/api' }), endpoints: (builder) => ({ login: builder.mutation({ query: (credentials) => ({ url: '/login', method: 'POST', body: credentials, // 这里的用户名密码不会被缓存 }), }), }), }); export const { useLoginMutation } = authApi;
方式二:如果必须用 Query,强制禁用缓存
如果因为某些原因一定要用 query 实现登录,可在定义端点时设置 keepUnusedDataFor: 0,让 RTK Query 完全不缓存该端点的请求数据和参数:
export const authApi = createApi({ reducerPath: 'authApi', baseQuery: fetchBaseQuery({ baseUrl: '/api' }), endpoints: (builder) => ({ login: builder.query({ query: (credentials) => ({ url: '/login', method: 'POST', body: credentials, }), // 禁用缓存,数据会在组件不再使用时立即清除 keepUnusedDataFor: 0, // 额外设置 cacheTime 确保缓存完全不保留 cacheTime: 0, }), }), });
另外,在组件调用 useLoginQuery 时,也可以通过传递参数临时禁用缓存:
const { data } = useLoginQuery(credentials, { keepUnusedDataFor: 0, skipCache: true, });
不过更推荐方式一,因为从语义和 RTK Query 的设计初衷来看,登录这类操作更适合用 Mutation 处理,天然避免缓存问题。
内容的提问来源于stack exchange,提问作者rasputinscousin
相关产品推荐
相关产品推荐

