emqx启用JWT令牌认证(包含hmac-based和public-key)
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
HEADER
HEADER(头部)由 ALGORITHM(算法) 和 TOKEN TYPE(令牌类型) 组成
{
"alg": "HS256",
"typ": "JWT"
}
xxx由HEADER使用Base64加密得到
alg : 表示签名的算法
typ : 表示令牌的类型
PAYLOAD
PAYLOAD(负载)存放一些用户信息,但不能存放敏感信息,因为负载中的信息是公开的
yyy由PAYLOAD使用Base64加密得到
VERIFY SIGNATURE
VERIFY 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
- 值得注意的一点是:不要在 setXxx(标准中的声明) 之后调用 setClaims,因为这两个方法会覆盖所有已设置的声明
- PAYLOAD可以分为payload和claims,但是两者既不能都为空也不能都存在,同时只能存在一个,否则将会报错.

- 可以不手动设置HEADER,api中会自动设置,当然,自己手动设置HEADER属性也可以
- HEADER中的alg会随构造的签名自动变更
- 关于默认的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字段可以根据需要去设置,也可以自己定义claim
emqx的安装
根据环境自己选择下载
tips
- 如果连接不上服务,建议查看8083端口是否打开
- 如果dashborad无法打开,建议查看18083端口是否打开
hmac-based方式验证
概述
emqx中hmac-based方式,表明 JWT 将使用对称密钥生成签名和校验签名(支持 HS256、HS384 和 HS512 算法),上述的JWT令牌使用的是SignatureAlgorithm.HS256,使用该方式验证,上述代码可以直接使用
HS256("HS256", "HMAC using SHA-256", "HMAC", "HmacSHA256", true)
开启验证
- Secret,用于校验签名的密钥,与生成签名时使用的密钥相同
- Secret Base64 Encode,表明 Secret 是否经过 Base64 加密,即 EMQX 在使用 Secret 校验签名时是否需要先对其进行 Base64 解密

public-key方式验证
概述
emqx中public-key方式,表明 JWT 使用私钥生成签名,需要使用公钥校验签名(支持 RS256、RS384、RS512、ES256、ES384 和 ES512 算法),对于生成的JWT令牌来说,加密方式我这里换成了RSA,即SignatureAlgorithm.RS256
RS256("RS256", "RSASSA-PKCS-v1_5 using SHA-256", "RSA", "SHA256withRSA", true)
其原理是对JWT令牌使用私钥加签,然后将公钥配置在emqx上,连接时用emqx中的公钥验签,防止信息被篡改
开启验证
- Public Key,指定用于校验签名的 PEM 格式的公钥

PEM格式的公钥私钥生成
首先,需要在windows上安装openssl,然后通过指令生成pem格式文件
openssl生成私钥命令: openssl genrsa -out rsa_private_key.pem 1024
openssl生成公钥命令: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem


