一、什么是 JWT?
JSON Web Token(详细参见 RFC 7519)作为一种用于定义网络传输 JSON 对象的标准,经常被运用到基于 Token 的认证解决方案中。
整体的认证原理如下:应用程序从身份识别和访问管理服务(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 服务端接受客户端连接请求。
四、声明字段说明
| 声明 (Claim) | 说明 |
| 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 两种。
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. 填写完成后,单击保存。