我在golang实现了一个gRPC服务器,它需要自定义授权信息,即电子邮件和api\ U密钥(通过TLS加密连接)。在golang中,我可以使用perrpcredentials轻松实现客户机,它只需创建一个元数据映射,如{“email”:email,“api\u key”:apiKey}。(然后我在服务器端使用StreamInterceptor从传入上下文中提取它们,然后验证它们)。但是,我不知道如何对python客户机执行等效操作。我已经尝试实现了一个AuthMetadataPlugin,如这里的文档https://github.com/grpc/grpc/tree/master/examples/python/auth和这里的示例: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服务器可以将其从传入上下文中拉出?你知道吗
这实际上起到了作用,我将凭据以错误的顺序传递给复合编写器—必须首先传递tls凭据。你知道吗
相关问题 更多 >
编程相关推荐