dart - 异步拦截器(gRPC dart)
问题描述
我正在为 dart 使用 gRPC 生成的客户端,我需要Authorization
为每个请求添加标头。我知道有,ClientInterceptor
但我想问一下是否有任何方法可以在拦截器的方法中调用异步方法,因为我有这个用于检索令牌的异步方法:
static Future<String> getToken() async {
final CognitoAuthSession session = await Amplify.Auth.fetchAuthSession(
options: CognitoSessionOptions(getAWSCredentials: true)
);
return session.userPoolTokens.idToken;
}
解决方案
经过一番谷歌搜索后,我发现了MetadataProvider
return 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
);
}
}
你可以像这样使用它
final client = YourGrpcClient(clientChannel, interceptors: [AuthenticationInterceptor()]);
推荐阅读
- haskell - 倾斜二项式堆能否支持高效合并?
- ios - CIImage 裁剪并渲染到 CVPixelBuffer
- react-native - 将 componentWillReceiveProps 重命名为 componentDidUpdate
- javascript - 用高阶组件包装递归组件
- c++ - g ++详尽的内存使用情况编译自动生成的代码
- r - 在 R 中编写阈值函数
- c# - 在命名空间“System.Data.SqlClient”中找不到类型名称“SqlConnection”
- influxdb-2 - InfluxDB 2.0.2 的配置文件路径在哪里?
- php - Github WebHooks 获取分支详细信息
- python - 动态更改行大小 PySimpleGUI