【问题标题】:Configuring authentication headers for WebSocket connection为 WebSocket 连接配置身份验证标头
【发布时间】:2015-05-11 23:29:39
【问题描述】:

IIUC,当我创建一个 WebSocket 时,一个 HTTP 请求被发送到指定的 URL,其中包含一个升级请求。是通常与此升级请求一起传递身份验证信息,还是应该单独执行?

var websocket = new WebSocket("ws://domain:port/foo"); // Can I include authentication headers with the initial upgrade HTTP request?

【问题讨论】:

  • 没有认证...
  • @dandavis 请你澄清一下。当然,身份验证标头可以与升级请求一起发送——它是一个 HTTP 请求。
  • 我的意思是显示... http url 是http url。也就是说,套接字包通常有责任捕获传入的连接,因此集成选项可能会受到套接字主机的限制,但不受 http 限制。您可以在最后重定向到套接字提供的 http url 来做一些花哨的事情。
  • 我明白了,所以 WebSocket API 没有提供直接的方法来配置随连接请求发送的 HTTP 标头?
  • 您需要深入了解您正在使用的任何服务器端 websockets 工具的文档,但不要抱太大希望。也就是说,让客户端通过套接字本身发送令牌非常容易,并且在发送之前不给他们任何数据,如果他们花费很长时间或做出错误的猜测,则丢弃它们。

标签: javascript http websocket


【解决方案1】:

WebSocket RFC standard 没有定义任何特定于协议的客户端身份验证机制,但提到 HTTP 身份验证是一个可能的选项:

10.5。 WebSocket 客户端身份验证

此协议没有规定服务器可以使用的任何特定方式 在 WebSocket 握手期间对客户端进行身份验证。 WebSocket
服务器可以使用任何可用的客户端身份验证机制
通用 HTTP 服务器,例如 cookie、HTTP 身份验证或 TLS
身份验证。

http URL 的标准规定了一种在 URL 中包含登录凭据的表单。表格是http://username:password@www.example.com/file。但并非所有浏览器都支持这种语法,因为坦率地说,这是一个非常糟糕的主意。

The WebSocket API 不公开任何用于 HTTP 客户端身份验证的功能。这意味着网络浏览器应该像通常那样提供身份验证:当他们决定支持时使用上面的 URL 语法,或者通过向用户显示一个弹出窗口来输入他们的登录凭据。

【讨论】:

    【解决方案2】:

    你应该通过web进行身份验证,返回一个cookie,然后再次连接到websocket服务器,携带cookie。 WS 服务器可以验证 cookie

    如果没有基于 cookie 的身份验证,或者根本不可能(如另一个域中的 WS 服务器),您将必须创建自己的登录请求-响应消息。

    【讨论】:

    • 为什么不在 WS URL 参数中传递会话 ID?
    • URL 参数通常由代理记录。
    猜你喜欢
    • 2017-08-12
    • 2015-01-25
    • 2019-03-15
    • 2011-09-04
    • 2019-06-19
    • 2021-09-26
    • 2015-03-07
    • 2015-09-09
    • 2011-09-11
    相关资源
    最近更新 更多