71 lines
2.1 KiB
Dart
71 lines
2.1 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 {
|
|
final String? accessToken = await authService.getAccessToken();
|
|
|
|
if (accessToken != null && request is http.Request) {
|
|
request.headers['Authorization'] = 'Bearer $accessToken';
|
|
}
|
|
return request;
|
|
}
|
|
|
|
@override
|
|
Future<BaseResponse> interceptResponse({
|
|
required BaseResponse response,
|
|
}) async {
|
|
var refreshToken = await authService.getRefreshToken();
|
|
|
|
if (response.statusCode == 403 && refreshToken != null) {
|
|
final refreshedTokens = await authService.refreshAccessToken();
|
|
|
|
if (refreshedTokens != null) {
|
|
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 {
|
|
navigatorKey.currentState?.pushAndRemoveUntil(
|
|
MaterialPageRoute(builder: (_) => const GoogleSignInPage()),
|
|
(route) => false,
|
|
);
|
|
}
|
|
}
|
|
return response;
|
|
}
|
|
|
|
@override
|
|
FutureOr<bool> shouldInterceptRequest() {
|
|
return true;
|
|
}
|
|
|
|
@override
|
|
FutureOr<bool> shouldInterceptResponse() {
|
|
return true;
|
|
}
|
|
}
|