websocket或者tcp长连接怎么实现登录验证?

长连接服务或者消息推送系统,我想要跟注册用户绑定,意思就是注册用户登录成功的连接才能正常建立
要解决这个问题,一般采用什么方式或者思路呢?

阅读 47.9k
5 个回答

可以在ws的url里加参数,比如: wss://127.0.0.1/websocket?user=foo&password=bar,WebSocket服务器在握手的时候可以得到参数里的信息,认证成功后握手成功建立连接,不成功则关闭连接。

新手上路,请多包涵

tcp 长连接没有做过,不大清楚
我这边有两种 WebSocket Token 认证方式

  1. wss 路径参数中加上 Token,优点是在 @OnOpen 方法中就可以进行 Token 认证与 Token 和 Session 的成对存储,简单方便,缺点是认证时不够安全;
  2. wss 路径参数中不加 Token,而是在客户端的 @OnOpen 方法中调用 session.getBasicRemote().sendText(String) 来发送验证信息,在服务器端的 @OnMessage 中进行 Token 认证与 Token 和 Session 的成对存储,优点是认证时较安全,缺点是 @OnMessage 中混杂认证与信息传输,方法不再那么纯,而且频繁传输小数据代码性能会不如第一种;

相比之下,我选择了第一种,因为代码逻辑更清晰,而不足的安全方面,我的 WebSocket 仅仅作为服务器新信息通知,具体的信息获取需要使用其他 API,这些 API 都足够安全,一定程度弥补了 WebSocket 认证的不安全性。

楼上的第一种确实也可以,我们这么用过,我目前在考虑第二种方案:

1、首先通过普通的http restful 请求服务器登录,如果通过返回token。
2、拿token去请求接口,校验token,校验通过,简历长连接

  1. 客户端通过用户名密码调用服务端的接口来获取角色Token
  2. 链接websoket时带上此Token(wss://localhost:7896/?token=Token
  3. websoket服务端建立连接时验证此Token是否有效,无效则连接失败
  4. 有效,通过Token中的数据来设置此连接的一些信息(比如:用户ID类似的)
  5. 以后客户端发送请求使用此连接

一种解决方法是:确立建立连接时客户的发送的第一条消息必须是认证消息,如果认真失败,服务器直接断开连接。不过这种方式不太友好。
另外一种比较友好的方式是:服务器对每个连接记录一个认证状态,当然也可以包括用户的基本信息,这样就可以把连接和用户联系到一起了。这也就是常用的Session机制。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进