请教大家 WebSocket 鉴权问题
目前项目用 jwt 做 http 的鉴权,保存在 cookie 中,但是 websocket 不能使用 httponly 的 cookie, 看了淘宝还有 fb 的方案,都是用 url 参数带个 token 或者 sessionId 过去后端, 请教下前端如何获取这个发送的 token,或者 ssid,直接请求后台:GET /token 获取吗?这样是否安全
目前项目用 jwt 做 http 的鉴权,保存在 cookie 中,但是 websocket 不能使用 httponly 的 cookie, 看了淘宝还有 fb 的方案,都是用 url 参数带个 token 或者 sessionId 过去后端, 请教下前端如何获取这个发送的 token,或者 ssid,直接请求后台:GET /token 获取吗?这样是否安全
要是使用 token,直接提供给 api 获取 token 就好了吧
如果你客户端只是需要满足非浏览器,那简单了,websocket 握手用的 http 协议,你该咋鉴权咋鉴权。
网上搜了一下,只有 2010 年 1 月苹果的 Webkit 存在 bug 导致 HttpOnly Cookie 在 WebSocket 下不发送,但是也早已修复: https://bugs.webkit.org/show_bug.cgi?id=34289
另外搜到一个 UC 浏览器同样的问题: https://stackoverflow.com/questions/43224033/uc-browser-not-sending-httponly-cookie-for-websocket-calls 估计也是用了那个有问题的版本的 Webkit 内核代码。
如果确实要考虑这些使用旧版带 bug 的浏览器的用户,这个问题下也给出了参考方案:在 WebSocket 连接建立之后,若用户没有携带 Cookie,则在 Websocket 中给用户一个唯一 ID,用户拿到 ID 之后通过正常的 HTTP 带上 Cookie 请求一个 API,这样就可以将这个 Websocket 连接的 ID 与用户的 Cookie 进行绑定。加个超时自动断开连接就行。