jwt三种方式
package library.book.demo.config.loginconfig; import com.alibaba.fastjson.JSON;
import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.DefaultHeader;
import io.jsonwebtoken.impl.DefaultJwtBuilder;
import io.jsonwebtoken.impl.crypto.DefaultJwtSigner;
import io.jsonwebtoken.impl.crypto.JwtSigner;
import io.jsonwebtoken.impl.lang.LegacyServices;
import io.jsonwebtoken.io.Encoder;
import io.jsonwebtoken.io.Encoders;
import io.jsonwebtoken.io.Serializer;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import java.io.IOException;
import java.security.KeyPair;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; /**
* jwt登录
*/
public class JwTLogin { public static void main(String[] args) throws IOException { //0 原始签名
String header0 = "{\"alg\":\"HS256\"}";
String claims0 = "{\"sub\":\"wangbiao\",\"aud\":\"wangbiao\"}"; Encoder<byte[], String> base64UrlEncoder = Encoders.BASE64URL;
String hed =base64UrlEncoder.encode(header0.getBytes("UTF-8")); Map map= (Map) JSON.parse(claims0);
Serializer<Map<String,?>> serializer= LegacyServices.loadFirst(Serializer.class);
byte[] clambyte0= serializer.serialize(map); /**
* payload为空String方法转化字节数组,不然转化JSON序列化,默认payload为null 即上面的序列化
* byte [] claimbyte=claims0.getBytes("UTF-8");
*/ /**
* 默认jwt不需要压缩
* DeflateCompressionCodeWb deflateCompressionCodecss=new DeflateCompressionCodeWb();
* claims压缩字节
* byte[] clambyte1 =deflateCompressionCodecss.doCompress(clambyte0);
*/
//key的另一种创建方式
//Key key = new SecretKeySpec("5aSn55Ge6ZO25LiA57uf5rGf5rmWLOWNg+eni+S4h+S7ow==".getBytes(),
// SignatureAlgorithm.HS512.getJcaName()); //签名key
SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
// 字节在编码
String cla= base64UrlEncoder.encode(clambyte0);
String concatenated= hed+'.'+cla; //签名方式
SignatureAlgorithm algorithm=SignatureAlgorithm.HS256;
JwtSigner defaultJwtBuilder=new DefaultJwtSigner(algorithm,key,base64UrlEncoder);
String base64UrlSignature = defaultJwtBuilder.sign(concatenated);
String sss= concatenated+'.'+base64UrlSignature;
System.out.println(sss);
//验签
System.out.println(Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(sss)); // 1 设置token方式一
// 最简单token 使用默认的属性
KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256);
Date date=new Date();
long sd= date.getTime()+60000;
Date date1=new Date(sd);
String jws = Jwts.builder() // (1)
//header设置方式1 设置参数
.setHeaderParam("ad", "ad")//
.setHeaderParam("ss", "ss")
.setSubject("Joe") // (2)
.setIssuedAt(date)
.setExpiration(date1)
//私匙签名
.signWith(keyPair.getPrivate()) // (3)
.compact();
System.out.println(jws);
System.out.println(Jwts.parserBuilder().setSigningKey(keyPair.getPublic()).build().parseClaimsJws(jws).getBody().getSubject().equals("Joe"));
//公匙验签
System.out.println(Jwts.parserBuilder().setSigningKey(keyPair.getPublic()).build().parseClaimsJws(jws)); // iss: jwt签发者
// sub: jwt所面向的用户
// aud: 接收jwt的一方
// exp: jwt的过期时间,这个过期时间必须要大于签发时间
// nbf: 定义在什么时间之前,该jwt都是不可用的.
// iat: jwt的签发时间
// jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 //2设置token方式二 设置头
Header header = new DefaultHeader();
header.put("alg", "HS256");
// //header设置方式1 设置map
Map<String, Object> claims = new HashMap<>();
claims.put("aud", "wangbiao");
claims.put("sub", "wangbiao");
String jwss = Jwts.builder()
.setHeader((Map<String, Object>) header)
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 5000))
.signWith(key)
.compact();
System.out.println(jwss);
//验签
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(jwss)); //3设置token方式二 设置头 自定义字符串
//签名方式 自定义key字符串
SignatureAlgorithm algorithm0=SignatureAlgorithm.HS256;
String ss1="fdsfsfsdfsfsfdsfsfwewprfeppppppp";
String ssss0 =base64UrlEncoder.encode(ss1.getBytes("UTF-8"));
Header header1 = new DefaultHeader();
header1.put("alg", "HS256");
//header设置方式1 设置map
Map<String, Object> claims1 = new HashMap<>();
claims1.put("aud", "wangbiao");
claims1.put("sub", "wangbiao");
String jwss0 = Jwts.builder()
.setHeader((Map<String, Object>) header1)
.setClaims(claims1)
.signWith(algorithm0,ssss0)
.compact();
System.out.println(jwss0);
//验签
System.out.println(Jwts.parserBuilder().setSigningKey(ssss0).build().parseClaimsJws(jwss0));
}
}
jwt三种方式的更多相关文章
- 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile
大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...
- iOS字体加载三种方式
静态加载 动态加载 动态下载苹果提供的多种字体 其他 打印出当前所有可用的字体 检查某字体是否已经下载 这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式. 静态加载 这个可以说是最简单最 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)
一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...
- JDBC的批处理操作三种方式 pstmt.addBatch()
package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Java设置session超时(失效)的三种方式
1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...
- angularjs 自定义服务的三种方式
angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...
- 【转】Apache 配置虚拟主机三种方式
Apache 配置虚拟主机三种方式 原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假 ...
随机推荐
- Tarjan判断为什么不能把dfn写成low
Tarjan,我相信大多数人是这么写的: void tarjan(int x) { dfn[x]=low[x]=++cnt; st.push(x),vis[x]=1; for(int i=head[x ...
- 第七篇 -- 添加CSV Data Set Config
参考链接:https://blog.csdn.net/vv19910825/article/details/82773220 先来看看我们开启的接口 @RequestMapping(value = & ...
- videojs文档翻译-EventTarget
EventTarget new EventTarget() EventTarget是一个可以与DOM EventTarget具有相同API的类. 它增加了包含冗长功能的缩写功能. 例如:on函数是 ...
- CSRF+XSRF+SSRF简单介绍
CSRF 使用DVWA靶机,选择low级别,然后更改密码 伪造网页连接 http://localhost:8083/DVWA-master/vulnerabilities/csrf/?password ...
- 开发者如何快速搭建自己的电商App?
面向电商购物场景,HMS Core提供了创新的电商解决方案,帮助应用快速获客.提升转化率,实现业务增长.为了帮助开发者了解如何在电商购物类应用中集成HMS Core的各项能力,HMS Core开发了电 ...
- 安卓安装https证书
前置条件 1 手机要设置密码 然后安装charles 证书 2 赋予 adb shell root权限(安装magisk就行) adb shell # 连接手机进入shell模式 su root # ...
- [.NET大牛之路 005] .NET 的执行模型
.NET大牛之路 • 王亮@精致码农 • 2021.07.06 前面我们介绍 .NET 历史时讲过,微软基于 .NET Framework 重新设计并创造了跨平台的 .NET Core,目前已经发展到 ...
- DataGrid列显示隐藏配置
1.列右键事件 private void data1_MouseRightButtonDown(object sender, MouseButtonEventArgs e) { ContextMenu ...
- Java数组02——三种初始化及内存分析
内存分析 三种初始化 例子 package array; public class ArrayDemon02 { public static void main(String[] arg ...
- 为什么大部分的Android开发成为不了架构师
小团队一般 10 人左右,其中常常是技术最牛的人做架构师(或TL).所以,架构师在广大码农中的占比大概平均不到 10%.而架构师也可以分为初级.中级.高级三档,江湖上真正高水平的软件架构师就更少了. ...