00:00
大家看这个图啊,这个网址上面呢,这边有一个叫做Co的,就是编码后的。这个就是我们最终生成的j wt ded的就是编码之前的,或者是通过编码了之后又被解码的,这个呢,就是JWT的原始的样子,所以呢,你会发现这个JWT呢是由三部分组成的啊,上面这一部分呢叫header,叫JWT头。而中间这部分呢,叫reload,叫JWT的有效载荷,我们也可以把它认为是存储JWT数据的地方,那同样上面这个地方呢,就存储的是JWT的算法,就是算法和token type和token的类型,我们说现在就只有JWT这一种哈,数据类型,所以呢,这块是算法和类型,这块呢是数据啊好,然后第三部分呢,是veryify signature,我们管它叫签名哈希好签名哈西,这一部分呢,就是它会通过一个指定的算法,然后呢,携带着你看你的头和你的载荷部分,把头部分用什么BASE64URL code。
01:04
算法啊,给它做一个,呃,这个计算字符串的一个生成,实际上这就是一个方法了,好调用这个方法呢,生成一个字符串啊字符串这个header是什么?Header其实就是这个,这个是这是个Jason字符串是吧?把这个Jason字符串呢,通过your face URL扣的方法呢,给它生成另外的一个字符串,然后再加上一个点。啊,然后再加上playload有效载荷部分。把这部分呢的字符串呢,也通过BASE64URL编码呢,生成一个字符串,好半这两部分字符串加起来之后,形成一个大长字符串,然后呢,使用这种h ma sh256啊这种编码方案,后面呢,你给他提供一个secret,就是密钥,因为前面大家应该学过加密是啊加密的话就是你加密的原始被加密的原始字符串,然后密钥,然后呢,这个是加密方案,对吧,最后加完密之后形成了一个什么呀,形成这么一个串。
02:01
这个就是我们的JWT,所以呢,整个JWT呢就三部分,一部分呢是head啊,一部分呢是play load的一部分,一部分呢是signature啊这部分,然后中间呢是用点连起来的,这样用点连起来啊,这个就是我们整个的这WT,这个不注意是这个部分加上。这个部分再加上这个部分,最后形成这个部分啊好,那么当然了,这个具体的计算过程,其实到真正到最终写项目的时候,写程序的时候,不用我们自己去一点点加,不用我们自己去一点点的去调用这些方法啊,去做这个镜片的组装,会有现成的工具帮我们直接生成,只要我们呢,把啊必要的参数提供给他就可以了,它就自动把我们这个以JWT的形式把这些内容呢就组装到一起了,所以呢,这个是一个很典型的得大T,那么上面这个地方呢,呃,像算法这块呢,我们可以有很多种不同的算法,你看如果你用不同的算法的话。
03:02
比如说384这个,你看它下面最终啊,因为最终这个要通过secret去通过这个算法去产生最终的一个啊,这个完成的一个字符串嘛,最终的一个字符串,所以当你算法不一样的时候,它最终形成的这个字符串呢,肯定也是不同的,像RS256这个非对称加密这种哈,它形成的这个字符串就特别长啊好,然后还有一些其他的。啊,就是各种各样不同的,我们现在呢,就先用这个最基本的HS256这个好,那这块呢,就是我们整个的GWT部分,然后接下来呢,我们再来看一下,呃,笔记当中。针对JWT头刚才我已经解释了啊,一个是算法,一个是类型,针对有效载荷,我们再来详细看一下,它这个有效载荷里面呢,这个里面它你只看到了123这三个值对不对,实际上这三个值呢,分为两种情况啊,一种情况呢叫默认的。
04:01
就是JWT本身呢,它有七个默认的字段,这七个默认字段的键呢,都是固定的啊,值呢,你根据实际需要设置,比如说主题是什么啊,比如说我这是一个登录的GWT对吧,我这是一个远程接口调用的GWT啊好,这个是签发者啊,这个是接收方,这是签发时间,这是过期时间啊GWT呢,它像我们的cookie啊,三摄啊都一样,它是有过期时间的,我们可以设置这个是定义在什么时间之前不可用,它不但有过期时间,它还有开始时间,比如说我现在生成的这JWT呢,现在我用不了,明天才能用,那你可以定义一个时间,还有一个唯一身份标识啊好,它这个唯一身份标识呢,主要是用来防止请求重放攻击,好然后接下来呢,我们来看一下,除了上面的这七个默认字段之外呢,我们还可以自定义一些私有的字段,或者是自定义字段,那这些字段呢,它就不像上面要要求这么严格了,必须叫这个名字,那么你可以叫任意的名字,只要你觉得是你。
05:01
要的在程序当中需要的就可以了,好一般情况下,如果我们做登录认证的话呢,我们JWT当中都会存用户名啊,用户角色呀,用户头像啊等等这样的一些信息,但是记住不要存用户密码。银行卡号。银行卡密码,什么支付密码等等这些敏感信息啊,因为JWT本身呢,它虽然是有。这种啊加密算法,但是它的加密算法呢,只针对最后这一部分蓝蓝色的部分负责啊,它只对蓝色的部分加密,然后加密的目的是什么?最后校验的时候呢,校验用同样的加密方案去加密,然后校验后面对不对,如果后面对就证明校验成功对吧?因为secret你肯定不能泄露出去啊,所以用同样的secret用同样的加密方案进行加密之后,如果两方加密一致,就要校验成功啊,发送方和接收方对吧?但是中间这个部分的内容是没有经过加密的,它只是经过一系一系列的编码,然后呢,变成这个样子的,什么编码方案呢?就是这个编码方案叫BASE64URL引扣的编码,这只是编码方案,这个编码方案是有解码方案的,一解码就还原,所以呢,这部分的内容不要写敏感数据啊,所以这个是我们对JWT生成时候的一个基本的要求。
06:20
然后这块也说到了啊,好,然后最后签名哈希这块刚才在那个图当中我们看到了,就是啊,用这个算法加上点对吧,再加上这个算法最后密钥,然后一加上这个一生成又生成氢量卡西了,好然后呢,最后呢,我们看一下这个这WT的一个啊当中需要就是我们需要了解到的一个概念哈,叫BASE64URL啊,就是我们的那个算法吧,这个大家简单了解一下就行了,不用大家自己去实际去写啊,但是调用的时候呢,我们要知道,我们到时候呃,用方法的时候,一定要用BASE64URL算法,而不是BASE64算法有一些工具里面呢,它有对应的算法。
07:03
啊,把我们的字符串生成一个贝斯64URL这个编码串,那么呢,它有base斯64编码,还有base斯64URL编码,那么大家要注意的是,我们要选择后面这个啊,我们要选择这个后面这个,为什么呢?因为呢,我们的JWT呢,它是在网络当中传输的,传输的过程当中呢,有的时候呢,难免会使用这种方式,就是把它追加到URL字符串当中,然后呢,那就意味着这个整个JWT这个部分呢,将作为URL的一个部分在网络当中传输,那如果你这个JWT当中生成的这些字符当中有URL当中的特殊字符,比如说这个符号,这就是URL当中的特殊字符啊,比如说你整个JWT里面有这个符号,有等号,那这个等号啊,还有这个都是URL当中的特殊字符,你不可能把它存到这个JWT串当中,一旦这些符号出现在这个串当中了的话,那整个字符串,整个UL地址就引起歧义了,那怎么办?我们呢,一定要调用什么算法?
08:03
要调用这个算法,而不是这个算法,明白吧,啊好,然后这个算法和这个算法的区别是什么呢?就是。啊嗯,通过这种算法算出来的最终的字符串是没有等号的,然后减号呢,是用加号替换,因为减号在ul当中也是特殊字符,然后呢。这个也是特殊字符,用什么替换,用这个替换啊,就是那个加号也是特殊字符,用什么替换,用减号替换,然后杠也是特殊字符,用用这个下拉线替换,所以贝64UL算法最终产生的一个字符串就有这些特点啊,好,然后这个地方也要注意的就是它是编码,不是加密,所以呢不要放涉密信息,这块是我们UR算法啊当中需要给大家强调的啊,然后呢,用怎么用呢?用一会儿回头我们在项目当中去真正使用的时候,大家可能就对这个有所了解了,我们存的话,我们就把它存到cookie里,Local storage对我们来说有点难度啊,就一般情况下前端可能会用这个,但是我们呢就存到cookie里就可以了,然后呢,我们每一次呢,把这个这个啊,就像刚才咱们看到的那个图一样,我们呢在客户端是吧,向服务器发起请求啊,然后服务器呢,会生成一个JWT,好生成完了之后呢,就。
09:20
呃,把这个返回给我们,你看生成JWT,那然后呢,服务客,呃服务器呢,就把这个JWT返回给客户端,客户端接收到这个JWT之后呢,就将它存在cookie里,所以我们这个客户端里面可能有个小cookie cookie里面存了什么呀,JWT。好,然后接下来呢,每一次客户端在与服务器交互的过程当中呢,都会携带这个对大题,所以呢,我们客户端去访问服务器,诶这个时候呢,它会带着这个对W提取好怎么带呢?怎么带呢?如果它存在库位当中,就是自动发送的,但是呢不跨域,那我们如果是前后端分离的话呢,如果没办法跨域,那肯定是存不出来,就是比如说我前端是呃这个。
10:08
那个八零端口,后端是八一端口,你从前端的八零端口当中携带的cookie发送给后端,后端是接不到的,他没法跨域啊这个cookie,那所以怎么办呢?我们就将它放到我们的head当中。好,放在海当中传过去,然后这个也是我们在后面项目的时候,会具体的告诉大家怎么去放在海当中传,然后呢,嗯。也可以放在请求体当中传,比如说你创建一个post类型的一个接口,然后呢,在请求体当中去传这个啊,我们的JWT都可以啊,就是会有不同的解决方案,那后面呢,我们会用一个特别常用的方法就是它。Either,好,这块呢,就是我们对WT的一个基本的使用方案,那实际上大家看到这儿的时候呢,因为我们没有真正的去编程啊,所以大家对这块呢,可能还是概念会比较模糊,这个我也能理解,所以呢,大家这块如果不理解的话,你就先放一放,后面我们编程编到这的时候,然后咱们回头再来看这段话,你就理解了,明白吧。啊,所以其实这块不难理解,关键是要放在正常正确的一个场景当中去带着你去理解好。
11:22
然后最后呢,我们来说一下JWT的问题。
我来说两句