使用 unix 套接字访问 GRPC 服务器中的底层连接
Accessing underlying connection in GRPC server with unix socket
想知道是否有办法访问底层 net.Conn 以使用 SO_PEERCRED 检索用户凭据并在服务器处理请求之前验证请求。
从https://blog.jbowen.dev/2019/09/using-so_peercred-in-go/开始,需要net.UnixConn到return用于验证的unix.Ucred。因此,如果服务器请求处理程序有某种方法可以到达 net.Conn,这应该很容易
我查看了 UnaryServerInterceptor,但 UnaryServerInterceptor 中似乎没有提供包含 net.Conn
func interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
log.Printf("Intercepted: %+v %+v", info.Server, req) // anything here?
return handler(ctx, req)
}
接口方法TransportCredentials.ServerHandshake
is the seam that you need. Your implementation can read from the input net.Conn
and return the credential as an AuthInfo
. Then in your handler code, you can get the credential out from the context via peer.FromContext
。或者,如果您希望在到达处理程序代码之前进行身份验证,您可以直接在 TransportCredentials.ServerHandshake
中或通过拦截器进行。
想知道是否有办法访问底层 net.Conn 以使用 SO_PEERCRED 检索用户凭据并在服务器处理请求之前验证请求。
从https://blog.jbowen.dev/2019/09/using-so_peercred-in-go/开始,需要net.UnixConn到return用于验证的unix.Ucred。因此,如果服务器请求处理程序有某种方法可以到达 net.Conn,这应该很容易
我查看了 UnaryServerInterceptor,但 UnaryServerInterceptor 中似乎没有提供包含 net.Conn
func interceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
log.Printf("Intercepted: %+v %+v", info.Server, req) // anything here?
return handler(ctx, req)
}
接口方法TransportCredentials.ServerHandshake
is the seam that you need. Your implementation can read from the input net.Conn
and return the credential as an AuthInfo
. Then in your handler code, you can get the credential out from the context via peer.FromContext
。或者,如果您希望在到达处理程序代码之前进行身份验证,您可以直接在 TransportCredentials.ServerHandshake
中或通过拦截器进行。