Swift中从AuthCognitoTokensProvider获取Cognito令牌失败排查
解决Amplify获取Cognito令牌失败的问题
问题分析
错误信息明确提示InvalidIdentityPoolConfigurationException,核心原因是Cognito身份池的IAM角色配置有误,导致无法正确获取身份凭证进而获取令牌。
解决步骤
1. 检查Cognito身份池的IAM角色关联
- 登录AWS控制台,进入Cognito服务,找到你的身份池
- 点击编辑身份池,查看“认证角色”和“未认证角色”是否已正确选择并存在
- 确保两个角色不是空白状态,若缺失需重新创建或关联已有角色
2. 验证IAM角色的信任策略
- 进入IAM控制台,找到身份池对应的认证角色(Authenticated Role)
- 查看角色的信任关系,确认策略包含以下内容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "你的身份池ID" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] } - 若策略不符,直接编辑更新为上述格式,替换
你的身份池ID为实际值
3. 确认Amplify配置文件正确性
- 检查项目中的
amplifyconfiguration.json,确保Auth节点下的identityPoolId、userPoolId、userPoolClientId与AWS控制台中的信息完全一致 - 避免出现拼写错误或新旧ID混用的情况
4. 优化令牌获取代码
原代码的错误处理和类型转换可以更严谨,替换为以下代码:
Amplify.Auth.fetchAuthSession { result in switch result { case .success(let session): print("已登录状态:\(session.isSignedIn)") guard let cognitoSession = session as? AWSAuthCognitoSession else { print("无法转换为Cognito会话") return } // 安全获取令牌 Task { do { let tokens = try await cognitoSession.cognitoTokens.get() print("ID Token: \(tokens.idToken)") print("Access Token: \(tokens.accessToken)") } catch { print("获取令牌失败:\(error.localizedDescription)") } } case .failure(let error): print("获取会话失败:\(error.localizedDescription)") } }
内容的提问来源于stack exchange,提问作者KwameB
相关产品推荐
相关产品推荐

