import 'package:dio/dio.dart'; import '../services/device_header_service.dart'; import '../storage/secure_identity_storage.dart'; import '../storage/preferences_storage.dart'; import '../storage/storage_service.dart'; import 'api_exception.dart'; final _defaultIdentityStorage = SecureIdentityStorage( PreferencesStorage(StorageService.to.preferences), ); Future saveJwt(String token) => _defaultIdentityStorage.saveJwt(token); Future clearJwt() => _defaultIdentityStorage.clearJwt(); Future loadJwt() => _defaultIdentityStorage.readJwt(); class AuthInterceptor extends Interceptor { AuthInterceptor(this._sessionStorage, {required Uri backendOrigin}) : _backendOrigin = backendOrigin; final AuthSessionStorage _sessionStorage; final Uri _backendOrigin; @override Future onRequest( RequestOptions options, RequestInterceptorHandler handler, ) async { if (!_sameOrigin(options.uri, _backendOrigin)) { _stripSensitiveHeaders(options.headers); handler.next(options); return; } await DeviceHeaderService.to.ensureInitialized(); options.headers.addAll(DeviceHeaderService.to.commonHeaders()); options.headers.addAll(DeviceHeaderService.to.platformIdentityHeaders()); final jwt = _sessionStorage.accessToken ?? await _sessionStorage.restore(); if (jwt != null && jwt.isNotEmpty) { options.headers['Authorization'] = 'Bearer $jwt'; } options.extra[authSessionGenerationExtra] = _sessionStorage.generation; handler.next(options); } } bool _sameOrigin(Uri request, Uri backend) => request.scheme.toLowerCase() == backend.scheme.toLowerCase() && request.host.toLowerCase() == backend.host.toLowerCase() && request.port == backend.port; void _stripSensitiveHeaders(Map headers) { const sensitive = { 'authorization', 'x-device-id', 'user-devicetoken', 'user-android-id', 'user-android-oaid', 'user-android-imei', 'user-android-mac', 'user-ios-idfv', 'user-ios-idfa', 'user-ios-paid', }; headers.removeWhere((key, _) => sensitive.contains(key.toLowerCase())); }