00:00
大家好,我是楠哥,今天带大家来学习JWT,首先我们要知道什么是JWTJWT的话,它其实是一个词组的缩写,它的全称呢是Jason web token,简称GWT什么意思呢?它是通过数字签名的方式,以Jason对象为载体呢,在不同的服务终端之间进行安全的数据传输,说白了就是把信息进行安全的封装,然后呢,以Jason的形式进行传递,那么这种方式有什么作用呢?啊,JWT有什么用呢?JWT它最常见的场景就是授权的认证。就是在系统当中啊,一旦用户登录之后,后续的每个请求都会包含JWT的信息,系统在每次处理用户请求之前,都会先去进行GWT的安全校验,如果通过之后呢,再进行后续的处理,这样的话呢,就会比较安全,就相当于我们把系统比作一家公司,那么你登录之后就会给你发一个出入证,你在进入公司的每一个部门,每一个房间的时候,都需要出示这个出入证你才能进去,这样的话呢,安全性就比较高,对吧。
01:09
啊,那么GWT的组成的话,它由三部分组成啊,这三部分呢,是用这个点去拼接的,是这个英文的点去拼接的啊比如说下面就是一个案例,那这个就是一个GW信息,大家可以看到它是由三部分组成的,然后呢,用点去分割的,分割成了三部分,那么这三部分分别什么呢?第一部分就是它的header。Header里边包含两个信息,一个是它的类型,Token的类型,另外一个是它的算法的名称,因为我们要加密的话,一定会涉及到算法啊,所以说这个就是我们的一个header,比如说它的type就是GT,然后它的算法呢,是HSL56这个算法。啊,然后我们会将这个信息呢。呃,进行BASE64的加密,加密之后呢,就构成了我们的第一部分,就这个东西,它就是加密之后的一个header,那么第二部分是什么呢?就是我们的paylo载荷,载荷其实就是存放有效信息的地方,它又分为三个不同的这个,呃,内容分别是。
02:09
标准中注册的这个声明,第二个是公共的声明,第三个是私有的声明,其实就是信息安全的分类,类似于Java的房权修饰符,它就是存储主要的信息的,好,那比如说咱们这个数据呢,就是一个载荷,它里边存了一些信息。然后我们对这个载荷进行BASE64加密之后,就得到JWT第二部分就是这段,这段就是载荷这个加密。那么第三部分什么呢?第三部分就是他的signature签名。签名的话呢,是将呃加密之后的header和paylo,然后用点去拼接,然后再将将这个结果通过header中声明的方式声明的这个呃这个算法进行呃加N加密,然后就构成了JWT整个第三部分,所以说signature它其实也是由三部分组成的,第一部分是加密之后的header,第二部分是加密之后的paylo,第三部分的就是它呃对于前两个信息的再次进行加密啊,这边的话会有一个代码,通过这个代码大家可以明白它是什么意思啊,我们首先呢是把header进行一个BASE64加密,然后再把paylo进行一个加密,再把这两个结果用点拼起来,拼起来之后呢,再对这个结果呢进行一个加盐加密,然后这时候我们用的这个算法,就是我们hide里边声明的这个算法,会得到一个结果,得到结果之后呢,再给它拼接到第三部分,那么这三个。
03:32
就组就组成了我们一个GWT一个信息对吧?好,所以这就是GWT它的一些概念性东西,那么接下来我们就通过实际的代码开发来看这个GWT怎么去用啊。打开我们的工程,那么首先第一步我们需要去引入它的依赖,好,依赖这边已经给声明出来了,好,首先呢,把这WT的依赖加进来,同时的话,我们还需要去加入下面这些东西,这个的话呢,是因为我们是高版本的JDK啊,如果说你是JDK1.8以上的话,就需要加入这些依赖,不然的话会报错,所以说我们把这两部分加上去,如果说你是JDK1.8,那下面的这些依赖你可以不加。
04:17
好了,依赖导入之后,我们现在就可以去写这个测试代码了,比如说呢,我们来写一个加密和解密的一个,呃,方法啊,我们分别来看一下。那么首先我们去写一个加密的方法。叫JWT吧。写一个方法。好,然后给它添加一个注解单元测试,OK。那么在这的话,我们就去呃创建一个GWT对象,GWT对象怎么去创建呢?我们会用到一个g wt builder,用这个对象去创建g wt build,这个的话就是我们引入的依赖等于。
05:03
JWTS。点它是一个静态方法builder,好,这样的话我们就获取到一个builder,这个builder就是用来构建JWT这个对象嘛,对吧。好了,接下来我们创建什么呢?我们刚才说过GWT,它由三部分组成,分别是它的header payload以及signature,那么我们在去创建的时候也是需要这三部分的,OK,那接下来我们来创建这三部分,首先我们来创建一个。它的创新自符串啊,叫GT。它等于什么呢?等于我们GWP。G builder点。Sader。Set head set header就是设置它的头对吧,设置它的头头信息,那头信息的话,我们发现它里边会有各种参数,所以呢,我们这边直接调用它的一个叫set set header PM这个方法啊,直接把这个参数给它加进去。
06:05
比如说我们加一什么呢?加一个我们就按这这边来加吧,加一个TYPTY是ta的意思,就是它的类型。偷看类型我们这边。JWT。好,再比如说再再加一个,再加一个它的这个算法。我这边这样去写吧。啊,这样去写,这样去写的话,因为我们是可以连缀连缀去写的,所以这样去写的话比较清晰啊,这是它的头信息。好,再给它加一个参数,继续点set head。他的。算法,算法的话呢,我们用。HS256OK。好。那这个加完之后的话,接下来再再加什么呢?再加我们的载荷啊paylo。
07:03
先再加载荷,载荷的话呢,我们怎么调呢?我们调这个claim方法啊,Claim的话,我claim方法也是同样的K和V的一个形式,对不对,这个就是你的信息,比如说我们把用户名user name。比如用户名的话,我叫Tom啊,我把Tom加进去,然后再来一个。Li。再加一个它的入吧,它的一个呃,用户信息身份我们叫admi。好,这是载荷。那载荷加完之后,这是我们的数据啊,除了这个数据之外的话,我们还可以加一些,呃,它默认的信息,比如说它的主题对吧,比如说这个GW,它的有效时间,这些东西都可以加进去的啊,有效时间那这个怎么去加呢?它的主题的话,我们比如说加一个主题,就是set subject对吧,这是它主题,主题的话,比如我就叫in test,这个可以自定义的啊,然后我们再来加它的有效时间,有效时间的话呢,调这个方法叫set。
08:13
这个方法,然后我们把时间传进去。比如说我们让它的有效时间呢,呃,是一天,那这个东西怎么算呢?就是要获取当前的系统时间,然后再给它加上24小时的一个时间,这样的话,它的有效期就是一整天,就从我这一课生成开始,它的有效期是啊,一整天对不对,那这个东西怎么去,呃。去怎么去写这个代码呢,我们可以在这呢,先把这个有效期给它定义出来。我在这儿呢,定一个成员变量time对吧,然后这个的话是毫秒啊,那么我们首先要把毫秒换算成秒,换算成秒之后呢,再乘以60是不是变成了分钟对不对,然后再乘以60变成小时,再乘以24是不是就一天对吧?这就我们的时间啊毫秒数,然后这边的话呢,我们获取当前的系统时间。
09:07
第二系统的时间,然后再加一个就OK了啊,这就是24小时对不对,从当前这一算起,24小时好了,然后我们还要可以设置它的ID,再ID。下载ID的话,就是这个GW它的一个ID啊,这个ID的话呢。啊,这边我们要,嗯,把它放到一个构造器里边,你有一个data。好,这个ID的话,我们直接用一个UUID吧,UUID点。random.to string OK,好,这样的话呢,我们把paylo就设置好了,Paylo设置好之后呢,接下来我们就设置它的signature签名。Signature。这三部分啊,每一部分都要加进去。哦。那这个签名怎么去设置呢?其实只需要去添加一个呃,它的算法就可以了,然后再加一个这个签名的信息,那么首先我把签名信息呢,在这定义出来,因为我们一会儿要解密的时候呢,我们就需要签名信息呢去进行解密啊,Signature。
10:18
比如说。这边给他定一个字符串,就角的面。好,那这边的话,我们只需要去声去声明一个它的一个算法就OK了,这个算法的话,我们说跟这个had里边这个算法是对应的啊,所以呢,我们来调这个方法,第2SIGNATURE with。对吧,首先呢,是它的一个signaturem对吧,这个就是它的一个算法signature organm点。HS256这个算法,然后呢,呃,签名的K值就是我们上面定义那个signature那个变量。就是它对不对,OK,这样的话呢,我们就把签名加进去了,签名加进之后的话呢,我们是不是要把这三部分再给它拼起来。
11:05
把它拼起来,这三个拼起来,用点去拼接,它就成了一个GWT的信息了,怎么拼呢?我们来调这个。Compact。Compact这个方法就可以拼起来好,这样的话呢,我们就会得到一个字符串,这就是我们的j wt token的一个信息,把我们的所有的信,把我们所有的数据呢,全部拼进去了,主主要是三部分,一部分是一部分是它的lo的,第三部分是他一签名,OK,这样的话呢,得到得到了一个GWT的数据啊,我们可以直接把这个数据呢给它输出,OK。点输出,好,那么我们来运行看下结果。大家可以看到啊,现在的这个数据呢,就是我们生成的GWT,它由三部分组成,分别是我们的header payload以及signature对吧,三部分组成,所以说现在的话呢,它的这个Tom和din这个信息呢,就已经封装到这个JWT里边了,这就是加密之后的结果,那拿到它之后呢,我们可以对它进行解密。
12:15
把这个东西传到后台,后台对它进行解密,如果说符合我们的呃,数据的一个要求,那么就进行就相当于通过了,通过之后就进行后面的操作,对吧?那接下来我们对它进行解密,就是对上面生成的这个JP的对它进行解密,看一下能不能解开啊。好,我们再来写个方法,Pass。同样添加一个注解test好了。那么首先我们就把这个token呢给它写出来。把这个直接复制过来。OK。对它进行解密啊,怎么解密呢?我们用这个GT这个对象。
13:04
等于。还是用这个GWTS。对,有一个静态方法叫passer passer方法得到这样一个对象,得到这个对象之后呢,我们对它进行解密,G wt passer.set signature k。首先呢,是把它的signure k加进去,就就是签名的时候我们会有一个K嘛,对不对,我们在加密的时候通过这个K去进行签名的,那么解密的时候也是通过这个K进行解密的啊,所以说signature其实就是我们上面定义这个D密啊,这是我们内容这个可以自定义啊,通过它呢进行解密,然后再调它的pass claims j j ws这个方法,它会把所有的信息呢,解解析成很多个claims啊,Claims就相当于是我们的各种数据啊。然后把这个token传进去,就对它进行解析,就通过这个,通过这个签名对这个token的进行解析,解析之后呢,我们会拿到一个呃,这样一个呃,类似集合的一个东西。
14:06
Now claims这样一个呃,类似集合的一个东西啊,然后的话,我们从这个呃对象当中啊,我们调它的get body方法,我们就可以拿到一个claims这样一个数据。它就类似一个集合,然后我们就可以从这里边把这些数据取出来,就相当于我们上面封装这些东西呢,它现在全部放放到这个claims里边了,好,那么我们就可以直接从里边取东西了啊s.get我们都是通过get方法去取的啊,Get传入它的K值,比如说我现在要把之前的username取出来,对吧,那直接传去。好,我们直接输出对吧,比如说我还可以去把之前的我们的这个载荷,载荷里面的信息都取出来,比如说还有它的弱。它的用户类型。可以拿到对吧,这就是我们的数据,包括它的什么呢?包括它的ID,他的ID我们也可以拿到,这边设置一个ID呢,我们也可以拿到se.get ID啊直接就拿到了。
15:08
还有什么,比如说他的签名也可以拿到,比get subject就拿到他的签名。比如说还有它的这个有效期啊,也可以拿到调这个get。Exp调这个方法就可以拿到我们的日期,它的这个日期呢,就是它的呃,有效期截止到什么时间,对吧?好,那现在就是一个解密的一个方式,那么现在我们来运行这个结果,看一下能不能把我们之前加密之后这个呃,Token的再给它解析成我们之前的数据。直接运行。好,大家可以看到我们已经解密成功了,对吧,他的username就是Tom,然后d me,这个是他的ID,然后这个是我们的签名,这个是它的有效期,到这个时间为止。
16:04
对吧,我们是一天的时间啊,就在在当前这个时间加上24个小时是它的一个有效期,那么我们拿到的就是它有效期的一个,呃,截止的一个时间,OK,所以说这个呢,就是GWT它的一个使用。
我来说两句