通过 HTTP 中间件验证 WebSocket 连接
WebSocket 连接提供了客户端和服务器之间实时通信的方式。但是,与 HTTP 请求不同,WebSocket 本身并不支持授权或身份验证。为了解决这个问题,可以使用 HTTP 中间件来保护 WebSocket 连接。
问题陈述
一种常见的方法是使用应用程序的 HTTP 验证代码来验证升级握手请求。然而,事实证明,使用 Gorilla 的 WebSocket 升级程序在 Golang 中实现这种方法具有挑战性。
社区建议
一些社区建议包括:
失败的策略
失败的策略涉及添加自定义标头(“X-Api -Key") 到初始 HTTP GET 请求,并且仅升级具有匹配密钥的客户端。然而,这导致客户端无法利用 WebSocket 协议,并在服务器上出现“升级”令牌未找到错误。
策略 1 的改进解决方案
至改进策略1,认证应该在WebSocket握手本身上进行。这可以通过将身份验证标头作为最后一个参数传递给客户端代码中的 Dial 来实现。
<br>func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"} headers := http.Header{"X-Api-Key": []string{"test_api_key"}} conn, _, err := websocket.DefaultDialer.Dial(u.String(), headers) if err != nil { log.Fatalf("dial err: %v", err) }
}
在服务器端,应使用应用程序现有的代码来执行握手过程中对 HTTP 请求进行身份验证的代码。这可确保仅在客户端获得授权的情况下才能建立 WebSocket 连接。
以上是HTTP 中间件如何保护 Golang 中的 WebSocket 连接?的详细内容。更多信息请关注PHP中文网其他相关文章!