首页 > 解决方案 > 异步拦截器(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;
}

标签: dartgrpc

解决方案


经过一番谷歌搜索后,我发现了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
    );
  }
}

你可以像这样使用它

final client = YourGrpcClient(clientChannel, interceptors: [AuthenticationInterceptor()]);

推荐阅读