Swift中Firebase微软登录"Client is public"错误的解决方法
解决Firebase微软登录报错:"Client is public so neither 'client_assertion' nor 'client_secret' should be presented."
这个错误的核心原因是你的Azure AD应用被配置为公共客户端(如iOS移动端),但Firebase或Azure端的配置仍在尝试使用客户端密钥(client_secret),而公共客户端类型的应用不需要也不允许提交客户端密钥。以下是分步解决方案:
1. 修正Azure AD应用配置
- 登录Azure门户,找到你的应用注册,进入「认证」页面
- 滚动到「高级设置」,将「允许公共客户端流」设置为「是」
- 进入「证书和密码」页面,删除所有已添加的客户端密码(公共客户端无需此配置)
- 确认「重定向URI」已添加Firebase控制台中微软提供商给出的回调地址(格式通常为
https://<你的Firebase项目ID>.firebaseapp.com/__/auth/handler)
2. 调整Firebase控制台微软提供商配置
- 进入Firebase控制台,打开你的项目 → 「Authentication」→「登录方法」→ 编辑微软提供商
- 仅保留「客户端ID」,清空「客户端密钥」输入框,保存配置
3. 优化Swift登录代码
确保代码适配公共客户端的授权流程,可添加明确的响应类型参数:
let provider = OAuthProvider(providerID: "microsoft.com") provider.customParameters = [ "prompt": "consent", "tenant": "YOUR_TENANT_ID", "response_type": "code" // 明确指定授权码流程,适配公共客户端 ] // 添加必要的权限范围,根据业务需求调整 provider.scopes = ["User.Read"] provider.getCredentialWith(nil) { credential, error in guard let credential = credential, error == nil else { let alert = UIAlertController(title: "登录失败", message: "请重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) return } Auth.auth().signIn(with: credential) { authResult, error in if let error = error { print("*********ERROR************") print(error) print("*********ERROR************") let alert = UIAlertController(title: "登录失败", message: "请重试", preferredStyle: .alert) alert.addAction(UIAlertAction(title: "确定", style: .default)) self.present(alert, animated: true) return } guard let authResult = authResult else { return } // 登录成功后的业务逻辑 print("用户登录成功:\(authResult.user.uid)") } }
额外排查步骤
- 更新Firebase Auth SDK:在Podfile中确保
pod 'Firebase/Auth'为最新版本,执行pod update Firebase/Auth后重新构建项目 - 清除Xcode缓存:执行「Product」→「Clean Build Folder」,避免旧配置残留
内容的提问来源于stack exchange,提问作者Can Duru
相关产品推荐
相关产品推荐

