如何修改AWS临时凭证过期时间?无身份提供商令牌能否刷新?
问题解答
问题1:如何修改获取到的AWS临时凭证的过期时间?
你遇到的问题是因为修改IAM角色最大会话时长后,现有凭证不会自动更新,且Amplify默认调用federateToIdentityPool时没有指定自定义会话时长。要调整临时凭证过期时间,需按以下操作:
确认IAM角色的最大会话时长设置生效
登录AWS控制台,进入IAM角色页面,找到身份池关联的Authenticated角色,检查其最大会话时长(Maximum session duration)是否已设置为你需要的值(范围15分钟到12小时)。修改后需要等待几分钟让配置生效,新的联邦请求才会应用这个上限。在Amplify调用中指定会话时长
默认情况下,federateToIdentityPool会使用Cognito的默认会话时长(通常1小时),你需要通过重载方法传入自定义的会话时长参数,且该值不能超过IAM角色设置的最大会话时长。修改代码如下:func federateToIdentityPools(token : String) async throws -> Bool{ guard let authCognitoPlugin = try Amplify.Auth.getPlugin( for: "awsCognitoAuthPlugin") as? AWSCognitoAuthPlugin else { fatalError("Unable to get the Auth plugin") } do { // 设置会话时长,单位为秒,这里示例设为3600秒(1小时),需小于等于IAM角色的最大会话时长 let options = FederateToIdentityPoolOptions(durationSeconds: 3600) let result = try await authCognitoPlugin.federateToIdentityPool( withProviderToken: token, for: .oidc("test.criipto.id"), options: options ) print("Federation successful with result: \(result.credentials.accessKeyId)") print("Federation successful with result: \(result.credentials.secretAccessKey)") print("Federation successful with result: \( result.credentials.expiration)") return true } catch { print("Failed to federate to identity pools with error: \(error)") return false } }注意:如果指定的
durationSeconds超过IAM角色的最大会话时长,Cognito会自动使用角色的最大时长作为凭证过期时间。
问题2:能否在临时AWS凭证过期时,无需联邦身份提供商的令牌进行刷新?
不行。Cognito身份池的临时凭证刷新机制依赖于第三方身份提供商的有效令牌(ID令牌或刷新令牌):
- 当临时凭证过期时,Cognito需要验证用户的身份仍然合法,因此必须提供有效的第三方身份令牌才能重新获取新的临时凭证。
- 如果你的第三方提供商(Criipto)支持返回刷新令牌,你可以用刷新令牌获取新的ID令牌,再调用
federateToIdentityPool刷新AWS临时凭证,这个过程无需用户重新登录,但仍然需要依赖第三方的令牌(刷新令牌)。 - 如果没有刷新令牌,就必须重新引导用户通过Criipto认证获取新的ID令牌,才能刷新AWS临时凭证。
内容的提问来源于stack exchange,提问作者Krishan Madushanka
相关产品推荐
相关产品推荐

