If command latency is acceptable (RTS style) then I’d use deterministic command queues.
if command latency is not acceptable, then I’d implement a “push” event that pushes both players equally hard in opposite direction, and make a rule that the same player pair can only have one push event per half-second or so. I would detect the need to push probably on collision, and send it to the server, but also locally pre-execute it for instant feedback. I would separately just stop a player when they (locally) run into another player, and send a “player stopped” message to the server.
Another option is to let a player use a “push” action that launches the other player but not themselves, like an explicit attack. Make it succeed if they players are close enough. Make it send an event that the “attack” has happened, and play it the same way on both clients and on the server.