请教大家 WebSocket 鉴权问题

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

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

8382 次点击
所在节点    Java
23 条回复
ila
2020-10-04 13:48:58 +08:00
wss,每次请求加上 token
wd
2020-10-04 14:08:41 +08:00
websocket 按说也是个 http 你可以在 upgrade 连接前判断好 不合规就给它断开
wd
2020-10-04 14:09:22 +08:00
哦 http olny 好吧..
leyle
2020-10-04 14:19:48 +08:00
ws 是个长连接。可以先允许任何 client 与 server 建立连接,然后 server 判断当前用户是否鉴权。
正常请求下,ws client 发起对 server 的连接后,就能够主动 /被动的发送 token 给 server 。
server 可以对未发送 token 的 client 发送要求发送 token 的“指令”,如果在一个 X 秒内没有收到 client 发送过来的 token,server 就可以主动断开连接。如果同一个 client 多次发起连接且没有鉴权成功,就用其他机制限制链接一段时间。
sdbybyd
2020-10-04 14:51:12 +08:00
@leyle 这个 token 怎么来呢,重 cookie 提取吗? httoonly 的 cookie 没办法
sdbybyd
2020-10-04 14:51:44 +08:00
@wd 这个思路有想过 不过感觉还是有点奇怪
JimmyChange
2020-10-04 15:08:02 +08:00
在建立 websocket 链接的请求可以读取 cookie 吧?就是需要返回 101 的那个请求里

要是使用 token,直接提供给 api 获取 token 就好了吧
Arrowing
2020-10-04 15:11:01 +08:00
有个思路不知道行不行
就是客户端请求服务器的时候,将客户端特征信息(记为 ID )保存下来,保证唯一性(这个得自己想法子)。
在 Redis 里,保存对应的状态。
每次内容到服务器就到 Redis 里去找这个 ID,查找对应的状态。
momocraft
2020-10-04 15:27:57 +08:00
用 cookie 換一個一次性 token,用那個 token 連接?
sdbybyd
2020-10-04 16:54:23 +08:00
@JimmyChange 这样可能有安全问题,httponly 属性就是为了前端无法读取 cookie 里面的 token,暴露这个 API 感觉不太好
sdbybyd
2020-10-04 16:55:03 +08:00
@Arrowing 你这个思路就是 jwt 了,关键前端如何通过 websocket 吧这个东东发给后台
sdbybyd
2020-10-04 16:58:25 +08:00
感觉还是在 beforeHandshake 这个 hook 上动手脚
micean
2020-10-04 19:29:52 +08:00
ws 连接的时候也有 cookie 啊,跟 httponly 没关系吧
既然是 httponly,说明是服务端自己管理令牌,但是换成 ws 却管理不了了?
我不太明白……
yc8332
2020-10-04 20:18:29 +08:00
和 http 一样啊。。websocket 本来就是基于 http 的
yogogo
2020-10-04 20:45:57 +08:00
token 是前端请求登入的时候后端返回的,然后前端每个请求都要带上 token,websocket 一样道理
xrr2016
2020-10-04 20:53:55 +08:00
第一次建立 ws 链接的时候用的是普通的 http 协议,之后才是 ws
hijoker
2020-10-04 20:59:59 +08:00
登陆,鉴权 http 服务, 返回 token,连接 ws,需要带上这个 token,后端校验 token,成功就连接,不然就断开
pagepancn
2020-10-05 00:16:30 +08:00
@yc8332 不对吧,websocket 是基于 socket 的吧
abersheeran
2020-10-05 01:43:44 +08:00
看你的客户端了。如果你客户端包含标准浏览器,那么只能走 url 参数的路子。别问,问就是浏览器标准傻逼,这个玩意他们讨论好几年也没个定论,等确定好了再等实现出来,你估计都 35 岁退休了。

如果你客户端只是需要满足非浏览器,那简单了,websocket 握手用的 http 协议,你该咋鉴权咋鉴权。
JimmyChange
2020-10-05 04:10:04 +08:00
@sdbybyd 有什么安全问题?又不是让你返回 JWT 的 token,返回个一次性验证 token 不就行了

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

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

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

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

© 2021 V2EX