AWS Amplify iOS SDK federatedSignIn调用API无法自动获取授权令牌
问题根因与解决方案
核心错误1:传递的token参数错误
你当前传给federatedSignIn的参数是ASAuthorizationAppleIDCredential的user字段,该字段仅为苹果分配的用户唯一标识,并非登录需要的JWT格式身份凭证。你需要取出凭证中的identityToken字段,转换为字符串后作为token参数传入。
核心错误2:调用的API与预期认证体系不匹配
你通过escape hatch调用AWSMobileClient.federatedSignIn是对接Cognito身份池(Federated Identities)的接口,不会在Cognito用户池中创建用户,也无法生成用户池对应的JWT访问令牌。而你的API配置的是Cognito用户池授权,自然无法获取到所需令牌,因此触发会话过期报错。
正确实现步骤
- 先在AWS控制台完成Cognito用户池的Sign in with Apple身份提供商配置,确保Bundle ID、团队ID、密钥等参数填写正确。
- 替换当前的联合登录代码,直接使用Amplify Auth原生提供的苹果登录接口,无需跳转Web UI,不会被苹果审核拒绝:
func handleAppleLogin(credential: ASAuthorizationAppleIDCredential) { guard let tokenData = credential.identityToken, let idToken = String(data: tokenData, encoding: .utf8) else { print("无法获取苹果身份令牌") return } Amplify.Auth.signIn( with: .apple, idToken: idToken, userContextData: nil ) { result in switch result { case .success: print("用户池登录成功,可正常调用API") case .failure(let error): print("登录失败: \(error)") } } }
- 若需要手动获取令牌调试、或者手动添加请求头,可使用以下代码:
func fetchUserTokens() { Amplify.Auth.fetchAuthSession { result in do { let session = try result.get() if let cognitoSession = session as? AWSCognitoAuthSession, case .success(let tokens) = cognitoSession.tokensResult { let accessToken = tokens.accessTokenString // 手动加头构造请求示例 let request = RESTRequest( path: "/test", headers: ["Authorization": "Bearer \(accessToken)"], body: #"{"message": "my Test"}"#.data(using: .utf8) ) Amplify.API.post(request: request) { apiResult in // 处理请求结果 } } } catch { print("获取会话失败: \(error)") } } }
- 确认两项配置无误:
amplifyconfiguration.json中awsAPIPlugin的authorizationType已经设置为AMAZON_COGNITO_USER_POOLS;API Gateway侧的接口授权器已经绑定到对应的Cognito用户池,令牌来源选择Authorization头。
额外注意事项
- 苹果返回的
identityToken有效期仅为10分钟,首次登录后Cognito会自动刷新令牌,无需手动处理 - 首次登录时苹果只会返回一次用户的邮箱、姓名信息,后续登录不会返回,需要在首次登录时将信息存储到你的用户系统中
内容的提问来源于stack exchange,提问作者Etep
相关产品推荐
相关产品推荐

