Wondering if there is a way to access the underlying net.Conn to retrieve user credentials using SO_PEERCRED and verify a request before it is handled by the server.
From https://blog.jbowen.dev/2019/09/using-so_peercred-in-go/, the net.UnixConn is needed to return the unix.Ucred used for verification. So if there is some way for the server request handler to get at the net.Conn, this should be easy
I looked at a UnaryServerInterceptor, but nothing provided in UnaryServerInterceptor seems to contain the 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)
}
CodePudding user response:
The interface method 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
. Alternatively, if you prefer to have authentication occur before the handler code is reached, you can do that directly in the TransportCredentials.ServerHandshake
or via an interceptor.