使用 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 中或通过拦截器进行。

另请参阅:https://groups.google.com/g/grpc-io/c/FeQV7NXpeqA