Files
jinzhi/lib/common/network/auth_interceptor.dart
T

66 lines
2.1 KiB
Dart

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<void> saveJwt(String token) => _defaultIdentityStorage.saveJwt(token);
Future<void> clearJwt() => _defaultIdentityStorage.clearJwt();
Future<String?> loadJwt() => _defaultIdentityStorage.readJwt();
class AuthInterceptor extends Interceptor {
AuthInterceptor(this._sessionStorage, {required Uri backendOrigin})
: _backendOrigin = backendOrigin;
final AuthSessionStorage _sessionStorage;
final Uri _backendOrigin;
@override
Future<void> 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<String, dynamic> 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()));
}