包含hmac-based和public-key emqx启用JWT令牌认证

emqx连接启用jwt令牌认证jwt令牌概述JWT 即 JSON Web Tokens是一种开放的,用于在两方之间安全地表示声明的行业标准的方法(RFC 7519) 。
组成令牌的形式 xxx.yyy.zzz
eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NjU0Nzc4NjEsInVzZXIiOiJtcXR0LWNsaWVudCIsImlhdCI6MTY2NTQ3Njg2MX0.S9ZrrAk2zmUC2zQ7YNcGwhojLOKV5Bhe3zrMv6rQuzE由三部分组成,先后分别为HEADER、PAYLOAD、VERIFY SIGNATURE简单的说,xxx和yyy是对JSON字符串进行base64加密得到,zzz是由“xxx.yyy”加密得到,最后组装成 xxx.yyy.zzz
HEADERHEADER(头部)由 ALGORITHM(算法) 和 TOKEN TYPE(令牌类型) 组成
{  "alg": "HS256",  "typ": "JWT"}xxx由HEADER使用Base64加密得到alg : 表示签名的算法typ : 表示令牌的类型
PAYLOADPAYLOAD(负载)存放一些用户信息,但不能存放敏感信息,因为负载中的信息是公开的yyy由PAYLOAD使用Base64加密得到
VERIFY SIGNATUREVERIFY SIGNATURE(验证签名)zzz由前两部分使用签名加密得到,即对 xxx.yyy 加密,中间连接的“.”是需要的
生成JWT依赖        <dependency>            <groupId>io.jsonwebtoken</groupId>            <artifactId>jjwt</artifactId>            <version>0.6.0</version>        </dependency>代码

api使用方式是生成JwtBuilder对象 然后调用compact()方法,就能得到JWT.JWT主要由三部分组成,那么代码中同理需要对三部分进行构造,使用api时,主要是对PAYLOAD和VERIFY SIGNATURE进行赋值.
        Instant now = Instant.now();        Map<String, Object> claims = new HashMap<>();        claims.put("user", "mqtt-client");        String compact = Jwts.builder()                .setClaims(claims) // 自定义声明                .setIssuedAt(Date.from(now)) // 对标准中的声明赋值,设置签发时间                .setExpiration(Date.from(now.plusSeconds(1000))) // 对标准中的声明赋值,设置过期时间                .signWith(SignatureAlgorithm.HS256, "NmVlR3l2T3BiQnBXMi9veVBlcTZWaEpES09XTzdoWnM=") // 设置签名                .compact();        System.out.println(compact);tips
  1. 值得注意的一点是:不要在 setXxx(标准中的声明) 之后调用 setClaims,因为这两个方法会覆盖所有已设置的声明
  2. PAYLOAD可以分为payload和claims,但是两者既不能都为空也不能都存在,同时只能存在一个,否则将会报错.
    包含hmac-based和public-key emqx启用JWT令牌认证

    文章插图
  3. 可以不手动设置HEADER,api中会自动设置,当然,自己手动设置HEADER属性也可以
  4. HEADER中的alg会随构造的签名自动变更
  5. 关于默认的claims
根据RFC 7519协议标准 我们获取到JWT标准中claims的字段,这些字段是可选的
1. iss :Issuer,颁发者2. sub : Subject,主题3. aud : Audience,受众4. exp :Expiration Time,过期时间5. nbf :Not Before,不能被接受处理的时间6. iat :Issued At,发布时间7. jti :JWT ID这些claims字段可以根据需要去设置,也可以自己定义claimemqx的安装
根据环境自己选择下载
tips
  1. 如果连接不上服务,建议查看8083端口是否打开
  2. 如果dashborad无法打开,建议查看18083端口是否打开
hmac-based方式验证概述emqx中hmac-based方式,表明 JWT 将使用对称密钥生成签名和校验签名(支持 HS256、HS384 和 HS512 算法),上述的JWT令牌使用的是SignatureAlgorithm.HS256,使用该方式验证,上述代码可以直接使用
HS256("HS256", "HMAC using SHA-256", "HMAC", "HmacSHA256", true)

推荐阅读