You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apollo 2.0如何从缓存读取JWT Token用于SSO会话验证?

嘿,我来帮你搞定这个Apollo缓存读Token的问题!

首先得明确你的Token存在缓存的哪个位置——你说登录后User以id为键存在缓存里,那Token应该是这个User对象的一个字段吧?如果是这样,client.readFragment其实是适用的,可能你之前用的时候没找对姿势?

方法一:用readFragment读取User对象里的Token

Apollo的缓存里,每个对象的键都是类型:ID的格式(比如User:123),只要你能拿到当前登录用户的ID,就可以用片段读取指定字段:

  1. 先定义一个只包含Token的Fragment:
const USER_TOKEN_FRAGMENT = gql`
  fragment UserToken on User {
    token
  }
`;
  1. 在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单独写入一个全局的客户端查询缓存里,这样后续读取更方便:

  1. 登录成功后写入缓存:
// 假设登录响应里的token是authResult.token
client.writeQuery({
  query: gql`
    query GetAuthToken {
      authToken @client
    }
  `,
  data: {
    authToken: authResult.token,
  },
});
  1. 需要用的时候直接读取:
const handleBuy = () => {
  const { authToken } = client.readQuery({
    query: gql`
      query GetAuthToken {
        authToken @client
      }
    `,
  });

  if (authToken) {
    validateSSOSession(authToken);
    // 后续逻辑...
  }
};

为什么之前的readQuery不好用?

client.readQuery要求你传入的查询和变量必须和之前执行过的查询完全一致——比如你登录时用了username和password变量,读取时也得传一模一样的变量,这显然不太灵活,所以才更推荐上面两种方法。

内容的提问来源于stack exchange,提问作者joy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:34:51