包含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)

推薦閱讀