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三种方式的更多相关文章

  1. 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile

    大家在学习entityframework的时候,都知道那linq写的叫一个爽,再也不用区分不同RDMS的sql版本差异了,但是呢,高效率带来了差灵活性,我们 无法控制sql的生成策略,所以必须不要让自 ...

  2. iOS字体加载三种方式

    静态加载 动态加载 动态下载苹果提供的多种字体 其他 打印出当前所有可用的字体 检查某字体是否已经下载 这是一篇很简短的文章,介绍了 iOS 自定义字体加载的三种方式. 静态加载 这个可以说是最简单最 ...

  3. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  4. 【整理】Linux下中文检索引擎coreseek4安装,以及PHP使用sphinx的三种方式(sphinxapi,sphinx的php扩展,SphinxSe作为mysql存储引擎)

          一,软件准备 coreseek4.1 (包含coreseek测试版和mmseg最新版本,以及测试数据包[内置中文分词与搜索.单字切分.mysql数据源.python数据源.RT实时索引等测 ...

  5. JDBC的批处理操作三种方式 pstmt.addBatch()

    package lavasoft.jdbctest; import lavasoft.common.DBToolkit; import java.sql.Connection; import java ...

  6. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  7. Java设置session超时(失效)的三种方式

    1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...

  8. angularjs 自定义服务的三种方式

    angularjs 中可通过三种($provider,$factory,$service)方式自定义服务,以下是不同的实现形式: // 定义module , module中注入$providevar ...

  9. 【转】Apache 配置虚拟主机三种方式

    Apache 配置虚拟主机三种方式  原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假 ...

随机推荐

  1. Java多线程(下)

    线程同步 当多个线程访问一个对象时,有可能会发生污读,即读取到未及时更新的数据,这个时候就需要线程同步. 线程同步: 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线 ...

  2. Python在ubuntu16.04上环境搭建

    1.anaconda3安装 mkdir anaconda cd anaconda wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linu ...

  3. C++第四十六篇 -- C++将int转换成宽字符串

    int rate = 60; int score = 80 TCHAR Temp[64] = TEXT(""); _stprintf_s(Temp, TEXT("pass ...

  4. (opencv10)膨胀和侵蚀(Dilation与Erosion)

    (opencv10)膨胀和侵蚀(Dilation与Erosion) 图像形态学操作 图像形态学操作-基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学 形态学有四个基本操作:腐蚀, ...

  5. Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

    使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的: var client = DaprClient.CreateInvokeHttpClient(appId: " ...

  6. C++ 1//设计立方体类 //创建立方体的类 //设计属性和行为 //获取立方体的面积和体积 //分别利用(全局函数 和 成员函数)判断俩个立方体是否相等

    1 //设计立方体类 2 //创建立方体的类 3 //设计属性和行为 4 //获取立方体的面积和体积 5 //分别利用(全局函数 和 成员函数)判断俩个立方体是否相等 6 #include <i ...

  7. js继承方式及特征

    1. 原型链继承 (原型链) function Parent() { this.fruits = ['apple', 'orange']; } Parent.prototype.sayHello = ...

  8. wps查找替换使用通配符一个实例

    我现在需要打印一些古诗,很多很多.没有排版. 但发现即使弄个两分栏,还是很不舒服. 于是我就想把古诗之间弄个换行. Ctrl+F  打开查找替换 上框输入  ([0-9])*([0-9])*(.) 下 ...

  9. filter,interceptor,controllerAdvice,aspect,controller执行顺序

    1.filter,这是java的过滤器,和框架无关的,是所有过滤组件中最外层的,从粒度来说是最大的. 配置方式,有直接实现Filter+@component,@Bean+@configuration( ...

  10. Proxifier/ProxyChains+reGeorg组合进行内网代理

    在内网渗透过程中,我们经常使用sockes代理工具,本文主要介绍攻击机为windows和linux情况下得使用方式. Win:proxifier+reGeorg 组合 Linux:proxychain ...