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

如何在需返回有效凭证的异步函数中刷新Cognito会话

解决AWSAppSyncClient在Cognito凭证刷新后更新凭证的问题

我懂你现在的困扰——当react-cognito自动刷新凭证后,你的AWSAppSyncClient还攥着旧凭证不放,导致请求报错对吧?别慌,咱们通过两个关键步骤就能搞定这个问题:让凭证函数实时读取Redux状态,再在凭证刷新时主动通知客户端更新。

步骤1:让Credentials函数实时获取最新Redux状态

首先修改你的configureApollo函数,确保每次需要凭证时,它都会从Redux Store的最新状态里取,而不是依赖初始化时的缓存值:

function configureApollo(store) {
  return new AWSAppSyncClient({
    url: AppSync.graphqlEndpoint,
    region: AppSync.region,
    auth: {
      type: 'AMAZON_COGNITO_USER_POOLS', // 根据你的实际认证类型调整,比如API_KEY/OIDC等
      credentials: async () => {
        // 每次调用都实时拉取Redux里的最新凭证
        const { cognito: { creds } } = store.getState();
        
        if (!creds) {
          // 处理无凭证的边界情况,比如抛出错误或等待凭证加载完成
          throw new Error("No valid Cognito credentials found in Redux store");
        }
        
        return creds;
      }
    }
  });
}

现在,只要Redux里的凭证更新了,下次AppSync客户端需要凭证时就能拿到新值,但客户端不会主动检测状态变化,所以还需要第二步。

步骤2:在Cognito凭证刷新后主动通知AppSync客户端

react-cognito肯定会在凭证刷新成功后触发回调或者Redux Action,咱们就在这个时机通知客户端更新凭证,有两种常用方法:

方法A:清除旧凭证(让客户端自动重新获取)

如果你的AppSync客户端实例能被访问到(比如存在Redux Store、React Context里),在凭证刷新成功的Action里调用clearCredentials():

// 假设这是react-cognito刷新凭证成功后的Redux Action Creator
export const onCredentialsRefreshed = (newCreds) => {
  return (dispatch, getState) => {
    // 先更新Redux Store里的凭证
    dispatch({
      type: 'COGNITO_CREDENTIALS_UPDATED',
      payload: newCreds
    });
    
    // 获取AppSync客户端实例(这里假设存在Redux的appSync.client路径下)
    const appSyncClient = getState().appSync.client;
    
    if (appSyncClient) {
      // 清除旧凭证,下次请求时会自动调用credentials函数拿新值
      appSyncClient.clearCredentials();
    }
  };
};

方法B:直接设置新凭证(更即时)

要是你想让客户端立刻用上新凭证,不用等下次请求,可以用setCredentials()方法:

// 同样在凭证刷新成功的Action里
export const onCredentialsRefreshed = (newCreds) => {
  return (dispatch, getState) => {
    dispatch({
      type: 'COGNITO_CREDENTIALS_UPDATED',
      payload: newCreds
    });
    
    const appSyncClient = getState().appSync.client;
    
    if (appSyncClient) {
      // 直接把新凭证传给客户端,马上生效
      appSyncClient.setCredentials(newCreds);
    }
  };
};

额外提醒

  • 确保AppSync客户端实例能被访问到:初始化后可以把它存入Redux Store、React Context,小项目也可以用全局变量(但不推荐)。
  • 如果初始化时Redux里还没凭证,可以考虑延迟初始化客户端,或者在credentials函数里加个监听逻辑,等凭证加载完成再返回。
  • 确认auth.type和你的认证方式匹配,比如用Cognito User Pools就必须设为AMAZON_COGNITO_USER_POOLS。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:04:58