-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Description
This issue has occurred recently, and no prior bug reports or context are available. Please review it promptly and suggest any necessary changes.
On iOS, Phone Authentication with Firebase fails after accidentally enabling and then disabling reCAPTCHA Enterprise in the Firebase Console.
The error indicates that the reCAPTCHA SDK is not linked, even though Enterprise was disabled and no explicit integration was added.
Client
- Platform: iOS (SwiftUI app)
- firebase-ios-sdk: 12.2.0
- Xcode: Version 26.0 (17A321)
- Device: iPhone 17 Pro (iOS 26)
Notes
- Multiple developers report this issue ([#17557]([firebase_auth]:Error code: [firebase_auth/recaptcha-sdk-not-linked] The reCAPTCHA SDK is not linked to your app. See https://cloud.google.com/recaptcha-enterprise/docs/instrument-ios-apps flutterfire#17557)).
- Problem seems triggered once reCAPTCHA Enterprise API is enabled in the Console, even if later disabled.
- The iOS SDK appears to still expect reCAPTCHA Enterprise integration.
✅ Request:
Please clarify whether this is a Firebase Console bug (Enterprise toggle not fully reverting) or whether firebase_auth
iOS.
Reproducing the issue
Steps to Reproduce
- Enable Phone Authentication with
FirebaseAuth.instance.verifyPhoneNumber()
(or SwiftUI equivalent).
/// Send phone verification code using Firebase Phone Auth
@MainActor public func sendPhoneVerification(phoneNumber: String) async throws -> String {
return try await withCheckedThrowingContinuation { continuation in
PhoneAuthProvider.provider()
.verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
if let error = error {
continuation.resume(throwing: error)
return
}
continuation.resume(returning: verificationID!)
}
}
}
- In Firebase Console → Authentication → Settings → reCAPTCHA, click Manage reCAPTCHA (this auto-enables Enterprise).
- Disable reCAPTCHA Enterprise from Google Cloud.
- Run the app on iOS and attempt phone verification.
Expected Behavior
Phone authentication should work without requiring explicit recaptcha-enterprise-mobile-sdk
integration if Enterprise is disabled.
https://github.com/GoogleCloudPlatform/recaptcha-enterprise-mobile-sdk
Actual Behavior
Phone authentication fails with the following errors:
❌ Phone authentication failed
Error: The reCAPTCHA SDK is not linked to your app.
NSError domain: FIRAuthErrorDomain
NSError code: 17208
NSError userInfo: {
FIRAuthErrorUserInfoNameKey = ERROR_RECAPTCHA_SDK_NOT_LINKED,
NSLocalizedDescription = The reCAPTCHA SDK is not linked to your app.
See https://cloud.google.com/recaptcha-enterprise/docs/instrument-ios-apps
}
🔥 Unknown auth error code: FirebaseAuth.AuthErrorCode(rawValue: 17208)
Phone verification error: Error Domain=FIRAuthErrorDomain Code=17208 "The reCAPTCHA SDK is not linked to your app. See https://cloud.google.com/recaptcha-enterprise/docs/instrument-ios-apps" UserInfo={FIRAuthErrorUserInfoNameKey=ERROR_RECAPTCHA_SDK_NOT_LINKED, NSLocalizedDescription=The reCAPTCHA SDK is not linked to your app. See https://cloud.google.com/recaptcha-enterprise/docs/instrument-ios-apps}
- "the recaptcha sdk is not linked to your app. see https://cloud.google.com/recaptcha-enterprise/docs/instrument-ios-apps"
Firebase SDK Version
12.2.0
Xcode Version
Version 26.0 (17A321)
Installation Method
Swift Package Manager
Firebase Product(s)
Authentication
Targeted Platforms
iOS
Relevant Log Output
If using Swift Package Manager, the project's Package.resolved
Expand Package.resolved
snippet
{
"originHash" : "2e66394a25275d42b62167b94675c50c6e72205573af40d32e89ea121b4ff65a",
"pins" : [
{
"identity" : "abseil-cpp-binary",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/abseil-cpp-binary.git",
"state" : {
"revision" : "bbe8b69694d7873315fd3a4ad41efe043e1c07c5",
"version" : "1.2024072200.0"
}
},
{
"identity" : "apollo-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apollographql/apollo-ios",
"state" : {
"revision" : "ca441856851e9ab7765387341dba76c0384f5991",
"version" : "2.0.0-alpha-1"
}
},
{
"identity" : "app-check",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/app-check.git",
"state" : {
"revision" : "61b85103a1aeed8218f17c794687781505fbbef5",
"version" : "11.2.0"
}
},
{
"identity" : "appauth-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/openid/AppAuth-iOS.git",
"state" : {
"revision" : "145104f5ea9d58ae21b60add007c33c1cc0c948e",
"version" : "2.0.0"
}
},
{
"identity" : "approuter",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Dimillian/AppRouter",
"state" : {
"revision" : "72f63f4312a231ab2706234b9e99c4b71651f38c",
"version" : "1.0.2"
}
},
{
"identity" : "firebase-ios-sdk",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/firebase-ios-sdk.git",
"state" : {
"revision" : "e2a3c3fbcaa1df3fd549b5b3f1175bc8a11912fd",
"version" : "12.2.0"
}
},
{
"identity" : "google-ads-on-device-conversion-ios-sdk",
"kind" : "remoteSourceControl",
"location" : "https://github.com/googleads/google-ads-on-device-conversion-ios-sdk",
"state" : {
"revision" : "a2d0f1f1666de591eb1a811f40b1706f5c63a2ed",
"version" : "2.3.0"
}
},
{
"identity" : "googleappmeasurement",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleAppMeasurement.git",
"state" : {
"revision" : "1c7edd5cc6e4ad22d2b81166bb9b208b9e63058a",
"version" : "12.2.0"
}
},
{
"identity" : "googledatatransport",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleDataTransport.git",
"state" : {
"revision" : "617af071af9aa1d6a091d59a202910ac482128f9",
"version" : "10.1.0"
}
},
{
"identity" : "googlesignin-ios",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleSignIn-iOS.git",
"state" : {
"revision" : "3996d908c7b3ce8a87d39c808f9a6b2a08fbe043",
"version" : "9.0.0"
}
},
{
"identity" : "googleutilities",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GoogleUtilities.git",
"state" : {
"revision" : "60da361632d0de02786f709bdc0c4df340f7613e",
"version" : "8.1.0"
}
},
{
"identity" : "grpc-binary",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/grpc-binary.git",
"state" : {
"revision" : "cc0001a0cf963aa40501d9c2b181e7fc9fd8ec71",
"version" : "1.69.0"
}
},
{
"identity" : "gtm-session-fetcher",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/gtm-session-fetcher.git",
"state" : {
"revision" : "a2ab612cb980066ee56d90d60d8462992c07f24b",
"version" : "3.5.0"
}
},
{
"identity" : "gtmappauth",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/GTMAppAuth.git",
"state" : {
"revision" : "56e0ccf09a6dd29dc7e68bdf729598240ca8aa16",
"version" : "5.0.0"
}
},
{
"identity" : "interop-ios-for-google-sdks",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/interop-ios-for-google-sdks.git",
"state" : {
"revision" : "040d087ac2267d2ddd4cca36c757d1c6a05fdbfe",
"version" : "101.0.0"
}
},
{
"identity" : "leveldb",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/leveldb.git",
"state" : {
"revision" : "a0bc79961d7be727d258d33d5a6b2f1023270ba1",
"version" : "1.22.5"
}
},
{
"identity" : "mixpanel-swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mixpanel/mixpanel-swift",
"state" : {
"revision" : "c550cbef7654e59d06bf9c224ea25f681dea8975",
"version" : "4.4.0"
}
},
{
"identity" : "nanopb",
"kind" : "remoteSourceControl",
"location" : "https://github.com/firebase/nanopb.git",
"state" : {
"revision" : "b7e1104502eca3a213b46303391ca4d3bc8ddec1",
"version" : "2.30910.0"
}
},
{
"identity" : "phonenumberkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/marmelroy/PhoneNumberKit.git",
"state" : {
"revision" : "8cba2258060e356d5fc4836d4ff8549faa2409dd",
"version" : "4.1.4"
}
},
{
"identity" : "promises",
"kind" : "remoteSourceControl",
"location" : "https://github.com/google/promises.git",
"state" : {
"revision" : "540318ecedd63d883069ae7f1ed811a2df00b6ac",
"version" : "2.4.0"
}
},
{
"identity" : "stripe-ios-spm",
"kind" : "remoteSourceControl",
"location" : "https://github.com/stripe/stripe-ios-spm.git",
"state" : {
"revision" : "a5cea99a9b4feac4348d48a120970a32d5054cf1",
"version" : "24.23.1"
}
},
{
"identity" : "swift-atomics",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-atomics",
"state" : {
"revision" : "b601256eab081c0f92f059e12818ac1d4f178ff7",
"version" : "1.3.0"
}
},
{
"identity" : "swift-protobuf",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-protobuf.git",
"state" : {
"revision" : "102a647b573f60f73afdce5613a51d71349fe507",
"version" : "1.30.0"
}
}
],
"version" : 3
}
If using CocoaPods, the project's Podfile.lock
Expand Podfile.lock
snippet
Replace this line with the contents of your Podfile.lock!