PEM格式的私钥Java代码中是没办法直接使用的,需要手动或者通过方法变成连续的字符串
MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMGL0LhjNqcK32eTHLrmJovihQjIGYJrqw+GsAwgQxLq2SUZxEkbNNOK8OnR5S8g3PUdHraqWlthiLWLfZB3HjsIhq7if9giln9NkCs8hrbIxaghJTB3zo/L7+Bq2eL3zx5ke9ExceG9Xb7d5RCQ1d/xmzKNZqgC0tOGiiaLrU89AgMBAAECgYBhCNDu8MbgvqG80tOvnF2s+jdKbM/lREex9AvlOHOIU3fkkuOG5333pQwdnh7yHt7IgP36BLRiZibdJf8g46eif+Azf7nmH9fW4tQagdjoVoZGz+9Vp9m2ERRsy7Po50d4C5WQdKbxWiSE6qTWtrqIxpZCGkhPyuWsPaYNTQ2TXQJBAOSM1wFtXD3ivSS+SjgTessQdWHaK/xRvN+glr6JJhzK0Tl6xb8IftFJjBi4RY3e1eAciYVhnTDpQfhKGrRumVMCQQDYyrfldKPxXwWelAVbSAepOrU+Iod0DUKpCRS83dGMQFLI/fmAdNL2AY2drr3w6xdeAWTAagB4sKzWoyEMShMvAkEAr42PSUVbaR3U83hHQjOUSo5l27fduX5/eba8k7Z9U/hmJaSsaER6RQAdYI+KvaLA3diNuap1N7C0P6eMQ7QAiQJBAICYh0shzFnSLsgpL6A88uZsf7Qy0TyC3SbdzyJVRga25SR6mvSa18S7mSCO1fbBzSOjGfuVJWByFKRhMapTilsCQQCaVsZ/2QrlzeHaAfWbMSVi8ml3JlF1nCOyiNtypNJB+HXXrE6SJc3vRnwPIku1N6uduQF2W0ypykCzDdcqGkuF
PEM格式中带有换行符,处理时需要注意,此时连接的字符串就位私钥
代码
package com.mio.mqtt.util;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import sun.misc.BASE64Decoder;
import java.security.KeyFactory;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JWTUtils {
public static void main(String[] args) {
Instant now = Instant.now();
Map<String, Object> claims = new HashMap<>();
claims.put("user", "mqtt-client");
String privateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMGL0LhjNqcK32eTHLrmJovihQjIGYJrqw+GsAwgQxLq2SUZxEkbNNOK8OnR5S8g3PUdHraqWlthiLWLfZB3HjsIhq7if9giln9NkCs8hrbIxaghJTB3zo/L7+Bq2eL3zx5ke9ExceG9Xb7d5RCQ1d/xmzKNZqgC0tOGiiaLrU89AgMBAAECgYBhCNDu8MbgvqG80tOvnF2s+jdKbM/lREex9AvlOHOIU3fkkuOG5333pQwdnh7yHt7IgP36BLRiZibdJf8g46eif+Azf7nmH9fW4tQagdjoVoZGz+9Vp9m2ERRsy7Po50d4C5WQdKbxWiSE6qTWtrqIxpZCGkhPyuWsPaYNTQ2TXQJBAOSM1wFtXD3ivSS+SjgTessQdWHaK/xRvN+glr6JJhzK0Tl6xb8IftFJjBi4RY3e1eAciYVhnTDpQfhKGrRumVMCQQDYyrfldKPxXwWelAVbSAepOrU+Iod0DUKpCRS83dGMQFLI/fmAdNL2AY2drr3w6xdeAWTAagB4sKzWoyEMShMvAkEAr42PSUVbaR3U83hHQjOUSo5l27fduX5/eba8k7Z9U/hmJaSsaER6RQAdYI+KvaLA3diNuap1N7C0P6eMQ7QAiQJBAICYh0shzFnSLsgpL6A88uZsf7Qy0TyC3SbdzyJVRga25SR6mvSa18S7mSCO1fbBzSOjGfuVJWByFKRhMapTilsCQQCaVsZ/2QrlzeHaAfWbMSVi8ml3JlF1nCOyiNtypNJB+HXXrE6SJc3vRnwPIku1N6uduQF2W0ypykCzDdcqGkuF";
try {
// 获取秘钥
BASE64Decoder base64Decoder=new BASE64Decoder();
byte[] bytes = base64Decoder.decodeBuffer(privateKey);
KeySpec spec = new PKCS8EncodedKeySpec(bytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
String compact = Jwts.builder()
.setClaims(claims) // 自定义声明
.setIssuedAt(Date.from(now)) // 对标准中的声明赋值,设置签发时间
.setExpiration(Date.from(now.plusSeconds(1000))) // 对标准中的声明赋值,设置过期时间
.signWith(SignatureAlgorithm.RS256, keyFactory.generatePrivate(spec)) // 设置签名
.compact();
System.out.println(compact);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
emqx启用JWT令牌认证(包含hmac-based和public-key)的更多相关文章
- 什么是JWT令牌认证?
当下,JWT(JSON Web Token)令牌认证已经变得越来越流行.本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别. 为什么需要认证? HTTP是一种无状态协议,那就意味着当前 ...
- OAuth2.0实战!使用JWT令牌认证!
大家好,我是不才陈某~ 这是<Spring Security 进阶>的第3篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...
- 开源干货!!!.NET Core + JWT令牌认证 + Vue.js(iview-admin) 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!
DncZeus 前言 关于 DncZeus DncZeus = Dnc + Zeus "Dnc"--.Net Core 的缩写: "Zeus"--中文译为宙斯, ...
- 微服务架构 | 7.2 构建使用 JWT 令牌存储的 OAuth2 安全认证
目录 前言 1. JWT 令牌存储基础知识 1.1 JSON Web Token 2. 构建使用 JWT 令牌存储的 OAuth2 服务器 2.1 引入 pom.xml 依赖文件 2.2 创建 JWT ...
- Spring Security OAuth2.0认证授权三:使用JWT令牌
Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...
- 阶段5 3.微服务项目【学成在线】_day18 用户授权_03-方法授权-jwt令牌包含权限
修改认证服务的UserDetailServiceImpl类,下边的代码中 permissionList列表中存放了用户的权限, 并且将权限标识按照中间使用逗号分隔的语法组成一个字符串,最终提供给Spr ...
- .net core中使用jwt进行认证
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信任 ...
- JWT令牌简介及demo
一.访问令牌的类型 二.JWT令牌 1.什么是JWT令牌 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌. JWT的使用场景: 一种情况是webapi,类似之 ...
- 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用
什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...
随机推荐
- 从零开始实现lmax-Disruptor队列(六)Disruptor 解决伪共享、消费者优雅停止实现原理解析
MyDisruptor V6版本介绍 在v5版本的MyDisruptor实现DSL风格的API后.按照计划,v6版本的MyDisruptor作为最后一个版本,需要对MyDisruptor进行最终的一些 ...
- Nginx 浏览器缓存配置指令
# 浏览器缓存 # 当浏览器第一次访问服务器资源的时候,服务器返回到浏览器后,浏览器进行缓存 # 缓存的大概内容有: # 1.缓存过期的日期和时间 # 2.设置和缓存相关的配置信息 # 3.请求资源最 ...
- Java学习(一)MarkDown语法
Java学习(一)MarkDown语法 一.标题语法 一级标题 一级标题前添加一个#号 二级标题 二级标题前添加两个#号 三级标题 三级标题前添加三个#号 ... 二.字体 1.粗体 hello wo ...
- CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-E
比赛链接 A 题解 知识点:思维,模拟. 发现 \(b\) 串第一个字符是 \(1\) 则只能使用 max , \(0\) 则只能使用 min ,随后只需要模拟到 \(a\) 串剩余 \(m\) 个字 ...
- JavaScript基础 学习笔记
参考资料 视频链接:https://www.bilibili.com/video/BV1Sy4y1C7ha?spm_id_from=333.999.0.0 菜鸟教程:https://www.runoo ...
- gitpod.io,云端开发调试工具。
gitpod,一款在线开发调试工具,使用它你可以在网页上直接开发软件项目了. 比如你的项目仓库在github上,你可以直接在网址的前面添加gitpod.io/#,然后回车就能在网页上使用vscode打 ...
- my2sql工具之快速入门
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. my2sql工具之快速入门 1.什么是my2sql ...
- 一文理解Hadoop分布式存储和计算框架入门基础
@ 目录 概述 定义 发展历史 发行版本 优势 生态项目 架构 组成模块 HDFS架构 YARN架构 部署 部署规划 前置条件 部署步骤 下载文件(三台都执行) 创建目录(三台都执行) 配置环境变量( ...
- 275. H 指数 II--Leetcode_二分
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/h-index-ii 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 题目的大意是 ...
- HCIA-Datacom 3.2 实验二:生成树基础实验
实验介绍 以太网交换网络中为了进行链路备份,提高网络可靠性,通常会使用冗余链路.但是使用冗余链路会在交换网络上产生环路,引发广播风暴以及MAC地址表不稳定等故障现象,从而导致用户通信质量较差,甚至通信 ...