1.什么是JWT?
json web token,通过数字签名,json为载体,在不同的服务之间安全的传输信息的一种技术,替代了cookie和session,确保数据共享和数据安全
2. JWT组成格式?
由Header(头信息),PayLoad (用户信息),signature三部分组成(签名)
:(具体算法对称不对称加密不作为研究内容)
通常直接使用 HMAC HS256这样的算法
{
"typ":"jwt"
"alg":"HS256" ///加密算法
}
然后做头base64加密(可对称解密)构成第一部分.
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
{
"username":"zhangsan",
"name":"张三",
...
}
对其进行base64加密,得到Jwt第二部分。
eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9
这个签证信息由三部分组成(由加密后的Header,加密后的PayLoad,加密签名由三部分组成)
- header (base64后的)
- payload (base64后的)
- secret
base64加密后的header和base64加密后的payload使用.连接形成的字符串,然后通过header中声明的加密方法加盐加密,然后构成jwt第三部分直接使用"."来进行拼接
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwibmFtZSI6IuW8oOS4iSIsImFnZSI6MTgsInNleCI6IuWlsyIsImV4cCI6MTY0NzE0NTA1MSwianRpIjoiMTIxMjEyMTIxMiJ9.5tmHCpcsS_VuZ2_z5Rydf2OpsviBGwB-fJE5aS7gKqE
3.流程
4. 怎么使用JWT
:注:使用的jdk1.8版本 缺乏高版会报jar包
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
@Test //加密 public void jwt(){ //定义数据 HashMap map = new HashMap(); map.put("userId",String.valueOf(123456)); map.put("phone",String.valueOf(15051369)); long l = System.currentTimeMillis(); //创建Jwt 三部分 JwtBuilder builder = Jwts.builder(); //设置密钥 String token = builder.signWith(SignatureAlgorithm.HS256, "xiaowang") //设置数据 .setClaims(map) //设置故障时间 .setExpiration(new Date(l 10000)) .compact(); System.out.println(token); } @Test //解密 public void parse(){ //获取解密器 ///解密器需要获得我们当地的秘密钥匙 signature将生成的token进行解密,拿到一个Claims //核心是获取payLoad调用用户信息getBody方法获取payLoad Jws<Claims> claimsJws = Jwts.parser().setSigningKey("xiaowang") .parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJwaG9uZSI6IjE1MDUxMzY5IiwiZXhwIjoxNjU4ODIxOTkxLCJ1c2VySWQiOiIxMjM0NTYifQ.yw4h6zfHUW4gdkXvZwQZFvGC94TqT371DF-n-DB_OXw"); //获取数据信息 String userId = (String) claimsJws.getBody().get("userId"); String phone = (String) claimsJws.getBody().get("phone"); System.out.println(userId "====" phone); }