JWT(JSON WEB TOKEN)

1 什么是JWT

      JWT是基于json制作的一个web token的一套规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,它属于一种无状态的数据,它主要有两大使用场景:认证和数据传递。

2 JWT 的内容

        JWT的内容如下:

        eyJhbGciOiJIUzUxMiJ9.eyJwYXNzd29yZCI6IjQ1NiIsImV4cCI6MTY2MDUyOTI0MCwiaWF0IjoxNjYwNTI3NDQwLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0.LbtbH4DRn7W8PAzre1Cflpfg3W9grzPQIs7Z_86q5J9Gm8YiRxvBjZ7gPmils6LBzvmFKmvcgywwHELLPlCQKQ

        由上面的JWT的内容我们根据“.”这个字符把内容隔开看,内容一共分为三段,如下
       eyJhbGciOiJIUzUxMiJ9
       eyJwYXNzd29yZCI6IjQ1NiIsImV4cCI6MTY2MDUyOTI0MCwiaWF0IjoxNjYwNTI3NDQwLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0
       LbtbH4DRn7W8PAzre1Cflpfg3W9grzPQIs7Z_86q5J9Gm8YiRxvBjZ7gPmils6LBzvmFKmvcgywwHELLPlCQKQ
         这三段内容也就是jwt的主要组成部分,看到这三段内容,我们肯定会不由自主的想到,这三段内容到底是什么呢?有什么作用呢?安全起见为什么一定是三段呢?

      2.1 第一段名为Header

        header里面存放的是一个内容包含了算法名称已经类型的json对象,然后以base64处理之后的数据。

      2.2 第二段名为Payload 

        payLoad 里面存放的是user的数据的json对象,然后以base64处理之后的数据。

      2.3 第三段名为 Signature

        signature 里面存放的是前面两个的数据组合起来,然后加上一个加密盐通过第一段设置的加密方式加密起来,然后以base64处理的数据。 

3  JWT的demo

        在 pom.xml导入依赖 如下
                

        JWT的生成token以及token的解析代码如下:

package com.zw.jwtdemo.util;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtUtil {
	
	private String keyScret ="123456";
	private int expiryTime = 30;
	
	public String getToken(Map<String, Object> claims) {
		if(claims == null || claims.size() == 0) {
			return null;
		}
		Date createTime = new Date();
		Calendar calander = Calendar.getInstance();
		calander.setTime(createTime);
		calander.add(Calendar.MINUTE, expiryTime);
		
		return Jwts.builder()
				//payload 
				//设置携带的内容即数据信息。
				.setClaims(claims)
				//设置过期时间
				.setExpiration(calander.getTime())
				//设置创建时间
				.setIssuedAt(createTime)
				//设置加密盐和签名算法
				.signWith(SignatureAlgorithm.HS512, keyScret)
				//数据压缩得到一个字符串
				.compact();
	}
	
	public Map<String,Object> parseToken(String token) {
		
		Claims claims = Jwts.parser()
				//设置加密盐
				.setSigningKey(keyScret)
				//通过压缩的jwt 
				//字符串解析出数据信息
				.parseClaimsJws(token)
				//返回数据信息;
				//返回的内容是一个hashMap
				.getBody();
		return claims;
	}
	
	public static void main(String[] args) {
		
		Map<String, Object> map = new HashMap<String,Object>(); JwtUtil jwtUtil = new
		JwtUtil(); map.put("username", "zhangsan"); map.put("password", "456");
		 
		String token =jwtUtil.getToken(map); System.out.println(token);
		Map<String,Object> map2 = jwtUtil.parseToken(token); Set<String> keys =
		map2.keySet(); for(String key: keys) { System.out.println(key + "=" +
		String.valueOf(map2.get(key))); }
		
		
	}

}



//输出结果
eyJhbGciOiJIUzUxMiJ9.eyJwYXNzd29yZCI6IjQ1NiIsImV4cCI6MTY2MTE1MjkyOCwiaWF0IjoxNjYxMTUxMTI4LCJ1c2VybmFtZSI6InpoYW5nc2FuIn0.BC-M5R9kThhW1H7DF0c5OLczQyV6xSOc6Sj3kS2bU67dpjGUmCcMOyFF9H2x0mK7z6J4zqzsB0Z0uJ48CGtDqw
password=456
exp=1661152928
iat=1661151128
username=zhangsan

      上面的代码段便是JWT的代码段了,代码比较简单生成的JWT也是通过“.”隔开的三段字符串拼接而成。接下来我没还是带着我之前提出的三个问题,分析下源码。

4 JWT的源码分析

        4.1 JWT加密的源码 

                JWT加密的源码主要就是compact方法,我们进入到compact方法看看,这个方法里面到底有啥内容。

@Override
    public St
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的基于 JSON Web TokenJWT)的身份验证案例: 1. 安装所需的库 ``` pip install pyjwt ``` 2. 生成JWT Token ```python import jwt import datetime # 定义过期时间 expire_time = datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 定义payload payload = { 'user_id': '123456', 'username': 'john', 'exp': expire_time } # 生成token jwt_token = jwt.encode(payload, 'secret_key', algorithm='HS256') print(jwt_token) ``` 上述代码中,我们使用了 pyjwt 库来生成 JWT Token。它的 encode() 方法接收三个参数:payload、密钥和算法。payload 是一个字典,包含我们想要在 Token 中存储的信息,例如用户ID、用户名、过期时间等等。密钥是一个字符串,用于加密 Token。算法是指用于加密 Token 的算法,这里我们选择了 HS256。 3. 验证JWT Token ```python import jwt # 定义Token jwt_token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMTIzNDU2IiwidXNlcm5hbWUiOiJqb2huIiwiZXhwIjoxNjMxMzEwMDUzfQ.XsDEjcd7jH8qC-6pZlWjZaFvDz-pT8NvQYrWb8I3-5c' # 验证Token try: decoded_token = jwt.decode(jwt_token, 'secret_key', algorithms=['HS256']) print(decoded_token) except jwt.ExpiredSignatureError: print('Token已过期') except jwt.InvalidTokenError: print('无效的Token') ``` 上述代码中,我们使用了 pyjwt 库的 decode() 方法来验证 Token。它接收三个参数:Token、密钥和算法。如果 Token 有效,则返回包含信息的字典。如果 Token 过期或无效,则会引发 jwt.ExpiredSignatureError 或 jwt.InvalidTokenError 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值