本文介绍了飞镖GRPC拦截器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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使用不可修改的映射。

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

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

推荐答案

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

因此,请毫不犹豫地在元数据词典中添加自定义身份验证头。可以像您一样通过拦截器或通过CallOptions:

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

第二个问题:


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);
  }
}

这篇关于飞镖GRPC拦截器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 04:39