Summary
With WAHA GOWS 2026.8.1, the WebAuthn assertion is successfully generated and accepted by the passkey endpoint, but the session never receives the expected continuation event. It remains in PASSKEY_REQUIRED until the pairing attempt expires or is stopped.
This is the post-assertion step described in tulir/whatsmeow#1186: after SendPasskeyResponse(), the client should receive PairPasskeyConfirmation (or proceed to successful pairing). Neither happens.
Environment
- WAHA image:
devlikeapro/waha:gows-2026.8.1
- Engine: GOWS
- GOWS version:
v1.0.45
- whatsmeow fork revision used by GOWS:
devlikeapro/whatsmeow@78592f479441
- Primary account: WhatsApp Business on iPhone
- WebAuthn handoff: official WAHA Chromium extension on desktop Chrome/macOS
- Pairing method: QR code
Reproduction
- Create and start a fresh GOWS session.
- Scan the QR code from WhatsApp Business on the iPhone.
- Session moves to
PASSKEY_REQUIRED.
- Fetch the challenge with:
GET /api/{session}/auth/passkey/challenge
- Pass the challenge unchanged to the official WAHA extension.
- Approve the cross-device passkey request on the iPhone.
- Submit the returned
credential.toJSON() unchanged to:
POST /api/{session}/auth/passkey
- The endpoint returns HTTP 201.
- Poll the live session status.
Observed result
- The assertion is structurally valid:
type = webauthn.get
- origin is
https://web.whatsapp.com
- authenticator RP ID hash matches
whatsapp.com
- user verification is present
- authenticator attachment is
cross-platform, consistent with the iPhone handoff
POST /api/{session}/auth/passkey returns 201.
- The session stays in
PASSKEY_REQUIRED for more than 110 seconds.
- No
PASSKEY_CONFIRMATION_REQUIRED status is emitted.
- No confirmation code becomes available.
- No
WORKING status is reached.
- No passkey error is surfaced.
- The session is not stopped or restarted while waiting.
The flow has been reproduced on repeated fresh attempts.
Expected result
After the assertion is accepted, the session should either:
- transition directly to
WORKING; or
- emit
PASSKEY_CONFIRMATION_REQUIRED, expose the confirmation code, and allow POST /api/{session}/auth/passkey/confirm; or
- surface a protocol/passkey error instead of remaining silently blocked.
Similar report
evolution-foundation/evolution-go#107 reports the same behavior for a WhatsApp Business account: a correct WebAuthn assertion is submitted, the socket stays alive, but WhatsApp never sends PairPasskeyConfirmation.
Questions
- Is this silent post-assertion state known for some WhatsApp Business accounts?
- Does GOWS log or expose whether
SendPasskeyResponse() received the expected IQ result but never received crsc_continuation?
- Is an additional handoff/continuation step required for these accounts?
- Which debug logging can we enable to provide a sanitized wire-level trace?
- Should this be escalated upstream to whatsmeow, or could it be specific to the devlikeapro fork/GOWS integration?
We can provide sanitized timestamps and debug logs, but will not publish the raw challenge or authenticator assertion.
Summary
With WAHA GOWS 2026.8.1, the WebAuthn assertion is successfully generated and accepted by the passkey endpoint, but the session never receives the expected continuation event. It remains in
PASSKEY_REQUIREDuntil the pairing attempt expires or is stopped.This is the post-assertion step described in tulir/whatsmeow#1186: after
SendPasskeyResponse(), the client should receivePairPasskeyConfirmation(or proceed to successful pairing). Neither happens.Environment
devlikeapro/waha:gows-2026.8.1v1.0.45devlikeapro/whatsmeow@78592f479441Reproduction
PASSKEY_REQUIRED.GET /api/{session}/auth/passkey/challengecredential.toJSON()unchanged to:POST /api/{session}/auth/passkeyObserved result
type = webauthn.gethttps://web.whatsapp.comwhatsapp.comcross-platform, consistent with the iPhone handoffPOST /api/{session}/auth/passkeyreturns 201.PASSKEY_REQUIREDfor more than 110 seconds.PASSKEY_CONFIRMATION_REQUIREDstatus is emitted.WORKINGstatus is reached.The flow has been reproduced on repeated fresh attempts.
Expected result
After the assertion is accepted, the session should either:
WORKING; orPASSKEY_CONFIRMATION_REQUIRED, expose the confirmation code, and allowPOST /api/{session}/auth/passkey/confirm; orSimilar report
evolution-foundation/evolution-go#107 reports the same behavior for a WhatsApp Business account: a correct WebAuthn assertion is submitted, the socket stays alive, but WhatsApp never sends
PairPasskeyConfirmation.Questions
SendPasskeyResponse()received the expected IQ result but never receivedcrsc_continuation?We can provide sanitized timestamps and debug logs, but will not publish the raw challenge or authenticator assertion.