Call your backend only. Use verifyUrl as returned — do not build it, do not append to it, and do not navigate to it.

Start verify

handoff is single-use with a 120 s TTL. Start verify when the user is ready, not minutes ahead.

The landing page is just a page

After verification the browser arrives on your registered returnUrl with a plain GET:
Nothing on that URL is sensitive, and nothing on it proves anything. Your server finishes the verification on that route — it calls GET /session/{id} with its own credentials, checks state and userRef, and performs the action. Your normal cookies are present; it is an ordinary same-site GET. The simplest shape is to let that server route redirect the user onward, so the browser only ever sees your own success or failure page. If you would rather render it client-side, ask your own API:
There is no callback route in the frontend, no query-string secrets to read, and no postMessage listener to write. More: Frontend overview · Backend overview