HopSpotFrontend/lib/services/api_interceptor.dart

89 lines
3.2 KiB
Dart

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:http_interceptor/http_interceptor.dart';
import 'package:pvt15/main.dart';
import 'package:pvt15/pages/google_sign_in_page.dart';
import 'auth/auth_service.dart';
class AuthInterceptor implements InterceptorContract {
final AuthService authService;
AuthInterceptor({required this.authService});
@override
Future<BaseRequest> interceptRequest({required BaseRequest request}) async {
print("Intercepting request: ${request.url}");
final String? accessToken = await authService.getAccessToken();
if (accessToken != null && request is http.Request) {
request.headers['Authorization'] = 'Bearer $accessToken';
print("Added Bearer token to request: ${request.headers}");
}
return request;
}
@override
Future<BaseResponse> interceptResponse({required BaseResponse response}) async {
print("Intercepting response: ${response.statusCode}");
var refreshToken = await authService.getRefreshToken();
if (response.statusCode == 403 && refreshToken != null) {
print("Attempting to refresh token");
final refreshedTokens = await authService.refreshAccessToken();
if (refreshedTokens != null) {
print("Token refreshed successfully. Retrying original request.");
final originalRequest = response.request as http.Request;
final newAccessToken = refreshedTokens['accessToken'];
final newRequest = http.Request(originalRequest.method, originalRequest.url)
..headers.addAll(originalRequest.headers)
..headers['Authorization'] = 'Bearer $newAccessToken'; // Använd det nya tokenet
final client = http.Client();
try {
final newResponse = await client.send(newRequest);
final streamedResponse = await http.Response.fromStream(newResponse);
return streamedResponse as BaseResponse; // Viktigt att returnera det nya svaret
} finally {
client.close();
}
} else {
print("Failed to refresh token. Logging out user.");
// Här kan du navigera användaren till GoogleSignInPage.
navigatorKey.currentState?.pushAndRemoveUntil(
MaterialPageRoute(builder: (_) => const GoogleSignInPage()),
(route) => false,
);
}
}
return response;
}
@override
FutureOr<bool> shouldInterceptRequest() {
return true;
}
@override
FutureOr<bool> shouldInterceptResponse() {
return true;
}
}
/*// Exempel på hur du kan använda AuthClient i din kod:
Future<http.Response> fetchData(AuthService authService) async {
final AuthClient client = AuthClient(authService: authService);
final response = await client.get(Uri.parse('https://dinbackend.com/api/protected'));
return response;
}
// Exempel på hur du kan använda AuthClientWithErrorHandling med felhantering:
Future<http.Response> fetchDataWithErrorHandling(AuthService authService) async {
final AuthClientWithErrorHandling client = AuthClientWithErrorHandling(authService: authService);
final response = await client.get(Uri.parse('https://dinbackend.com/api/protected'));
return response;
}
*/