Spring Boot JWT 快速入门
本章节讨论 jwt 在 spring boot 中的应用。意在快速入门 jwt。
- java jdk1.8
- maven 3.2+
- spring boot 2.0+
JSON Web Token(JWT) 他是一个用于 Web 身份验证的令牌。
1 JWT 概述
1.1 什么是JWT
直观的理解 JWT 就是一串字符串,如下(来自于 JWT.IO):
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
细心的你可能会发现字符串是有3个独立的字符串使用.
号组合而成,前两个字符串是 Base64 编码,最后一个字符串是一个加密后的字符串。
序号 | 字符串 |
---|---|
1 | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 |
2 | eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ |
3 | SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c |
JWT 使用以上3个字符串组成一个字符串,以 xxxxx.yyyyyy.zzzzz
的形式传输给认证服务器
xxxxx.yyyyyy.zzzzz
表示为 Header.Payload.Signature
Header=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Payload=eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
Signature=SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
我们使用 JWT Debuger 把信息解码可以看出:
1.1.1 Header
Header 头信息,以 json 字符串实现,并压缩成 Base64URL
编码字符串传输
{"alg": "HS256","typ": "JWT"
}
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
1.1.2 Payload
Payload 负载,以 json 字符串实现,并压缩成 Base64编码字符串传输
{"sub": "1234567890","name": "John Doe","iat": 1516239022
}
官方对 json 内容节点给出了一些建议,我个人觉得意义不大,况且那个建议字段完全是看不出任何含义的缩写。比如 iss、exp、sub、aud、nbf、iat、jti
。当然如果大家都能共同遵守,也不存在这些问题。
iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号
1.1.3 Signature
VERIFY SIGNATURE 签名,在服务端指定一个秘钥,把签名两个 json 字符串使用下面方法加密而成的
HMACSHA256(base64UrlEncode(header) + "." +base64UrlEncode(payload),only-save-in-server-secret)
值得注意的是,使用JWT 推荐使用 HTTPS 加密协议
1.1.4 Base64URL
BASE64URL是一种在BASE64的基础上编码形成新的加密方式,为了编码能在网络中安全顺畅传输,需要对BASE64进行的编码,特别是互联网中。
1.2 JWT 是如何工作的
为了能够支持跨域,通常 JWT 的字符串 xxxxx.yyyyyy.zzzzz
通过 Http 的 Head 发送
Authorization: Bearer <token>
也可以放在 Post 数据体重。
2 Spring Boot JWT 示例
在 JWT 官方可以看到,maven: io.jsonwebtoken / jjwt / 0.9.0
这个库是支持最全的。
2.1 新建 Spring Boot Maven 示例工程项目
- File > New > Project,如下图选择
Spring Initializr
然后点击 【Next】下一步 - 填写
GroupId
(包名)、Artifact
(项目名) 即可。点击 下一步
groupId=com.fishpro
artifactId=jwt - 选择依赖
Spring Web Starter
前面打钩。 - 项目名设置为
spring-boot-study-jwt
.
2.2 依赖引入 Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.fishpro</groupId><artifactId>jwt</artifactId><version>0.0.1-SNAPSHOT</version><name>jwt</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
2.4 编写 JWT 生成与验证代码
本章节知识学习 JWT,不涉及其他知识点,故我们之间在 JwtApplication.java 中来编写代码
package com.fishpro.jwt;import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTCreationException;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.util.*;@SpringBootApplication
public class JwtApplication {public static void main(String[] args) {SpringApplication.run(JwtApplication.class, args);String token=createJWTToken();//获取生成的TokenverifyJWTToken(token);//验证生成的Token}/*** 生成 JWT Token* */private static String createJWTToken() throws JWTCreationException {String secret="secret";//假设服务端秘钥Algorithm algorithm = Algorithm.HMAC256(secret);//jwt 头部信息Map<String,Object> map=new HashMap<>();map.put("alg","HS256");map.put("typ","JWT");Date nowDate = new Date();Date expireDate = AddDate(nowDate,2*60);//120 分钟过期String token= JWT.create().withHeader(map).withIssuer("SERVICE") //对应 paylaod iss 节点:签发人.withClaim("loginName","fishpro").withSubject("this is a token demo")//对应 paylaod sub 节点:主题.withAudience("Client")//对应 paylaod aud 节点:受众.withIssuedAt(nowDate)//对应 paylaod iat 节点:生效时间.withExpiresAt(expireDate) //对应 paylaod exp 签发人 节点:过期时间.sign(algorithm);return token;}/*** 验证 token* */private static void verifyJWTToken(String token) throws JWTVerificationException {Algorithm algorithm=Algorithm.HMAC256("secret");JWTVerifier verifier = JWT.require(algorithm).withIssuer("SERVICE").build();DecodedJWT jwt =verifier.verify(token);String subject=jwt.getSubject();Map<String,Claim> claims=jwt.getClaims();Claim claim = claims.get("loginName");System.out.println("自定义 claim:"+claim.asString());List<String> audience = jwt.getAudience();System.out.println("subject 值:"+subject);System.out.println("audience 值:"+audience.get(0));}/*** 时间加减法* */private static Date AddDate(Date date,Integer minute){if(null==date)date=new Date();Calendar cal=new GregorianCalendar();cal.setTime(date);cal.add(Calendar.MINUTE, minute);return cal.getTime();}}
2.5 演示效果
右键 JwtApplication 选择 Run JwtApplication ,观察 console 窗口
转载于:https://www.cnblogs.com/fishpro/p/spring-boot-study-jwt.html
Spring Boot JWT 快速入门相关推荐
- Spring Boot的快速入门
Spring Boot的快速入门 1.导入第一个maven项目 自动生成maven项目 2.了解maven项目结构 3.启动服务 和普通maven项目结构是一样的,值得注意的是,启动服务的入口是 ![ ...
- Spring Boot【快速入门】
Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Sp ...
- Spring Boot:快速入门教程
什么是Spring Boot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人 ...
- Spring MVC 4快速入门Maven原型已改进
Spring Boot使Spring入门非常容易. 但是仍然有人对不使用Spring Boot并以更经典的方式引导应用程序感兴趣. 几年前,我创建了一个原型(早于Spring Boot),简化了引导S ...
- Spring Boot 热部署入门
转载自 Spring Boot 热部署入门 1. 概述 在日常开发中,我们需要经常修改 Java 代码,手动重启项目,查看修改后的效果.如果在项目小时,重启速度比较快,等待的时间是较短的.但是随着项 ...
- 如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练)
如何:从Spring 4.0快速入门以构建简单的REST-Like API(演练) 关于使用Spring MVC创建Web API的另一篇教程. 不太复杂. 只是一个演练. 生成的应用程序将提供简单的 ...
- 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之二
本篇承接上一篇,关于Session以及JWT Token参考: 前后端分离的用户验证原理及Spring Boot + JWT的框架搭建(附完整的框架代码)之一 框架整体描述 框架使用Spring Bo ...
- Spring Boot 2.x 入门前的准备-IntelliJ IDEA 开发工具的安装与使用
ntelliJ IDEA 开发工具的安装与使用 1 下载 IntelliJ IDEA 2 破解版本安装 2.1 window 下的破解 2018.3.1最新版破解 2.2 window 下的破解 20 ...
- Spring Boot Vue Element入门实战(完结)
最近给朋友做一个大学运动会管理系统,用作教学案例,正好自己也在自学VUE,决定用spring boot vue做一个简单的系统.vue这个前端框架很火,他和传统的Jquery 编程思路完全不一样,Jq ...
最新文章
- 第七周实践项目5 排队看病模拟(队列)
- VC++打开、保存文件对话框和浏览文件夹对话框
- 修改Jtable字体颜色
- Deep Learning 论文笔记 (2): Neural network regularization via robust weight factorization
- 五一黄金周之二:可以吃人的博物馆
- wps合并所有sheet页_WPS里面如何批量打印(WPS2019)
- itlwm驱动_GitHub - sjoye/itlwm: IntelWifi
- python turtle绘制七段数码管日期时间(注释)
- Redis连接的客户端(connected_clients)数过高或者不减的问题解决方案
- Mathematica颜色系,你喜欢哪一个?
- 诹图系列(2): 堆积条形图
- job历史执行记录查询 oracle_oracle job 查询 存储过程
- syn重发_疑难杂症之被丢弃的SYN包
- 产品经理职责技能和所需证书
- 【noi.ac】#283. 唐时月夜
- Java 基础学习之字符串的简单操作和适配器设计模式
- C语言class 1:初识与准备
- 图片如何添加水印文字?如何设置照片水印?
- 说一下数据库有哪些索引类型,有什么优缺点?
- 有一个整数,加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?完全平方数:16=4*4