使用 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 表示(取决于您同时打开了多少个流)。
如何在 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 表示(取决于您同时打开了多少个流)。