Commit 9bb8aadd authored by DatHV's avatar DatHV
Browse files

update

parent 0bf528a4
...@@ -9,6 +9,10 @@ echo "🚀 Exporting Flutter web app for production..." ...@@ -9,6 +9,10 @@ echo "🚀 Exporting Flutter web app for production..."
echo "🛑 Stopping any existing server on :8080..." echo "🛑 Stopping any existing server on :8080..."
lsof -i :8080 | awk 'NR>1 {print $2}' | xargs kill -9 2>/dev/null || true lsof -i :8080 | awk 'NR>1 {print $2}' | xargs kill -9 2>/dev/null || true
# Switch to PRO environment automatically
echo "🔧 Switching to PRO environment..."
./scripts/switch_env.sh prod
# Clear cache build để tránh dính SW/cache cũ # Clear cache build để tránh dính SW/cache cũ
echo "🧹 Clearing build caches..." echo "🧹 Clearing build caches..."
flutter clean flutter clean
......
...@@ -14,6 +14,7 @@ class APIPaths {//sandbox ...@@ -14,6 +14,7 @@ class APIPaths {//sandbox
static const String otpVerifyForDoingNextEvent = "/otpVerifyForDoingNextEvent/1.0.0"; static const String otpVerifyForDoingNextEvent = "/otpVerifyForDoingNextEvent/1.0.0";
static const String accountPasswordReset = "/accountPasswordReset/1.0.0"; static const String accountPasswordReset = "/accountPasswordReset/1.0.0";
static const String login = "/iam/v1/authentication/account-login"; static const String login = "/iam/v1/authentication/account-login";
static const String logout = "/accountLogout/1.0.0";
static const String loginWithBiometric = "/iam/v1/authentication/bio-login"; static const String loginWithBiometric = "/iam/v1/authentication/bio-login";
static const String getUserInfo = "/user/api/v2.0/mypoint/me"; static const String getUserInfo = "/user/api/v2.0/mypoint/me";
static const String refreshToken = "/accountAccessTokenRefresh/3.0.0"; static const String refreshToken = "/accountAccessTokenRefresh/3.0.0";
......
...@@ -3,6 +3,7 @@ import 'package:flutter_localizations/flutter_localizations.dart'; ...@@ -3,6 +3,7 @@ import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:mypoint_flutter_app/base/app_navigator.dart'; import 'package:mypoint_flutter_app/base/app_navigator.dart';
import 'package:mypoint_flutter_app/resources/base_color.dart'; import 'package:mypoint_flutter_app/resources/base_color.dart';
import 'package:mypoint_flutter_app/screen/splash/splash_screen.dart';
import 'package:mypoint_flutter_app/shared/router_gage.dart'; import 'package:mypoint_flutter_app/shared/router_gage.dart';
import 'package:mypoint_flutter_app/core/app_initializer.dart'; import 'package:mypoint_flutter_app/core/app_initializer.dart';
...@@ -28,7 +29,7 @@ class MyApp extends StatelessWidget { ...@@ -28,7 +29,7 @@ class MyApp extends StatelessWidget {
navigatorKey: AppNavigator.key, navigatorKey: AppNavigator.key,
navigatorObservers: [routeObserver], navigatorObservers: [routeObserver],
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
initialRoute: '/splash', // initialRoute: '/splash',
theme: ThemeData( theme: ThemeData(
colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.brown), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.brown),
primaryColor: BaseColor.primary500, primaryColor: BaseColor.primary500,
...@@ -42,7 +43,7 @@ class MyApp extends StatelessWidget { ...@@ -42,7 +43,7 @@ class MyApp extends StatelessWidget {
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
// home: SplashScreen(), home: SplashScreen(),
getPages: RouterPage.pages(), getPages: RouterPage.pages(),
); );
} }
......
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import '../../configs/api_paths.dart';
import '../../configs/constants.dart'; import '../../configs/constants.dart';
import '../../base/app_navigator.dart'; import '../../base/app_navigator.dart';
import '../dio_http_service.dart'; import '../dio_http_service.dart';
...@@ -8,12 +9,37 @@ import '../../services/token_refresh_service.dart'; ...@@ -8,12 +9,37 @@ import '../../services/token_refresh_service.dart';
class AuthInterceptor extends Interceptor { class AuthInterceptor extends Interceptor {
bool _isHandlingAuth = false; bool _isHandlingAuth = false;
static const _kAuthHandledKey = '__auth_handled__'; static const _kAuthHandledKey = '__auth_handled__';
// Danh sách các path không cần refresh token khi gặp lỗi auth
static final List<String> _skipRefreshTokenPaths = [
APIPaths.getUserInfo,
APIPaths.login,
APIPaths.refreshToken,
APIPaths.logout,
];
@override @override
Future<void> onResponse(Response response, ResponseInterceptorHandler handler) async { Future<void> onResponse(Response response, ResponseInterceptorHandler handler) async {
final data = response.data; final data = response.data;
if (_isTokenInvalid(data)) { if (_isTokenInvalid(data)) {
response.requestOptions.extra[_kAuthHandledKey] = true; response.requestOptions.extra[_kAuthHandledKey] = true;
// Kiểm tra xem path này có cần skip refresh token không
if (_shouldSkipRefreshToken(response.requestOptions.path)) {
handler.reject(
DioException(
requestOptions: response.requestOptions
..extra['mapped_error'] = ErrorCodes.tokenInvalidMessage,
response: response,
type: DioExceptionType.badResponse,
error: 'ERR_AUTH_TOKEN_INVALID',
message: ErrorCodes.tokenInvalidMessage,
),
);
return;
}
await _handleAuthError(data); await _handleAuthError(data);
handler.reject( handler.reject(
DioException( DioException(
...@@ -35,7 +61,16 @@ class AuthInterceptor extends Interceptor { ...@@ -35,7 +61,16 @@ class AuthInterceptor extends Interceptor {
final alreadyHandled = err.requestOptions.extra[_kAuthHandledKey] == true; final alreadyHandled = err.requestOptions.extra[_kAuthHandledKey] == true;
final data = err.response?.data; final data = err.response?.data;
final statusCode = err.response?.statusCode; final statusCode = err.response?.statusCode;
if (alreadyHandled) return; if (alreadyHandled) return;
// Kiểm tra xem path này có cần skip refresh token không
if (_shouldSkipRefreshToken(err.requestOptions.path) &&
(statusCode == 401 || statusCode == 403 || _isTokenInvalid(data))) {
handler.next(err);
return;
}
if (statusCode == 401 || _isTokenInvalid(data)) { if (statusCode == 401 || _isTokenInvalid(data)) {
await _handleAuthError(data, originalRequest: err.requestOptions, handler: handler, originalError: err); await _handleAuthError(data, originalRequest: err.requestOptions, handler: handler, originalError: err);
return; return;
...@@ -51,6 +86,22 @@ class AuthInterceptor extends Interceptor { ...@@ -51,6 +86,22 @@ class AuthInterceptor extends Interceptor {
return false; return false;
} }
/// Kiểm tra xem path này có cần skip refresh token không
bool _shouldSkipRefreshToken(String path) {
print('🔍 Checking if path should skip refresh token: $path');
if (path.isEmpty) return false;
print('🔍 Cleaned path: $path');
// Kiểm tra xem path có chứa bất kỳ pattern nào trong danh sách skip không
for (String skipPath in _skipRefreshTokenPaths) {
if (path.contains(skipPath)) {
print('🔍 Path "$path" matches skip pattern "$skipPath", skipping refresh token.');
return true;
}
}
print('🔍 Path "$path" does not match any skip patterns, will attempt refresh token if needed.');
return false;
}
Future<void> _handleAuthError(dynamic data, {RequestOptions? originalRequest, ErrorInterceptorHandler? handler, DioException? originalError}) async { Future<void> _handleAuthError(dynamic data, {RequestOptions? originalRequest, ErrorInterceptorHandler? handler, DioException? originalError}) async {
if (_isHandlingAuth) return; if (_isHandlingAuth) return;
_isHandlingAuth = true; _isHandlingAuth = true;
...@@ -99,4 +150,19 @@ class AuthInterceptor extends Interceptor { ...@@ -99,4 +150,19 @@ class AuthInterceptor extends Interceptor {
} }
await AppNavigator.showAuthAlertAndGoLogin(message ?? ErrorCodes.tokenInvalidMessage); await AppNavigator.showAuthAlertAndGoLogin(message ?? ErrorCodes.tokenInvalidMessage);
} }
/// Thêm path vào danh sách skip refresh token
static void addSkipPath(String path) {
if (!_skipRefreshTokenPaths.contains(path)) {
_skipRefreshTokenPaths.add(path);
}
}
/// Xóa path khỏi danh sách skip refresh token
static void removeSkipPath(String path) {
_skipRefreshTokenPaths.remove(path);
}
/// Lấy danh sách các path đang skip refresh token
static List<String> get skipPaths => List.unmodifiable(_skipRefreshTokenPaths);
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment