Firebase Auth集成Apple登录时出现MISSING_OR_INVALID_NONCE错误
解决方案
- 核心错误为凭证构造时参数传递错误:你目前的代码将nonce传入了
accessToken参数,Firebase不会读取该位置的nonce值,必须使用rawNonce参数传递原始未哈希的nonce,同时要将Apple返回的identityToken(Data类型)转为UTF8字符串再传入,修正后的代码如下:
let firebaseCredential = OAuthProvider.credential( withProviderID: "apple.com", idToken: String(data: identityToken!, encoding: .utf8)!, rawNonce: currentNonce )
- 检查
randomNonceString方法的实现是否符合规范:nonce必须为长度≥32位的随机字符串,仅可包含大小写字母、数字、-、.、_、~字符,参考实现如下:
private func randomNonceString(length: Int = 32) -> String { precondition(length > 0) var randomBytes = [UInt8](repeating: 0, count: length) guard SecRandomCopyBytes(kSecRandomDefault, randomBytes.count, &randomBytes) == errSecSuccess else { fatalError("生成随机nonce失败") } let charset: [Character] = Array("0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._~") return randomBytes.map { charset[Int($0) % charset.count] }.joined() }
- 检查sha256哈希方法的实现:确保输出为小写十六进制字符串,无多余字符,参考实现如下:
import CryptoKit private func sha256(_ input: String) -> String { SHA256.hash(data: Data(input.utf8)) .compactMap { String(format: "%02x", $0) } .joined() }
- 确认你使用的Firebase Auth SDK版本≥6.13.0,该版本之后官方统一了Apple登录的凭证构造规则,废弃了通过自定义参数传递nonce的写法。
- 调试时可打印生成的
firebaseCredential对象,确认rawNonce字段不为空,且与你存储的currentNonce值完全一致。
内容的提问来源于stack exchange,提问作者SQLiteNoob
相关产品推荐
相关产品推荐

