Apollo 2.0如何从缓存读取JWT Token用于SSO会话验证?
嘿,我来帮你搞定这个Apollo缓存读Token的问题!
首先得明确你的Token存在缓存的哪个位置——你说登录后User以id为键存在缓存里,那Token应该是这个User对象的一个字段吧?如果是这样,client.readFragment其实是适用的,可能你之前用的时候没找对姿势?
方法一:用readFragment读取User对象里的Token
Apollo的缓存里,每个对象的键都是类型:ID的格式(比如User:123),只要你能拿到当前登录用户的ID,就可以用片段读取指定字段:
- 先定义一个只包含Token的Fragment:
const USER_TOKEN_FRAGMENT = gql` fragment UserToken on User { token } `;
- 在Buy按钮的点击逻辑里读取:
const handleBuy = () => { // 这里的userId可以从登录成功的响应里存下来,或者从缓存的当前用户信息里取 const currentUserId = "你拿到的用户ID"; // 读取缓存中的User对象的token字段 const userData = client.readFragment({ id: `User:${currentUserId}`, // 必须和缓存里的键格式一致 fragment: USER_TOKEN_FRAGMENT, }); if (userData?.token) { // 拿到Token后调用validateSSOSession接口 validateSSOSession(userData.token) .then((response) => { // 处理验证成功后的逻辑 }) .catch((error) => { // 处理错误 }); } };
方法二:把Token单独存入客户端缓存(更推荐)
如果觉得依赖User ID麻烦,你可以在登录成功后,把Token单独写入一个全局的客户端查询缓存里,这样后续读取更方便:
- 登录成功后写入缓存:
// 假设登录响应里的token是authResult.token client.writeQuery({ query: gql` query GetAuthToken { authToken @client } `, data: { authToken: authResult.token, }, });
- 需要用的时候直接读取:
const handleBuy = () => { const { authToken } = client.readQuery({ query: gql` query GetAuthToken { authToken @client } `, }); if (authToken) { validateSSOSession(authToken); // 后续逻辑... } };
为什么之前的readQuery不好用?
client.readQuery要求你传入的查询和变量必须和之前执行过的查询完全一致——比如你登录时用了username和password变量,读取时也得传一模一样的变量,这显然不太灵活,所以才更推荐上面两种方法。
内容的提问来源于stack exchange,提问作者joy
相关产品推荐
相关产品推荐

