6

現在、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();
}
4

2 に答える 2