【问题标题】:Authentication before opening a Websocket打开 Websocket 之前的身份验证
【发布时间】:2015-01-11 22:07:34
【问题描述】:

通过身份验证保护 websocket 的最先进方法是什么?

问题是,每个人都可以下载 js 文件并查看页面连接的 websocket 的主机和端口。 我想到的唯一方法是:打开一个 wss(安全 websocket)并发送例如凭据并在凭据错误时关闭服务器端的连接?

【问题讨论】:

  • 是的,问题是。一些库,例如github.com/theturtle32/WebSocket-Node 建议使用服务器端跨源保护。 wss 只是加密你的流量。
  • 好的,基本上客户端必须提供一些信息(例如用户名+密码),服务器决定他是否接受连接?
  • 通常身份验证产生抛出http,客户端获取一些秘密令牌(会话),保存在cookie中。令牌可以是打开套接字连接时的密钥(ws://localhost:8000?token=1234)
  • 谢谢!以及如何验证令牌在 node.js 中是否有效?
  • 与工作服务器端会话机制相同。您应该在某处存储已打开令牌的列表并检查其中一个。好的决定是使用带有过期选项的 Redis 集进行存储会话。

标签: javascript node.js websocket


【解决方案1】:

首先,WebSocket 请求有一个Origin HTTP 标头,指示客户端正在运行的域。因此,如果您的站点是 www.whatever.com,并且您收到一个以 www.smartass.com 作为来源的 WebSocket 请求,您可以拒绝它。这将防止其他人无意中让用户连接到您的服务。也就是说,仍然可以通过伪造该标头从任何地方访问您的服务,但必须故意这样做。

WebSockets 使用 HTTP 协商,因此它们可以在协商过程中携带 cookie。如果您的 WebSocket 服务与站点的其余部分位于同一域或子域中,则您可以共享 cookie。因此,例如,当您的用户成功登录时,将返回一个 cookie,他将使用该 cookie 在与服务器的每次 HTTP 交互中验证自己,包括 WebSocket 服务。只需拒绝任何没有有效 cookie 的请求,您就完成了。

如果他们在不同的域中,你可以照你说的做,使用 loginRequest/loginResponse 消息来验证连接。

【讨论】:

  • 我可以通过.htaccess文件进行普通HTTP认证以外的认证吗?我在想如果我想使用 yubikey 或其他东西来进行双向身份验证......这可能通过 HTTP 吗?
  • Websocket 协商和 http 一起玩,所以有可能,但我不确定。
猜你喜欢
  • 2015-01-25
  • 2011-09-04
  • 1970-01-01
  • 2022-09-29
  • 2021-08-22
  • 2021-10-04
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多