作用:
主要进行用来进行身份验证和数据交换用的,而且目前主要就是通过使用JWT来抵御CSRF攻击
JWT(json web token)json格式的web项目令牌,主要就是用于身份验证。
JWT主要由三部分构成:
•header 头部
主要是用来指定两部分的内容
•声明类型: jwt
•加密算法 既支持对称加密也支持非对称
•payload 荷载
•iss 签发人
•exp 过期时间
•sub 主题
•aud 受众
JWT样子:
header:
{‘type’:’JWT’,’alg’:’sha256’} 假设通过sha256 将明文加密成
jfwajgjwagf7t872qejkkjrdha7w
payload:
{‘sub’:’party’,’name’:’zhangsan’,’admin’:’true’…}经过指定的加密之后形成
实际应用:
经常可以通过JWT实现认证(单点登录)
token认证的流程:
•提交账号、密码到服务器进行认证
•认证通过之后在后台生成JWT,然后将JWT返回给浏览器
•浏览器将JWT保存,之后的请求可以根据具体情况决定是否在请求时将JWT带到服务器,带的方式是讲JWT放在请求头中
•在后台通过请求头得到JWT,从JWT中获取到用户信息
•再将处理的结果反馈给浏览器
JWT案例实现步骤
新建maven项目,在pom.xml中导入JWT依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
## ```JWTUtil工具类,添加生成JWT的静态方法,以及测试用的main方法
```java
package com.woniuxy.commons.utils;
import java.util.Date;
import org.springframework.stereotype.Component;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
@Component
public class JWTUtils {
private static final String SECRET = "abc"; //秘钥 随意
private static final String ISSUSER = "zhangsan"; //签发人
private static final long EXPIRETIME = 30*60*1000; //token的过期时间
//用来创建jwt静态方法
public static String createToken(String uname) {
//指定一个加密算法
Algorithm algorithm = Algorithm.HMAC256(SECRET);//秘钥类似于shiro中的盐值
//当前时间
Date now = new Date();
//过期时间 30分钟 30*60*1000 需要转换成毫秒,在之前时间的基础上增加毫秒
Date expire = new Date(now.getTime()+EXPIRETIME);
//创建jwt
//签发人:避免伪造一种方式
//签发时间:什么时候签发的
//指定token的过期时间:指定token的有效期、有效时间,多长时间之内token是有效的
//保存用户的名字,当前用户
//加密算法,通过加密算法得到token
String jwt = JWT.create()
.withIssuer(ISSUSER)
.withIssuedAt(now)
.withExpiresAt(expire)
.withClaim("uname", uname)
.sign(algorithm);
return jwt;
}
//用于校验jwt是否合法(是否是伪造的)
//此处需要校验以下几个东西,如果都没问题,才能表示JWT不是伪造的
//·加密算法是否与创建JWT时的一致
//·秘钥是否与创建jwt的使用一致
//·签发人要与创建jwt的签发人一致
public static boolean verify(String token){
try {
//签名算法
Algorithm algorithm = Algorithm.HMAC256(SECRET); //算法
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer(ISSUSER)
.build();
verifier.verify(token);
return true;
} catch (Exception ex){
ex.printStackTrace();
}
return false;
}
//从token中获取用户名的方法,主要的目的是后期需要通过用户名得到当前用户的角色、权限 鉴权系统时需要使用的
public static String getUname(String token){
try{
return JWT.decode(token).getClaim("uname").asString();
}catch(Exception ex){
ex.printStackTrace();
}
return "";
}
public static void main(String[] args) {
String token = createToken("lisi");
System.out.println(token);
//校验
System.out.println(verify(token));
//获取用户名
System.out.println(getUname(token));
}
}
以上将JWT的创建,校验,以及main方法的测试都放在一起了!
测试结果如下:
表示JWT校验成功!