请教大家 WebSocket 鉴权问题

2020-10-04 13:39:01 +08:00
 sdbybyd

目前项目用 jwt 做 http 的鉴权,保存在 cookie 中,但是 websocket 不能使用 httponly 的 cookie, 看了淘宝还有 fb 的方案,都是用 url 参数带个 token 或者 sessionId 过去后端, 请教下前端如何获取这个发送的 token,或者 ssid,直接请求后台:GET /token 获取吗?这样是否安全

8112 次点击
所在节点    Java
23 条回复
jinliming2
2020-10-05 10:29:03 +08:00
跟 HttpOnly 有什么关系? HttpOnly 的 cookie 在 Websocket 连接的时候也是会正常发送的啊!
刚刚在 Chrome 和 Firefox 下测试没有问题,标记为 HttpOnly 的 Cookie 在 Websocket 握手的时候都可以正常发送。

网上搜了一下,只有 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 进行绑定。加个超时自动断开连接就行。
yc8332
2020-10-05 22:00:26 +08:00
@pagepancn 握手走的 http,只是最后协议升级而已。
codehz
2020-10-06 21:36:35 +08:00
websocket 建议不要玩 http 层的花样,有些浏览器没做好就不会发
我这里提供一个思路,把 token 编码到 url 路径里,短期且一次性的那种(
然后用普通 http api 去请求那个 url

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/712478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX