
websocket 客户端需将 jwt token 通过 `authorization: bearer
在基于 WebSocket 的认证场景中,常见误区是将 JWT Token 直接拼入 WebSocket 连接 URL 的查询参数(如 ?token=xxx 或 ?access_token=xxx),但标准 JWT 认证中间件(如 github.com/dgrijalva/jwt-go)默认不解析 URL 查询参数中的 token。其验证逻辑严格遵循 RFC 6750 规范,优先检查 Authorization 请求头(格式为 Bearer
✅ 正确做法:通过 WebSocket 客户端显式设置 Authorization 请求头。
以 Python 客户端为例(使用 websocket-client 库):
from websocket import create_connection
def test_auth_token(token, ip, port, uuid):
url = f"ws://{ip}:{port}/{uuid}"
# 关键:传入 header 列表,添加 Authorization 头
headers = [f"Authorization: Bearer {token}"]
conn = create_connection(url, header=headers)
try:
result = conn.recv()
print("Connection successful:", result)
assert result is not None
finally:
conn.close()⚠️ 注意事项:
- WebSocket 握手是 HTTP 协议的 GET 请求,但不支持发送请求体,因此无法使用 POST + body 传 token;
- 查询参数(如 ?access_token=...)虽能被服务端 req.URL.Query().Get("access_token") 手动获取,但 jwt-go 的 ParseFromRequest 不会自动读取它——你必须自行提取并调用 jwt.Parse();
- 若必须使用查询参数(如兼容旧客户端),应在 Go 服务端手动增强解析逻辑:
// 替代方案:扩展 token 提取逻辑(在 ParseFromRequest 前)
func getTokenFromRequest(req *http.Request) (string, error) {
// 1. Header 优先
if auth := req.Header.Get("Authorization"); auth != "" && strings.HasPrefix(strings.ToLower(auth), "bearer ") {
return strings.TrimSpace(auth[7:]), nil
}
// 2. 查询参数兜底
if tok := req.URL.Query().Get("access_token"); tok != "" {
return tok, nil
}
return "", errors.New("no token found in header or query")
}? 总结:
JWT 授权应遵循标准化传输方式——Authorization: Bearer









