如何在AWS中续期凭证?AWS Unity SDK STS凭证过期无法更新问题咨询
问题出现的原因
- AWS Unity SDK默认会将STS临时凭证持久化缓存到Unity
PlayerPrefs中,缓存逻辑优先读取本地存储的旧凭证,不会主动校验凭证有效性后再触发新凭证申请,默认也没有过期自动清理机制 - 多数开发者的登出逻辑仅会清理自研逻辑存储的Cognito用户token,不会同步清理SDK侧缓存的STS凭证,重新登录后SDK仍会调用旧的过期凭证发起资源访问请求
- 若应用使用单例模式初始化
AmazonDynamoDBClient等AWS服务客户端,客户端实例会绑定初始化阶段传入的凭证对象,后续即便更新了全局凭证配置,已初始化的客户端也不会自动替换绑定的凭证,会持续使用过期凭证发起请求 - Cognito身份池默认配置的STS凭证最长有效期为3天,与你遇到的3~4天触发故障的时间点完全吻合
解决操作
1. 完善登出流程,强制清空所有凭证缓存
登出时除清除自研逻辑存储的Cognito用户token外,必须同步调用SDK接口清除所有凭证缓存,执行完清理后再重新走登录流程:
// 清理当前Cognito凭证实例的缓存 if (cognitoCredentialsInstance != null) { cognitoCredentialsInstance.Clear(); } // 清理SDK全局凭证缓存 Amazon.Runtime.Internal.CredentialsCache.ClearCredentials(); // 清理Unity本地持久化存储中的SDK凭证缓存 PlayerPrefs.DeleteKey("AWSCredentials"); PlayerPrefs.Save();
2. 开启凭证自动刷新能力
初始化CognitoAWSCredentials时配置提前刷新逻辑,SDK会在凭证接近过期时自动使用当前有效的Cognito ID Token换取新的STS凭证,无需手动触发续期:
var cognitoCredentials = new CognitoAWSCredentials( yourCognitoIdentityId, yourAwsRegion ); // 配置凭证过期前10分钟自动刷新 cognitoCredentials.PreemptExpiryTime = TimeSpan.FromMinutes(10);
3. 优化AWS服务客户端初始化逻辑
避免全局复用单例AmazonDynamoDBClient实例,可选择两种优化方案:
- 每次发起AWS资源请求前,使用当前有效的凭证对象新建服务客户端
- 每次登录完成/凭证刷新完成后,重新初始化所有AWS服务客户端,确保客户端绑定最新的有效凭证
4. 新增异常兜底处理逻辑
在所有调用AWS资源的业务逻辑中捕获AmazonServiceException,当异常错误码为ExpiredToken或InvalidSignatureException时,自动触发上述凭证清理+重新登录流程,无需用户手动清理应用数据或重启应用。
内容的提问来源于stack exchange,提问作者karthik keyan
相关产品推荐
相关产品推荐

