使用 gRPC 进行基于自定义通道的身份验证

Custom channel based authentication with gRPC

如何在 dotnet 中使用 gRPC 进行简单的通道身份验证?

我只想在通道连接期间传递客户端机器名称和客户端服务名称,然后能够在服务器中获取一次,作为识别请求来自何处的一种方式。

我不想在每次调用中将它们作为元数据传递,我也不想为此实现额外的方法。我一直在查看文档并尝试实现一些抽象的 类,例如 ServerCredentials,但我不知道如何实现,即使由于某些内部 类 甚至可能实现.

当然我不想为此使用 SSL 证书,OAuth2 也不想。

元数据中的授权数据

在元数据中传递它们是一种很好的解决方案。看看hpack。您的 header 将被压缩,只需要几个字节。

您不能将您的身份验证数据绑定到通道,因为在 HTTP/2 中不能保证相同的 TCP 通道将用于后续调用。

就是说,我仍在等待 GRPC java 团队关于基于元数据的自定义身份验证的适当示例。

Stream-based 认证

Stream-based 身份验证也是一个选项,以防您希望在同一 API 的后续调用之间保存身份验证数据。在我的解释中,这意味着您必须仅在流的开头传递身份验证数据。然后,您的 StreamObserver 可以保存身份验证数据并在后续 onNext() 调用中重复使用。我使用这种方法,效果非常好。

例子

service MyService {
  rpc myFunction(stream MyMessage) returns (stream MyResponse)
}
message MyMessage {
  string user = 1;
  string password = 2;

  int32 myMessageVariable = 3;
}

用户/密码只能在 requestObserever 上的第一个 onNext(myMessage) 调用中设置。 这也非常有效,因为在网络上,流由单个字节的 StreamId 表示(取决于您同时打开了多少个流)。