From cde4f61d65c4f6a0f1e0717c2fbd312815f53a5f Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Fri, 10 Oct 2025 15:22:26 +0100 Subject: [PATCH 1/4] feat(app-check): recaptchaEnterprise for iOS and Android --- .../firebase/appcheck/FlutterFirebaseAppCheckPlugin.java | 7 +++++++ .../Sources/firebase_app_check/FLTAppCheckProvider.m | 4 ++++ .../lib/src/android_providers.dart | 8 ++++++++ .../lib/src/apple_providers.dart | 8 ++++++++ 4 files changed, 27 insertions(+) diff --git a/packages/firebase_app_check/firebase_app_check/android/src/main/java/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppCheckPlugin.java b/packages/firebase_app_check/firebase_app_check/android/src/main/java/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppCheckPlugin.java index a41d916f2db8..be03122ef7d6 100644 --- a/packages/firebase_app_check/firebase_app_check/android/src/main/java/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppCheckPlugin.java +++ b/packages/firebase_app_check/firebase_app_check/android/src/main/java/io/flutter/plugins/firebase/appcheck/FlutterFirebaseAppCheckPlugin.java @@ -111,6 +111,13 @@ private Task activate(Map arguments) { PlayIntegrityAppCheckProviderFactory.getInstance()); break; } + case recaptchaEnterprise: + { + FirebaseAppCheck firebaseAppCheck = getAppCheck(arguments); + firebaseAppCheck.installAppCheckProviderFactory( + ReCaptchaEnterpriseAppCheckProviderFactory.getInstance()); + break; + } } taskCompletionSource.setResult(null); } catch (Exception e) { diff --git a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProvider.m b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProvider.m index aacddaf48f2f..a24feedb64e6 100644 --- a/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProvider.m +++ b/packages/firebase_app_check/firebase_app_check/ios/firebase_app_check/Sources/firebase_app_check/FLTAppCheckProvider.m @@ -49,6 +49,10 @@ - (void)configure:(FIRApp *)app self.delegateProvider = [[FIRDeviceCheckProvider alloc] initWithApp:app]; } } + + if ([providerName isEqualToString:@"recaptchaEnterprise"]) { + self.delegateProvider = [[FIRReCaptchaEnterpriseProvider alloc] initWithApp:app]; + } } - (void)getTokenWithCompletion:(nonnull void (^)(FIRAppCheckToken *_Nullable, diff --git a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart index c827b3184022..e443ee219632 100644 --- a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart +++ b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart @@ -32,3 +32,11 @@ class AndroidDebugProvider extends AndroidAppCheckProvider { class AndroidPlayIntegrityProvider extends AndroidAppCheckProvider { const AndroidPlayIntegrityProvider() : super('playIntegrity'); } + +/// ReCaptcha Enterprise provider for Android. +/// +/// See documentation: +class AndroidReCaptchaEnterpriseProvider extends AndroidAppCheckProvider { + const AndroidReCaptchaEnterpriseProvider(this.siteKey): super('recaptchaEnterprise'); + final String siteKey; +} diff --git a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart index 5e6af1ce2359..4825554d66fc 100644 --- a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart +++ b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart @@ -54,3 +54,11 @@ class AppleAppAttestWithDeviceCheckFallbackProvider const AppleAppAttestWithDeviceCheckFallbackProvider() : super('appAttestWithDeviceCheckFallback'); } + +/// ReCaptcha Enterprise provider for Apple platforms. +/// +/// See documentation: +class AppleReCaptchaEnterpriseProvider extends AppleAppCheckProvider { +const AppleReCaptchaEnterpriseProvider(this.siteKey): super('recaptchaEnterprise'); +final String siteKey; +} From 3e27a056829b91c7dda90fbaaeafee235b209d8d Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Fri, 10 Oct 2025 15:31:45 +0100 Subject: [PATCH 2/4] feat: add tests --- .../firebase_app_check_e2e_test.dart | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/integration_test/firebase_app_check/firebase_app_check_e2e_test.dart b/tests/integration_test/firebase_app_check/firebase_app_check_e2e_test.dart index 61950b98d28a..18dafa6aaefe 100644 --- a/tests/integration_test/firebase_app_check/firebase_app_check_e2e_test.dart +++ b/tests/integration_test/firebase_app_check/firebase_app_check_e2e_test.dart @@ -103,6 +103,36 @@ void main() { }, skip: defaultTargetPlatform != TargetPlatform.iOS, ); + + test( + 'recaptchaEnterprise on Android', + () async { + await expectLater( + FirebaseAppCheck.instance.activate( + providerAndroid: const AndroidReCaptchaEnterpriseProvider( + siteKey: '6Lemcn0dAAAAABLkf6aiiHvpGD6x-zF3nOSDU2M8', + ), + ), + completes, + ); + }, + skip: defaultTargetPlatform != TargetPlatform.android, + ); + + test( + 'recaptchaEnterprise on iOS', + () async { + await expectLater( + FirebaseAppCheck.instance.activate( + providerApple: const AppleReCaptchaEnterpriseProvider( + siteKey: '6Lemcn0dAAAAABLkf6aiiHvpGD6x-zF3nOSDU2M8', + ), + ), + completes, + ); + }, + skip: defaultTargetPlatform != TargetPlatform.iOS, + ); }, ); } From 800ecd5273db05cec87693cd60d46cebea94832d Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Fri, 10 Oct 2025 15:32:21 +0100 Subject: [PATCH 3/4] chore: format-ci --- .../lib/src/android_providers.dart | 7 ++++--- .../lib/src/apple_providers.dart | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart index e443ee219632..9790a4983a84 100644 --- a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart +++ b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/android_providers.dart @@ -36,7 +36,8 @@ class AndroidPlayIntegrityProvider extends AndroidAppCheckProvider { /// ReCaptcha Enterprise provider for Android. /// /// See documentation: -class AndroidReCaptchaEnterpriseProvider extends AndroidAppCheckProvider { - const AndroidReCaptchaEnterpriseProvider(this.siteKey): super('recaptchaEnterprise'); - final String siteKey; +class AndroidReCaptchaEnterpriseProvider extends AndroidAppCheckProvider { + const AndroidReCaptchaEnterpriseProvider(this.siteKey) + : super('recaptchaEnterprise'); + final String siteKey; } diff --git a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart index 4825554d66fc..eb1868e385f5 100644 --- a/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart +++ b/packages/firebase_app_check/firebase_app_check_platform_interface/lib/src/apple_providers.dart @@ -58,7 +58,8 @@ class AppleAppAttestWithDeviceCheckFallbackProvider /// ReCaptcha Enterprise provider for Apple platforms. /// /// See documentation: -class AppleReCaptchaEnterpriseProvider extends AppleAppCheckProvider { -const AppleReCaptchaEnterpriseProvider(this.siteKey): super('recaptchaEnterprise'); -final String siteKey; +class AppleReCaptchaEnterpriseProvider extends AppleAppCheckProvider { + const AppleReCaptchaEnterpriseProvider(this.siteKey) + : super('recaptchaEnterprise'); + final String siteKey; } From f3348121f8a4de46f9f24f05474924b2153bd5b5 Mon Sep 17 00:00:00 2001 From: MichaelVerdon Date: Fri, 10 Oct 2025 15:42:13 +0100 Subject: [PATCH 4/4] fix: expose recaptcha --- .../firebase_app_check/lib/firebase_app_check.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/firebase_app_check/firebase_app_check/lib/firebase_app_check.dart b/packages/firebase_app_check/firebase_app_check/lib/firebase_app_check.dart index df0e9641fe25..9e9db6b8a165 100644 --- a/packages/firebase_app_check/firebase_app_check/lib/firebase_app_check.dart +++ b/packages/firebase_app_check/firebase_app_check/lib/firebase_app_check.dart @@ -20,7 +20,8 @@ export 'package:firebase_app_check_platform_interface/firebase_app_check_platfor AppleAppAttestProvider, AppleAppAttestWithDeviceCheckFallbackProvider, ReCaptchaEnterpriseProvider, - ReCaptchaV3Provider; + AndroidReCaptchaEnterpriseProvider, + AppleReCaptchaEnterpriseProvider; export 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart' show FirebaseException;