Skip to content

Commit 965de65

Browse files
committed
auth token interceptor
1 parent 35fa7b0 commit 965de65

File tree

7 files changed

+79
-7
lines changed

7 files changed

+79
-7
lines changed

modules/data/lib/init.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import 'package:get_it/get_it.dart';
1111
import 'package:shared_preferences/shared_preferences.dart';
1212

1313
import 'network/config/environment_service_impl.dart';
14+
import 'network/interceptors/auth_token_interceptor.dart';
1415

1516
class DataInit {
1617
static Future<void> initialize(GetIt getIt) async {
@@ -19,15 +20,16 @@ class DataInit {
1920
getIt.registerSingleton<SharedPreferences>(pref);
2021
getIt.registerSingleton<Preferences>(PreferencesImpl(getIt()));
2122

22-
//Network
23-
getIt.registerLazySingleton<Dio>(() => NetworkConfig.provideDio());
23+
// Network
24+
getIt.registerLazySingleton<AuthTokenInterceptor>(() => AuthTokenInterceptor(getIt()));
25+
getIt.registerLazySingleton<Dio>(() => NetworkConfig.provideDio(getIt()));
2426
getIt.registerLazySingleton<EnvironmentService>(() => EnvironmentServiceImpl(getIt()));
2527

26-
//Data Sources
28+
// Data Sources
2729

28-
//Repositories
30+
// Repositories
2931
getIt.registerLazySingleton<AuthRepository>(
30-
() => AuthRepositoryImpl(getIt(), getIt()),
32+
() => AuthRepositoryImpl(getIt(),),
3133
);
3234
getIt.registerLazySingleton<CommonRepository>(
3335
() => CommonRepositoryImpl(getIt()),

modules/data/lib/network/config/network_config.dart

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import 'package:dio/dio.dart';
22
import 'package:domain/env/env_config.dart';
33
import 'package:flutter/foundation.dart';
44

5+
import '../interceptors/auth_token_interceptor.dart';
56
import 'network_constants.dart';
67

78
class NetworkConfig {
8-
static Dio provideDio() {
9+
static Dio provideDio(AuthTokenInterceptor? authTokenInterceptor) {
910
final options = BaseOptions(
1011
baseUrl: EnvConfig.apiUrl,
1112
connectTimeout: const Duration(
@@ -30,6 +31,10 @@ class NetworkConfig {
3031
));
3132
}
3233

34+
if (authTokenInterceptor != null) {
35+
dio.interceptors.add(authTokenInterceptor);
36+
}
37+
3338
return dio;
3439
}
3540

modules/data/lib/network/config/network_constants.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,10 @@ class NetworkConstants {
44
//static const baseUrl = String.fromEnvironment('API_URL', defaultValue: "NA");
55
static const productsPath = "/products";
66
static const baseUrl = "http://www.example.com"; // To get started: comment this and uncomment line 4
7+
static const tokenHeader = "token";
8+
static const unauthorizedStatusCode = 401;
9+
static const forbiddenStatusCode = 403;
10+
static const invalidStatusCode = 422;
11+
static const contentTypeHeader = "Content-Type";
12+
static const applicationJsonContentType = "application/json";
713
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import 'package:dio/dio.dart';
2+
3+
import '../../preferences/preferences.dart';
4+
import '../config/network_constants.dart';
5+
6+
class AuthTokenInterceptor extends Interceptor {
7+
final Preferences _preferences;
8+
9+
AuthTokenInterceptor(this._preferences);
10+
11+
@override
12+
Future<void> onRequest(
13+
RequestOptions options,
14+
RequestInterceptorHandler handler,
15+
) async {
16+
try {
17+
final token = _preferences.getToken();
18+
if (token != null && token.isNotEmpty) {
19+
options.headers.addAll(
20+
{
21+
NetworkConstants.tokenHeader: token,
22+
NetworkConstants.contentTypeHeader:
23+
NetworkConstants.applicationJsonContentType,
24+
},
25+
);
26+
} else {
27+
await _clearCredentials();
28+
}
29+
} catch (_) {
30+
await _clearCredentials();
31+
}
32+
return super.onRequest(options, handler);
33+
}
34+
35+
@override
36+
void onError(DioException err, ErrorInterceptorHandler handler) {
37+
try {
38+
if (err.response?.statusCode == NetworkConstants.unauthorizedStatusCode ||
39+
err.response?.statusCode == NetworkConstants.forbiddenStatusCode ||
40+
err.response?.statusCode == NetworkConstants.invalidStatusCode) {
41+
_clearCredentials();
42+
}
43+
} catch (_) {
44+
_clearCredentials();
45+
}
46+
super.onError(err, handler);
47+
}
48+
49+
Future<void> _clearCredentials() async {
50+
_preferences.clear();
51+
}
52+
}

modules/data/lib/preferences/preferences.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ abstract class Preferences {
1414
Future<void> setAppTheme(String theme);
1515

1616
Future<void> setToken(String? token);
17+
18+
Future<void> clear();
1719
}

modules/data/lib/preferences/preferences_impl.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,9 @@ class PreferencesImpl extends Preferences {
4343
if (token == null) return _pref.remove(_tokenKey);
4444
return _pref.setString(_tokenKey, token);
4545
}
46+
47+
@override
48+
Future<void> clear() {
49+
return _pref.clear();
50+
}
4651
}

modules/data/lib/repositories/auth_repository_impl.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,6 @@ class AuthRepositoryImpl implements AuthRepository {
2828

2929
@override
3030
Future<void> logout() async {
31-
_preferences.setToken(null);
31+
_preferences.clear();
3232
}
3333
}

0 commit comments

Comments
 (0)