#ことの発端
小規模な社内向けWebサービスで、データが変更されたことを通知するためにWebSocketを通信している。
そのWebサービスはキオスク化したPCからも見れるようになっているのだが、以前はChromeで全画面表示にしていた。
しかしユーザの認識のため認証させていたサービスなので、いちいちログイン画面を出すのはカッコ悪い。キオスクにはキオスクの口を用意し、各端末を認識できるようなしくみも作るべくElectronクライアントを作成した。
キオスク化すると長時間同じページを表示し続けることになるので、システムアップデート時などロジック含めての更新をしたい場合、View側からリロードをかけるもうまくいかない症状(タッチパネルが効かなくなるなど)が出ており、バックエンド側でWebSocket通信することに。
が
どうにも上手くいかない・・・
コネクション時に403エラーが出る。
Viewは相変わらず、きちんと繋がるのに。。。
この時点でお察しの方はいらっしゃると思うが、単にクロスドメイン問題に引っかかっていただけである。
認証関係なのはわかっているのに闇雲に新規実装中のnode側ばかりを疑って時間を溶かしてしまった。
node側は file://~~~
のようにローカルでうごいてて、
View側は http://~~~
でアクセスしているから上手くいっていた。
この社内サービスのサーバー側はgo+gin
で書いているので、
func (p *App) websocketConnect(c *gin.Context) {
handler := websocket.Handler(p.SocketServer.WebsocketHandler())
handler.ServeHTTP(c.Writer, c.Request)
}
これを
func (p *App) websocketConnect(c *gin.Context) {
s := websocket.Server{Handler: p.SocketServer.WebsocketHandler()}
s.ServeHTTP(c.Writer, c.Request)
}
とするだけで、うまく接続できた。