If I were in your shoes, I would keep the client synced with server on an interval. Like sending requests to the server every few seconds, which contains the data that contains the last updates of the user answers. Then trace the answers and updates based on these client requests "on the server-side". That is what I mean by internally, You should check everything on the server-side. Then for example, you just simply reject the answers that are received after the end of the quiz.
For just accepting answers that are provided in time, you don't need an interval. Just send a request when a new answer is provided or an answer is edited.
The interval based syncing, has the advantage that user interface may also always be updated according the server time. You could fill the gaps using an interval function on the client, but everything will be updated and in sync with the server on intervals. You could also track any problems this way, like for example disconnection and reconnection. Changes in the network (for cheating purposes) and etc.