JWT初体验

作用:

主要进行用来进行身份验证和数据交换用的,而且目前主要就是通过使用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校验成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值