如何在需返回有效凭证的异步函数中刷新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
相关产品推荐
相关产品推荐

