Apple Sign in联合登录接入Amplify后无法获取Auth Session的identity id与sub id
排查方案
- 检查调用时机:确认是否在
federatedSignIn的回调中直接调用fetchAuthSession,AWSMobileClient的federatedSignIn回调触发时,内部凭证还没有完全同步到Amplify的缓存层,此时立刻调用fetchAuthSession会触发等待超时。 - 检查传参正确性:确认
forWhichAuthProvider的取值严格为"apple",Cognito对联邦提供商名称大小写敏感,传错会导致校验卡住;同时确认传入的applegeneratedid是Apple登录返回的identity token,不是authorization code,参数传错会导致Cognito长时间校验失败触发超时。 - 检查Cognito配置:确认身份池的联邦身份提供商配置中已经开启Apple登录选项,且填写的Bundle ID、Team ID和项目配置完全一致。
- 检查版本兼容:你当前使用的Amplify 1.16.1搭配AWSMobileClient 2.26.5存在已知的状态同步Bug,两个版本的桥接层会出现缓存不同步的问题。
解决方案
- 调整调用时机:
federatedSignIn回调成功后,不要立刻调用fetchAuthSession,可以加1秒左右的延迟,或者监听Amplify Auth的Hub事件,收到signedIn事件后再调用fetchAuthSession,确保状态完全同步。 - 改用官方推荐的登录实现:不要用Escape Hatch获取AWSMobileClient手动调用联邦登录,直接使用Amplify Auth提供的
signInWithWebUI接口对接Apple Sign in,接口会自动处理状态同步,避免手动调用底层接口的同步问题,示例代码:
Amplify.Auth.signInWithWebUI(for: .apple, presentationAnchor: self.view.window!) { result in switch result { case .success: // 此处调用fetchAuthSession不会出现同步问题 case .failure(let error): print("登录失败:\(error)") } }
- 如果必须保留现有手动联邦登录逻辑,可以升级依赖版本:Amplify升级到1.28.0+,对应的AWSMobileClient升级到2.30.0+,该版本已经修复了状态同步的Bug。
- 不想升级版本可以手动加凭证刷新逻辑,在
federatedSignIn成功后先主动刷新一次凭证再回调,示例代码:
client.federatedSignIn(providerName: forWhichAuthProvider, token: applegeneratedid) { states, error in if let error = error { completionHandler(false, .failed(error: error.localizedDescription)) } else if let _ = states { // 手动刷新凭证确保同步完成 client.getCredentials { _, error in if error == nil { completionHandler(true, nil) } else { completionHandler(false, .failed(error: error?.localizedDescription ?? "")) } } } }
- 如果以上方案都无效,可以开启Amplify调试日志排查具体错误:在App启动时添加代码
Amplify.Logging.logLevel = .verbose,可以查看完整的Cognito请求返回内容,定位是否是权限配置类问题。
内容的提问来源于stack exchange,提问作者Paresh. P
相关产品推荐
相关产品推荐

