0

0

WebSocket 连接中使用 JWT Token 进行授权的正确方式

聖光之護

聖光之護

发布时间:2026-01-13 23:31:01

|

749人浏览过

|

来源于php中文网

原创

WebSocket 连接中使用 JWT Token 进行授权的正确方式

websocket 客户端需将 jwt token 通过 `authorization: bearer ` 请求头传递,而非 url 查询参数;服务端(go)默认仅从请求头或表单字段解析 token,不自动读取查询字符串中的 `access_token` 参数。

在 WebSocket 协议中,连接建立阶段本质上是 HTTP Upgrade 请求(即 GET 请求携带 Upgrade: websocket 头),因此客户端可且应当像普通 HTTP 请求一样,在请求头中携带认证信息。而你当前的实现——将 token 拼入 URL 查询参数(如 ?token=xxx 或 ?access_token=xxx)——虽语法合法,但无法被 jwt-go 的 ParseFromRequest 函数识别,原因如下:

? 为什么查询参数不生效?

ParseFromRequest 的源码逻辑明确只检查两个位置:

  1. Authorization 请求头(格式为 Bearer );
  2. 已解析的表单数据(req.Form.Get("access_token")),这要求请求是 multipart/form-data 或 application/x-www-form-urlencoded 类型,并完成 req.ParseMultipartForm() 或 req.ParseForm()。

⚠️ 关键点:WebSocket 握手请求是纯 HTTP GET,不包含请求体,也不触发自动表单解析。即使你在 URL 中添加 ?access_token=xxx,req.Form 默认为空(除非显式调用 req.ParseForm()),且 ParseFromRequest 并未尝试从 req.URL.Query() 中提取参数。

✅ 正确做法:通过请求头传递 Token

使用支持自定义 header 的 WebSocket 客户端库(如 websocket-client),在握手请求中注入 Authorization 头:

萌次元商城 V4.5.0.16
萌次元商城 V4.5.0.16

萌次元商城是一个针对二次元的开源发卡系统。系统免费开源、界面美观、功能丰富。 (存在与第三方服务器连接的付费增值服务,但自身免费功能能够满足基本需求) 版权:遵循MIT协议从lizhipay处获得授权进行再分发 特色功能: 1.可以分发密钥,作为发卡网使用 2.可以关联快递单号,作为微商自建电商平台使用 3.支持多种支付方式,包括微信、支付宝、银联和国际

下载
from websocket import create_connection

def test_auth_token(token, ip, port, uuid):
    url = f"ws://{ip}:{port}/{uuid}"
    headers = [f"Authorization: Bearer {token}"]  # ✅ 关键:Bearer + 空格 + token
    conn = create_connection(url, header=headers)
    try:
        result = conn.recv()
        print("Connected and received:", result)
        assert result is not None
    finally:
        conn.close()
? 注意:header 参数接受字符串列表,每项为 "Key: Value" 格式;Authorization 头值必须严格为 Bearer (注意大小写与空格)。

?️ 服务端补充建议(Go)

确保你的 Go WebSocket 服务在 Upgrade 前对原始 HTTP 请求进行 token 验证。例如(使用 gorilla/websocket):

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        // 在 Upgrade 前验证 token
        token, err := jwt.ParseFromRequest(r, func(token *jwt.Token) (interface{}, error) {
            return []byte("your-secret-key"), nil // 实际应使用公钥或安全密钥管理
        })
        if err != nil || !token.Valid {
            return false
        }
        // 可选:将用户信息存入 context 或 session
        return true
    },
}

若需更灵活的 token 提取(如支持查询参数),可自行封装解析逻辑,但不推荐——因查询参数易被日志、代理、CDN 缓存泄露,存在安全风险;Header 是标准、安全且符合 JWT 最佳实践的方式。

✅ 总结

  • ❌ 错误:ws://host/path?access_token=xxx → ParseFromRequest 忽略 URL 查询。
  • ✅ 正确:create_connection(url, header=["Authorization: Bearer xxx"]) → Header 被 ParseFromRequest 优先识别。
  • ? 安全提示:永远避免在 URL 中传递敏感凭证;JWT 应始终通过 Authorization 头传输。
  • ? 调试技巧:在 Go 服务端打印 req.Header 和 req.URL.Query(),确认 token 实际到达位置。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6082

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

799

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1057

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1212

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

617

2023.11.24

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号