Register LocalAuthIntegration as Riverpod provider
epic-biometric-session-authentication-foundation-task-009 — Create a Riverpod provider for LocalAuthIntegration following the same conventions used for SecureSessionStorage in task-008. Expose the provider so that the BiometricAuthService and other dependents can consume LocalAuthIntegration without direct instantiation, enabling easy mocking in tests.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 3 - 413 tasks
Can start after Tier 2 completes
Implementation Notes
Mirror the structure of secureSessionStorageProvider exactly for consistency. If riverpod_generator is used, annotate with @Riverpod(keepAlive: true). Place in the same providers file or directory as the storage provider to keep infrastructure wiring centralised. The BiometricAuthService provider (a future task) will read both secureSessionStorageProvider and localAuthIntegrationProvider via ref.read inside its own provider factory — this task is purely the leaf node in that dependency graph.
Testing Requirements
Unit test using ProviderContainer: (1) localAuthIntegrationProvider resolves without throwing, (2) overriding with a fake ILocalAuthIntegration is reflected when a dependent provider reads localAuthIntegrationProvider. These tests are wiring-only — behavioural coverage is in task-011.
iOS Keychain access requires correct entitlement configuration and provisioning profile setup. Misconfigured entitlements cause silent failures in CI/CD and on physical devices, where the plugin appears to work in the simulator but fails at runtime. This can delay foundation delivery and block all downstream epics.
Mitigation & Contingency
Mitigation: Add a dedicated integration test running on a physical iOS device early in the epic. Document required entitlements and provisioning steps in a developer runbook. Validate Keychain access in the CI pipeline using an iOS simulator with correct entitlements enabled.
Contingency: If Keychain entitlements cannot be resolved quickly, temporarily use in-memory storage behind the SecureSessionStorage interface to unblock downstream epics, then resolve the Keychain issue in a hotfix before release.
The Flutter local_auth plugin has a history of breaking API changes between major versions, and its Android implementation depends on BiometricPrompt which behaves differently across Android API levels (23-34). An incompatible plugin version or unexpected Android API behaviour can cause authentication failures on a significant portion of the target device fleet.
Mitigation & Contingency
Mitigation: Pin local_auth to a specific stable version in pubspec.yaml. Test against Android API levels 23, 28, and 33 in the CI matrix. Review the plugin changelog and migration guide before adopting any version bump.
Contingency: If the pinned version proves incompatible with target devices, evaluate flutter_local_auth_android as a replacement or fork the plugin adapter to isolate the breaking surface.
If users upgrade from a version of the app that stored session data in non-encrypted storage (SharedPreferences), a migration path is required. Failing to migrate silently leaves old tokens in plain storage, creating a security gap and potentially causing confusing authentication state on first launch of the new version.
Mitigation & Contingency
Mitigation: Audit existing storage usage across the codebase before writing SecureSessionStorage. If legacy plain storage keys exist, implement a one-time migration routine that reads from SharedPreferences, writes to Keychain/Keystore, and deletes the plain-text entry.
Contingency: If migration is discovered late, ship the migration as a mandatory patch release before the biometric feature is enabled for users, and add a startup check that blocks biometric opt-in until migration is confirmed complete.