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. etcd学习(3)-grpc使用etcd做服务发现

    grpc通过etcd实现服务发现 前言 服务注册 服务发现 负载均衡 集中式LB(Proxy Model) 进程内LB(Balancing-aware Client) 独立 LB 进程(Externa ...

  2. Deepin 20.1打造软件开发环境

    支持国产操作系统,替代Windows势在必行,不能让美国卡"脖子"是广大计算机爱好者的共同心愿,下面列举一下Deepin V20.1下如何安装常用软件 ============== ...

  3. Python基础之实现界面和代码分离

    第一步:用QT Designer画一个TreeWidget,存为treeview4.ui,这个处理前面TreeWidget那一节讲过,这里不细讲 treeview4.py # -*- coding: ...

  4. Qt Creator内qmake配置静态编译

    起因 利用QT Creator编写一些纯C/C++应用,默认配置下是动态编译 解决 解决起来很简单,这里只是附上配置备忘;-) msvc: { QMAKE_CFLAGS_RELEASE += /MT ...

  5. 大数据学习(19)—— Flume环境搭建

    系统要求 Java1.8或以上 内存要足够大 硬盘足够大 Agent对源和目的要有读写权限 Flume部署 我这8G内存的电脑之前搭建Hadoop.Hive和HBase已经苟延残喘了,怀疑会卡死,硬着 ...

  6. centos安装ansible

    此次测试总共有三台机,分别如下: ansible服务器:10.0.0.20 client01:10.0.0.21 client02:10.0.0.22 一.安装ansible 方法一. yum ins ...

  7. time_formatter writeup

    攻防世界time_formatter writeup UAF漏洞和命令注入. 前置知识 1.strdup函数 char * __strdup(const char *s) { size_t len = ...

  8. C++ 继承方式 与 普通方式 对比

    1 //C++ 继承 2 //继承是面向对象三大特性之一 3 4 #include <iostream> 5 #include <string> 6 using namespa ...

  9. Salesforce Integration 概览(六) UI Update Based on Data Changes(UI自动更新基于数据变更)

    Salesforce用户界面必须由于Salesforce数据的更改而自动更新.这个场景其实在我所经历的项目中用到的不是特别多,因为客户可能直接点击刷新按钮就直接看到了最新的数据,而不是那种一直不刷新然 ...

  10. Linux 学习Shell一部分指令

    接下来就是shell命令的一些演示了 set (超级多的变量和系统默认值) echo $?查看上一条指令是否执行成功 返回0意味着成功,返回1意味着失败 echo 是个 env 设置变量 解释一下上面 ...