我目前正在尝试访问 Flutter 中需要 JWT 访问令牌进行授权的 Web API。访问令牌在一定时间后过期。
可以使用单独的刷新令牌请求新的访问令牌。现在,只要请求返回 401 响应,就会执行此访问令牌刷新。之后,应该使用新的访问令牌重试失败的请求。
我在最后一步遇到了麻烦。好像http.BaseRequest
只能发送一次。如何使用新令牌重试 http 请求?
正如dart http 自述文件中所建议的那样,我创建了一个子类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();
}