security(transport): subprotocol + Authorization header for webchat auth #2
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/webchat-auth-hardening"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Résumé
Companion à
serge/messenger-botPRfeat/webchat-auth-hardening. Doit être bundlée/déployée en parallèle du rebuild bot (breaking wire format).Changements
Sec-WebSocket-Protocolsubprotocols (messenzy.v1,messenzy-bot.<id>,messenzy-visitor.<id>,messenzy-key.<key>). Le constructorWebSocket(url, protocols)browser ne permet pas de set custom headers, donc subprotocols sont le pattern standard./webchat/msg,/webchat/history) :Authorization: Bearer <apiKey>(browser fetch supporte les custom headers, contrairement au WebSocket ctor).botIdetvisitorIdrestent dans body/query (public identifiers). SeulapiKeypart de l'URL.API publique inchangée
createTransport(opts: TransportOpts)prend toujours{ botId, apiKey, visitorId, serverUrl, onMessage, onConnectionChange? }. Les consommateurs (Widgetcomponent) n'ont rien à modifier.Pourquoi
Query strings sont log par les reverse proxies (Caddy default access log inclut le path complet), browser history, et HTTP Referer headers cross-origin. La clé
widget_api_keyétait leakable sur tous ces vecteurs. Subprotocol + Bearer header sont invisibles par défaut côté logs.Test plan
tsc --noEmitclean.vite build) → tester sur une page locale avec un bot setup en mode dev.?apiKey=...mais queSec-WebSocket-Protocolrequest header inclutmessenzy-key.<...>./webchat/msgPOST request aAuthorization: Bearer <...>header.Cutover
Ce widget bundle doit être (re)déployé EN MÊME TEMPS que le bot rebuild post-merge bot PR. Les vieux clients (avec query string) seront rejetés en 401 par le nouveau bot. Comme le widget est encore en alpha, impact = 0 utilisateur réel.
Match the bot-side hardening (serge/messenger-bot feat/webchat-auth-hardening): credentials no longer leak via URL query strings. * WebSocket handshake uses Sec-WebSocket-Protocol subprotocols (messenzy.v1, messenzy-bot.<id>, messenzy-visitor.<id>, messenzy-key.<key>) — the browser WebSocket ctor doesn't accept custom headers, so subprotocols are the standard pattern. * HTTP fallback (/webchat/msg, /webchat/history) uses `Authorization: Bearer <apiKey>` — fetch supports custom headers. * botId/visitorId stay in body/query as public identifiers; only the apiKey moves off the URL. No public API change — `createTransport(opts)` takes the same TransportOpts as before.