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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:24:02