Two routes: a start route your frontend calls, and the GET landing route (your registered returnUrl) that reads the outcome back. There is nothing to receive — Authentica never calls you, so there is no route to exempt from CSRF and no raw-body handling anywhere.

1. Configuration

.env (server only — never expose to the browser):
config/services.php:
Register AUTHENTICA_RETURN_URL in the portal, matched as a whole string, and send exactly that value on /session.

2. Routes

Both are ordinary web routes with your normal session middleware:

3. Controller

app/Http/Controllers/AuthenticaController.php:

4. The user who never came back

No redirect fires if the tab is closed. A scheduled command over your own pending records, one GET /session/{id} each inside the 24 h retention window, feeds verified results through the same onVerified.

5. Connect the frontend

After your start route returns { verifyUrl, handoff }:
Server-rendered equivalent, if you emit the handoff from a Blade view (interpolate $verifyUrl and $handoff where the placeholders are):
That is the whole frontend. The browser lands on /verify/done, and your server finds out what happened. More: Session status · Frontend overview.