Open5

WebSocketにおける認証方法について

N SomeyaN Someya

発端:
FlutterにおいてPlatform: web(Browser)では、WebSocketに追加のヘッダーを付与することができない。

WebSocketChannelのHtmlWebSocketChannelのconnectメソッドにはheaderを指定する箇所がない。
https://github.com/dart-lang/web_socket_channel/issues/156

これは、dart:ioとdart:htmlの実装差異から来るものであり、WebSocketにおいてブラウザ間でheaderの取扱に差異があることに由来するもの。
https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api

そもそもブラウザ間でheaderの取扱に差異があるのは、BrowserにおけるWebSocket APIの仕様にheaderを指定する機能がないからである
https://html.spec.whatwg.org/multipage/web-sockets.html#network

N SomeyaN Someya

browserにおけるWebScoket認証でとりうる方法

  1. Cookie
    ブラウザからのWebSocketコネクション確立時にCookieは(他のHTTP通信と同じように)付与される
  2. Basic Auth(deprecated)
    ws://username:password@hostname としたときに、自動で Authorization: Bearer base64(username:password) としてくれる
N SomeyaN Someya

ApolloClientとHasuraで試してみたところ。。。
接続開始時にConnection Parameterとしてhttp headerにつけていたsecretをやりとりしている