89 lines
3.2 KiB
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;
|
|
}
|
|
*/ |