You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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用户池授权,自然无法获取到所需令牌,因此触发会话过期报错。

正确实现步骤

  1. 先在AWS控制台完成Cognito用户池的Sign in with Apple身份提供商配置,确保Bundle ID、团队ID、密钥等参数填写正确。
  2. 替换当前的联合登录代码,直接使用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)")
        }
    }
}
  1. 若需要手动获取令牌调试、或者手动添加请求头,可使用以下代码:
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)")
        }
    }
}
  1. 确认两项配置无误:amplifyconfiguration.json中awsAPIPlugin的authorizationType已经设置为AMAZON_COGNITO_USER_POOLS;API Gateway侧的接口授权器已经绑定到对应的Cognito用户池,令牌来源选择Authorization头。

额外注意事项

  • 苹果返回的identityToken有效期仅为10分钟,首次登录后Cognito会自动刷新令牌,无需手动处理
  • 首次登录时苹果只会返回一次用户的邮箱、姓名信息,后续登录不会返回,需要在首次登录时将信息存储到你的用户系统中

内容的提问来源于stack exchange,提问作者Etep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:15:03