我正在尝试打开具有 kerberos 身份验证的服务器的 websocket,握手时发生错误(错误代码:400); 我看到无法通过网络套接字发送凭据,我要做的就是通过网络套接字cookie设置用户名和密码,服务器将读取它们。 那么如何为网络套接字设置 cookie 呢? 谢谢
这取决于浏览器。 如果 cookie 与初始 HTTP 请求一起到达以启动 WebSocket 连接,您可以实现处理 cookie,但如果您不能要求用户使用 Safari(它使用 WebSocket 打开请求发送 cookie)而不是 Chrome(它没有),您可能必须实现一种机制,让客户端在带内发送会话标识符。
实现此目的的一种简单方法是,客户端代码将会话标识符作为响应open
事件的第一条消息发送,服务器代码将第一条传入消息的内容解释为会话 Cookie,以设置适当的权限上下文(或者,如果 Cookie 未知或未向其持有者授予任何权限,则可能关闭连接)。
或者,如果您的 WebSocket 协议具有某种结构化消息基础结构,则可以定义用于将会话 cookie 传递给服务器的特定消息类型,以及服务器的匹配响应类型,以使客户端知道它对 cookie 的看法。
在URI 参数中传递会话 cookie 可能很诱人,如ws://example.com/service?SESSION=123456
. 这在原型设计中可能已经足够了,但在生产中可能不明智,因为会话 cookie 通常应被视为比处理从 Web 服务器请求的 URI 列表的习惯更敏感。 以这种方式传递会话 cookie 可以在短期内起作用,但可能会通过粗心的分析技术增加其意外暴露的风险。 在其他一些上下文中,可以通过在请求正文中传递敏感标识符(例如,作为所谓的POST
参数)来缓解此问题,但 WebSocket 打开请求不能具有非空正文。
您可以像设置常规 cookie 一样为 webSocket 连接设置 cookie,使用document.cookie = xxxx
. 所有 webSocket 连接都以 HTTP 请求(带有升级标头)开头,并且您连接到的域的 cookie 将与该初始 HTTP 请求一起发送以打开 webSocket。
因此,只要您正在与网页相同的域进行 webSocket 连接,那么您只需为该网页设置一个 cookie,它就会与 webSocket 连接请求一起发送。 而且,与其他 cookie 一样,您可以使用 MDN 上描述的document.cookie
来设置 cookie。