<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Jwt on My Blog</title><link>/tags/jwt/</link><description>Recent content in Jwt on My Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 01 Mar 2019 00:00:00 +0000</lastBuildDate><atom:link href="/tags/jwt/index.xml" rel="self" type="application/rss+xml"/><item><title>JWT及JJWT签发与验证token</title><link>/2019/03/01/jwt%E5%8F%8Ajjwt%E7%AD%BE%E5%8F%91%E4%B8%8E%E9%AA%8C%E8%AF%81token/</link><pubDate>Fri, 01 Mar 2019 00:00:00 +0000</pubDate><guid>/2019/03/01/jwt%E5%8F%8Ajjwt%E7%AD%BE%E5%8F%91%E4%B8%8E%E9%AA%8C%E8%AF%81token/</guid><description>&lt;!-- toc --&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h3 id="jwt"&gt;JWT&lt;/h3&gt;
&lt;p&gt;JSON Web Token（JWT）是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。&lt;/p&gt;
&lt;p&gt;一个JWT实际上就是一个字符串，它由三部分组成，头部、载荷与签名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;头部（Header）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;头部用于描述关于该JWT的最基本的信息，例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。&lt;/p&gt;
&lt;p&gt;{&amp;ldquo;typ&amp;rdquo;:&amp;ldquo;JWT&amp;rdquo;,&amp;ldquo;alg&amp;rdquo;:&amp;ldquo;HS256&amp;rdquo;}&lt;/p&gt;
&lt;p&gt;在头部指明了签名算法是HS256算法。 我们进行BASE64编码&lt;a href="https://links.jianshu.com/go?to=http%3A%2F%2Fbase64.xpcha.com%2F"&gt;http://base64.xpcha.com/&lt;/a&gt;，编码后的字符串如下：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;载荷（playload）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品，这些有效信息包含三个部分&lt;/p&gt;
&lt;p&gt;（1）标准中注册的声明（建议但不强制使用）&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间，这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前，该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识，主要用来作为一次性token。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（2）公共的声明&lt;/p&gt;
&lt;p&gt;公共的声明可以添加任何的信息，一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息，因为该部分在客户端可解密.&lt;/p&gt;
&lt;p&gt;（3）私有的声明&lt;/p&gt;
&lt;p&gt;私有声明是提供者和消费者所共同定义的声明，一般不建议存放敏感信息，因为base64是对称解密的，意味着该部分信息可以归类为明文信息。&lt;/p&gt;
&lt;p&gt;这个指的就是自定义的claim。比如前面那个结构举例中的admin和name都属于自定的claim。这些claim跟JWT标准规定的claim区别在于：JWT规定的claim，JWT的接收方在拿到JWT之后，都知道怎么对这些标准的claim进行验证(还不知道是否能够验证)；而private claims不会验证，除非明确告诉接收方要对这些claim进行验证以及规则才行。&lt;/p&gt;
&lt;p&gt;定义一个payload:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{&amp;#34;sub&amp;#34;:&amp;#34;1234567890&amp;#34;,&amp;#34;name&amp;#34;:&amp;#34;John Doe&amp;#34;,&amp;#34;admin&amp;#34;:true}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;然后将其进行base64加密，得到Jwt的第二部分。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;签证（signature）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;jwt的第三部分是一个签证信息，这个签证信息由三部分组成：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;header (base64后的)&lt;/p&gt;
&lt;p&gt;payload (base64后的)&lt;/p&gt;
&lt;p&gt;secret&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串，然后通过header中声明的加密方式进行加盐secret组合加密，然后就构成了jwt的第三部分。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：secret是保存在服务器端的，jwt的签发生成也是在服务器端的，secret就是用来进行jwt的签发和jwt的验证，所以，它就是你服务端的私钥，在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。&lt;/p&gt;
&lt;h3 id="jjwt签发与验证token"&gt;JJWT签发与验证token&lt;/h3&gt;
&lt;p&gt;JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License，版本2.0)，JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面，隐藏了它的大部分复杂性。&lt;/p&gt;
&lt;p&gt;官方文档：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fjwtk%2Fjjwt"&gt;https://github.com/jwtk/jjwt&lt;/a&gt;&lt;/p&gt;
&lt;h4 id="创建token"&gt;创建token&lt;/h4&gt;
&lt;p&gt;（1）新建项目中的pom.xml中添加依赖：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;
&amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt;
&amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;0.9.0&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;（2）创建测试类，代码如下&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;JwtBuilder builder= Jwts.builder()
.setId(&amp;#34;888&amp;#34;) //设置唯一编号
.setSubject(&amp;#34;小白&amp;#34;)//设置主题 可以是JSON数据
.setIssuedAt(new Date())//设置签发日期
.signWith(SignatureAlgorithm.HS256,&amp;#34;hahaha&amp;#34;);//设置签名 使用HS256算法，并设置SecretKey(字符串)
//构建 并返回一个字符串
System.out.println( builder.compact() );
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;运行打印结果：&lt;/p&gt;</description></item></channel></rss>