現在、Flutter の Web API にアクセスしようとしていますが、これには認証用の JWT アクセス トークンが必要です。アクセス トークンは、一定の時間が経過すると有効期限が切れます。
別の更新トークンを使用して、新しいアクセス トークンを要求できます。現在、このアクセス トークンの更新は、リクエストが 401 レスポンスを返すとすぐに実行されます。その後、失敗したリクエストを新しいアクセス トークンで再試行する必要があります。
この最後のステップに問題があります。http.BaseRequest
は一度しか送信できないようです。新しいトークンで http リクエストを再試行するにはどうすればよいですか?
dart http readmeで提案されているhttp.BaseClient
ように、認証動作を追加するためにのサブクラスを作成しました。ここに簡略化されたバージョンがあります:
import 'dart:async';
import 'package:http/http.dart' as http;
class AuthorizedClient extends http.BaseClient {
AuthorizedClient(this._authService) : _inner = http.Client();
final http.Client _inner;
final AuthService _authService;
Future<http.StreamedResponse> send(http.BaseRequest request) async {
final token = await _authService.getAccessToken();
request.headers['Authorization'] = 'Bearer $token';
final response = await _inner.send(request);
if (response.statusCode == 401) {
final newToken = await _authService.refreshAccessToken();
request.headers['Authorization'] = 'Bearer $newToken';
// throws error: Bad state: Can't finalize a finalized Request
final retryResponse = await _inner.send(request);
return retryResponse;
}
return response;
}
}
abstract class AuthService {
Future<String> getAccessToken();
Future<String> refreshAccessToken();
}