JWT 认证是基于 Token 的鉴权机制,不依赖服务端保留客户端的认证信息或者会话信息,客户端在密码字段或单独字段中提交 JWT,MQTT 将验证 JWT 的签名和声明信息,验证通过后服务端接受客户端连接请求。
什么是 JWT?
整体的认证原理如下图所示:应用程序从身份识别和访问管理服务(IAM)获取 JWT,客户端在连接请求中携带 JWT,MQTT 服务端将使用预先配置的签名方式(下图的示例为公钥证书集的方式,也可以使用其他签名方式)对收到的 JWT 进行验证,如果内容一致,说明在传输过程中 Token 没有被篡改,认证成功;反之认证失败。

前提条件
用户需要自行实现 JWT 服务用于给客户端分发 JWT Token,并且对应的签名算法要和下文在 控制台配置 的内容一致,您可以使用 JWT 官方提供的 JWT 调试器调试。您也可以使用自有的 JWKS(Json Web Key Set)服务器进行认证,请保证 JWKS 服务器可用并可以通过腾讯云 TDMQ MQTT 的服务端访问。
注意:
1. JWT 的 Payload 部分请勿携带敏感信息。
2. JWT 本身包含认证信息,一旦泄露,JWT 持有者将获得该令牌的所有权限。为了减少风险,JWT 有效期不宜过长。
3. 为了安全考量,JWT 应按业务场景分别授予;传输链路应该安全,尽量避免使用明文公网传输。
认证原理
腾讯云消息队列 MQTT 版支持客户对接外部 JWT 服务进行认证和授权。客户端使用用户名(Username)或密码(Password)字段携带 JWT token,在发起连接(发送 CONNECT Packet)时,MQTT 服务端完成签名验证与标准声明字段的校验后,会进一步识别 Payload 中 key 为 acl 的声明信息,并按照一定的字段格式进行授权。通过 JWT 携带的 ACL 授权策略将被缓存到 MQTT 服务端,按照 授权链 顺序执行,再次触发时更新。当 JWT 通过签名验证和 Claims 检查后, MQTT 服务端接受客户端连接请求。
声明字段说明
说明 | |
iss | 签发者(Issuer) |
sub | 客户端标识(Subject) |
aud | 受众(Audience) |
iat | 签发时间(Issued At) |
nbf | 生效时间(Not Before),检查令牌是否已经生效,生效前连接将被拒绝 |
exp | 过期时间(Expiration Time),校验令牌是否已过期。连接建立后服务端会持续监测,一旦令牌过期,将主动断开客户端连接 |
acl | 授权策略,字段与外部 HTTP 认证响应体一致,授权策略将被缓存到 MQTT 服务端,再次触发时更新 |
JWT Payload 示例
{"iss": "your-iam-service","sub": "client-001","aud": "mqtt-cluster-xxxxx","iat": 1654251000,"nbf": 1654251000,"exp": 1654254601,"acl": [{"effect": "allow","topic": "test-topic0","action": ["connect", "publish", "subscribe"],"qos": [0, 1, 2],"retain": true},{"effect": "deny","topic": "test-topic1","action": ["connect", "publish", "subscribe"],"qos": [0, 1, 2],"retain": false}]}
配置 JWT 认证
1. 登录 MQTT 控制台。
2. 在左侧导航栏单击资源管理 > 集群管理,选择好地域后,单击要配置证书的集群的“ID”,进入集群基本信息页面。
3. 单击认证管理,切换至 JWT 认证和授权。单击开启认证。

4. 在弹窗内完成 JWT 认证和授权的相关配置,认证方式支持 JWT 和 JWKS 两种。
请根据下面说明完成配置:
认证字段:指定 MQTT 客户端在连接时使用 CONNECT Packet 的 Username 或者 Password 字段携带 JWT Token。
签名方式:JWT Token 的签名算法,当前支持 HMAC-based 和 公钥(public-key)两种方式的各类主要算法。使用公钥时请填写 .pem 文件格式的密钥。
密钥:根据不同签名方式的选择,填写对应的密钥,密钥内容由客户根据加密规范自行定义。
说明:非必填,按需填写,不能超过128个字符。

腾讯云消息队列 MQTT 版也支持客户使用 JWKS(Json Web Key Set)的形式来使用 JWT 进行认证,请根据下面说明完成配置:
认证字段:指定 MQTT 客户端在连接时使用 CONNECT Packet 的 Username 或者 Password 字段携带 JWT Token。
认证信息来源:支持 服务器认证和 JSON 认证两种方式。
服务器认证:MQTT 服务端将动态从您指定的 JWKS 端点获取公钥集合并自动刷新。
当您的 IAM 提供的 JWKS 端点公网可以访问时,请选择服务器认证。
服务器地址:填写 IAM 服务提供的 JWKS 端点的基础域名即可,例如端点为
https://{IAM域名}/.well-known/jwks.json,则此处只需填写 https://{IAM 域名}(不需要包含 /.well-known/jwks.json 部分)系统会自动拼接标准 OIDC 路径。请参见您的 IAM 服务提供方文档,如 Auth0等,按其要求获取符合 OIDC 规范 的 JWKS 地址。刷新时间:MQTT 服务端从 IAM 服务拉取公钥集合的间隔。默认值为 60s。

JSON 认证:当 IAM 提供方的 JWKS 端点服务与 MQTT 服务端之间网络不通时,可选择 JSON 认证。您需要手动维护固定的公钥集合,MQTT 服务端将根据请求选用公钥集中的相应公钥进行验签,并校验 JWT 中的
exp(过期时间)、nbf(生效时间)、iat(签发时间)等声明字段的有效性。操作步骤:
从您的 IAM 提供方获取 JWKS 公钥内容(通常可通过浏览器访问
https://{IAM 域名}/.well-known/jwks.json 下载)。将获取的 jwks.json 文件内容完整复制到下方文本框中。


5. 填写完成后,单击保存。