我正在使用 gRPC 生成的 dart 客户端,并且需要Authorization为每个请求添加标头。我知道有,ClientInterceptor但我想问是否有任何方法可以在拦截器的方法中调用异步方法,因为我有一个用于检索令牌的异步方法:
static Future<String> getToken() async {
final CognitoAuthSession session = await Amplify.Auth.fetchAuthSession(
options: CognitoSessionOptions(getAWSCredentials: true)
);
return session.userPoolTokens.idToken;
}
Run Code Online (Sandbox Code Playgroud)
Bat*_*ing 10
经过更多谷歌搜索后,我发现MetadataProviderreturn FutureOr<void>,因此您可以调用异步方法。
最终拦截器的代码
class AuthenticationInterceptor extends ClientInterceptor {
FutureOr<void> _provider(Map<String, String> metadata, String uri) async {
final token = await AuthenticationService.getToken();
metadata['Authorization'] = "Bearer $token";
}
@override
ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {
return super.interceptUnary(
method,
request,
options.mergedWith(CallOptions(providers: [_provider])),
invoker
);
}
}
Run Code Online (Sandbox Code Playgroud)
你可以像这样使用它
final client = YourGrpcClient(clientChannel, interceptors: [AuthenticationInterceptor()]);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1088 次 |
| 最近记录: |