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

  1. 值得注意的一点是:不要在 setXxx(标准中的声明) 之后调用 setClaims,因为这两个方法会覆盖所有已设置的声明
  2. PAYLOAD可以分为payload和claims,但是两者既不能都为空也不能都存在,同时只能存在一个,否则将会报错.

  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字段可以根据需要去设置,也可以自己定义claim

emqx的安装

根据环境自己选择下载

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)

开启验证

  • 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)的更多相关文章

  1. 什么是JWT令牌认证?

    当下,JWT(JSON Web Token)令牌认证已经变得越来越流行.本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别. 为什么需要认证? HTTP是一种无状态协议,那就意味着当前 ...

  2. OAuth2.0实战!使用JWT令牌认证!

    大家好,我是不才陈某~ 这是<Spring Security 进阶>的第3篇文章,往期文章如下: 实战!Spring Boot Security+JWT前后端分离架构登录认证! 妹子始终没 ...

  3. 开源干货!!!.NET Core + JWT令牌认证 + Vue.js(iview-admin) 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!

    DncZeus 前言 关于 DncZeus DncZeus = Dnc + Zeus "Dnc"--.Net Core 的缩写: "Zeus"--中文译为宙斯, ...

  4. 微服务架构 | 7.2 构建使用 JWT 令牌存储的 OAuth2 安全认证

    目录 前言 1. JWT 令牌存储基础知识 1.1 JSON Web Token 2. 构建使用 JWT 令牌存储的 OAuth2 服务器 2.1 引入 pom.xml 依赖文件 2.2 创建 JWT ...

  5. Spring Security OAuth2.0认证授权三:使用JWT令牌

    Spring Security OAuth2.0系列文章: Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二: ...

  6. 阶段5 3.微服务项目【学成在线】_day18 用户授权_03-方法授权-jwt令牌包含权限

    修改认证服务的UserDetailServiceImpl类,下边的代码中 permissionList列表中存放了用户的权限, 并且将权限标识按照中间使用逗号分隔的语法组成一个字符串,最终提供给Spr ...

  7. .net core中使用jwt进行认证

    JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息.由于此信息是经过数字签名的,因此可以被验证和信任 ...

  8. JWT令牌简介及demo

    一.访问令牌的类型 二.JWT令牌 1.什么是JWT令牌 ​ JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌. JWT的使用场景: 一种情况是webapi,类似之 ...

  9. 10分钟简单学习net core集成jwt权限认证,快速接入项目落地使用

    什么是JWT JSON Web Token(JWT)是目前最流行的跨域身份验证.分布式登录.单点登录等解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的 ...

随机推荐

  1. CSS样式快速入门

    CSS样式快速入门 前言 前端基础的博客主要分为HTML.CSS和JavaScript,本类博客主要用于记录博主的学习过程和分享学习经验,由于博主学识浅薄,经验不足,难免会出现错误,欢迎大家提出问题. ...

  2. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

  3. 云原生Devops 的实现方法

    DevOps 是一个持续改善软件产品的过程,它通过极短的发布周期.全面自动化的集成和交付流水线,以及团队间的紧密协作来不断改善产品.DevOps 的目标是缩短将创意变成用户可以使用的产品的时间,并降低 ...

  4. GreatSQL季报(2021.12.26)

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 自从GreatSQL 8.0.25 于 2021.8.26发布以来,针对MGR的 ...

  5. 求教:Knife4jAggregationDesktop访问报错HTTP ERROR 404

    (1)Windows Server 2019下面,java版本:c:\Users\WinUser01\.jdks\corretto-1.8.0_292\bin\java.exe(2)Knife4jAg ...

  6. OC高仿iOS网易云音乐AFNetworking+SDWebImage+MJRefresh+MVC+MVVM

    效果 因为OC版本大部分截图和Swift版本一样,所以就不再另外截图了. 列文章目录 因为目录比较多,每次更新这里比较麻烦,所以推荐点击到主页,然后查看iOS云音乐专栏. 目简介 这是一个使用OC语言 ...

  7. identity4 系列————持久化配置篇[五]

    前言 上面已经介绍了3个例子了,并且介绍了如何去使用identity. 但是在前面的例子中,我们使用的都是在内存中操作,那么正式上线可能需要持久到数据库中. 这里值得说明的是,并不一定一定要持久化到数 ...

  8. laravel框架中验证后在页面提示错误信息

    {{-- 显示错误信息 判断:如果有错误则进行显示,--}} {{-- 通过$errors->any() 获取是否有错误,如果有则返回布尔值true,没有返回布尔值false--}} @if($ ...

  9. flutter系列之:移动端的手势基础GestureDetector

    目录 简介 Pointers和Listener GestureDetector 手势冲突 总结 简介 移动的和PC端有什么不同呢?同样的H5可以运行在APP端,也可以运行在PC端.两者最大的区别就是移 ...

  10. KingbaseES 全局临时表

    Postgresql 支持会话级别的临时表,表的存续期只在创建临时表的会话存活期间,会话退出后,临时表自动删除,表结构及数据也无法跨会话共享.KingbaseES 除了支持PG原生的临时表机制外,还支 ...