Search
🌘

Flutter http interceptor for refresh token (http pub)

생성일
2021/05/30 12:00
태그
Flutter
속성

업데이트

2021.07.16 http_interceptor 버전 0.4.1 → 1.0.1 업데이트 되었습니다
클래스 이름이 변경되었습니다. HttpClientWithInterceptor ⇒ InterceptedClient

HTTP Interceptor 가 필요한 내용들

API Request Header 에 Authorization 값을 넣는 것
Access Token 만료 시 Refresh 하는 로직
API Request, Response Logging

Dependency

flutter pub add http_interceptor
Bash
복사

Implement

AuthorizationInterceptor.dart

import 'package:http_interceptor/http_interceptor.dart'; import 'package:firebase_auth/firebase_auth.dart'; class AuthorizationInterceptor implements InterceptorContract { Future<RequestData> interceptRequest({RequestData data}) async { try { String token = await FirebaseAuth.instance.currentUser.getIdToken(); data.headers['authorization'] = 'Bearer ' + token; data.headers['content-type'] = 'application/json'; } catch (e) { print(e); } return data; } Future<ResponseData> interceptResponse({ResponseData data}) async { return data; } } class ExpiredTokenRetryPolicy extends RetryPolicy { int maxRetryAttempts = 2; Future<bool> shouldAttemptRetryOnResponse(ResponseData response) async { if (response.statusCode == 401) { await FirebaseAuth.instance.currentUser.getIdTokenResult(true); return true; } return false; } }
Dart
복사
AuthorizationInterceptor
API Header에 Authorization 값을 추가하는 Interceptor 입니다. Firebase Auth 로 부터 token 을 가져와 header 에 주입합니다.
ExpiredTokenRetryPolicy
API Response 에 따라서 Retry 로직을 결정합니다. 유효하지 않은 access token 으로 401 response가 내려오는 경우 refreshToken 이후 retry 하도록 합니다.

Use Interceptor

class PromotionProvider with ChangeNotifier { List<Promotion> promotion = []; final client = InterceptedClient.build(interceptors: [ AuthorizationInterceptor() ]); 👈👈👈👈👈👈👈👈👈👈👈👈 :) void fetchPromotions() async { final response = await client.get(Uri.parse(Constants.API + 'booster/v1/promotions')); final data = ResponseListJSON<Promotion>.fromJson(json.decode(response.body), (data) => Promotion.fromJson(data)).data; promotion = data; notifyListeners(); } }
Dart
복사