3

我正在开发一个使用 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 使用了不可修改的地图。

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

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

4

1 回答 1

7

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

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

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

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

第二:如何从选项中复制元数据,对其进行修改并使用修改后的对象?只需通过新值克隆以前的 CallOptionsmergedWith

第二个问题:


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);
  }
}
于 2021-02-09T14:50:15.833 回答