相当于golang的PerRPCCredentials的python gRPC

时间:2019-11-29 08:07:51

标签: python authentication http-headers authorization grpc

我已经在golang中实现了一个gRPC服务器,该服务器需要自定义授权信息,即电子邮件和api_key(通过TLS加密的连接)。在golang中,我可以使用PerRPCCredentials轻松实现客户端,该过程只需创建一个元数据映射,例如{“ email”:电子邮件,“ api_key”:apiKey}。 (然后,我在服务器端使用StreamInterceptor从传入的上下文中提取它们,然后对其进行验证)。但是,我不知道如何为python客户端做等效的工作。我已经尝试实现https://github.com/grpc/grpc/tree/master/examples/python/auth中记录的AuthMetadataPlugin,并在以下示例中实现:https://github.com/grpc/grpc/blob/master/examples/python/auth/customized_auth_client.py

class AuthMetadataPlugin:
  def __init__(self, email, api_key):
    self.email = email
    self.api_key = api_key
  def __call__(self, context, callback):
    callback((('email', self.email), ('api_key', self.api_key)), None)

但是我遇到以下错误:TypeError: Cannot convert grpc._cython.cygrpc.MetadataPluginCallCredentials to grpc._cython.cygrpc.ChannelCredentials ,当我致电grpc.metadata_call_credentials(AuthMetadataPlugin(email, api_key))时。

更令人困惑的是,许多文档似乎都在谈论添加自定义HTTP标头,但是我只希望此授权信息在每个(流式)RPC调用中发送一次,而不是在这些调用的每个HTTP帧中发送一次。 (当然,我不确定它在golang中如何工作,但是我知道我的StreamInterceptor在每个流式RPC调用中仅被调用一次。)

如何将该授权信息添加到python中的RPC调用中,以便我的golang gRPC服务器可以将其从传入的上下文中拉出?

1 个答案:

答案 0 :(得分:0)

这确实有效,我将凭据以错误的顺序传递给复合作曲者-必须先获取tls凭据。