dart Grpc 的拦截器

Interceptors of dart Grpc

我正在开发一个使用 Grpc 连接到服务器的 flutter 应用程序。一些服务需要额外的元数据来进行身份验证,所以我首先想到的是实现一个拦截器来将元数据添加到这些请求中,如下所示:

class MyClientInterceptor implements ClientInterceptor {

  @override
  ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {

    var newOptions = CallOptions.from([options])
      ..metadata.putIfAbsent('token', () => 'Some-Token');
    return invoker(method, request, newOptions);
  }
}

但我得到 Caught error: Unsupported operation: Cannot modify unmodifiable map 因为 CallOptions 使用不可修改的映射。

第一个问题:向某些请求添加身份验证而不是使用这些元数据创建客户端存根的最佳做法是什么?

第二:如何从选项中复制元数据,修改它并使用修改后的对象?

First question: What is the best practice to add authentication to some of the requests instead of creating the Client stub with those metadata?

我看到的一些 AUTH 库使用元数据来提供身份验证 token/key 等。 例如https://github.com/grpc/grpc-dart/blob/master/lib/src/auth/auth.dart#L43

所以不要犹豫,在元数据字典中添加您的自定义身份验证 header。可以像您一样通过拦截器或通过 CallOptions:

final resp = await _grpcClient.someApiCall(req,
          options: CallOptions(metadata: {'auth': 'your token'}));

Second: How can I copy the metadata from options, modify it and use the modified object? Just clone previous CallOptions with new value via mergedWith

第二个问题:


class MyClientInterceptor implements ClientInterceptor {

  @override
  ResponseFuture<R> interceptUnary<Q, R>(ClientMethod<Q, R> method, Q request, CallOptions options, invoker) {

    var newOptions = options.mergedWith(
       CallOptions(
        metadata: <String, String>{
          'token': 'Some-Token',
        }
       )
    );
      
    return invoker(method, request, newOptions);
  }
}