Skip to content

启用 JWT 身份验证

JWT 身份验证提供了一个安全的方式来使用 NanoMQ 的 HTTP 服务。

编译

NanoMQ 中 JWT 作为扩展特性,默认不加入编译目标。可通过设置编译选项 -DENABLE_JWT=ON 启用 JWT。具体步骤,可参考源码编辑安装

bash
$ cmake -DENABLE_JWT=ON ..
$ make

生成公私钥

签发 JWT 前需要生成一对公私钥, 并注意根据需要修改公钥文件名 (文件名会被自动设置为 Token 载荷中iss字段的值);

使用 OpenSSL 命令行工具生成 RSA 密钥:

bash
# 生成私钥
$ openssl genrsa -out nanomq.key 2048
# 生成公钥
$ openssl rsa -in nanomq.key -out nanomq.pub -pubout

配置

NanoMQ 的 HTTP 身份验证方式默认使用 Basic 认证,需要在配置文件 nanomq.conf 中修改 auth_typeJWT,并指定 JWT 公钥文件的路径:

启动 NanoMQ

启动 NanoMQ 并指定配置文件

bash
$ nanomq start --conf ./nanomq.conf

如使用 KV 格式配置文件,可通过如下格式启动 NanoMQ

bash
$ nanomq start --conf ./nanomq_old.conf

Token 规则

使用 HTTP 客户端访问 NanoMQ HTTP 服务端前需先生成 Token;

NanoMQ 中所需要的 JWT 结构如下:

bash
header
{
    "alg": "RS256",
    "typ": "JWT"
}

payload
{
    "iss": "nanomq.pub",
    "iat": "1683281256",
    "exp": "1683283256",
    "bodyEncode": "0"
}

头部

  • 令牌类型(typ):使用 JWT
  • 使用的算法(alg):使用 RS256

载荷

  • 签发者(iss):根据需求定义,但要确保与生成的公钥文件名称一致。例如,生成 nanomq.pub 的公钥文件, 则 iss 设置为 "nanomq.pub"
  • 签发时间(iat):签发时间
  • 过期时间(exp):签发过期时间

生成 Token

使用 JWT 官网工具生成。在 Decoded 中填写:

  • Algorithm:RS256
  • Header:头部
  • Payload:载荷
  • Verify Signature:分别填入公私钥 -----BEGIN PUBLIC KEY----------BEGIN RSA PRIVATE KEY-----

访问 NanoMQ HTTP Server

使用 curl 并填入以上生成的 token 访问 NanoMQ HTTP 服务:

bash
$ curl --location 'http://127.0.0.1:8081/api/v4' \
--header 'Authorization: Bearer {TOKEN}'