JWT


JWT简介

JSON WEB Token,通过数字签名的方式,以JSON对象为载体,在不同的服务终端之间安全的传输信息。

JWT的作用

JWT最常见的场景就是授权认证,一旦用户登录,后续的每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后在进行处理。

JWT的组成

JWT由三部分组成,用.拼接

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InRvbSIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NTY3NDA3MTgsImp0aSI6ImY3YjY4NWUyLTA5ZmUtNDhiOC1iNDQ2LTZlOWNhMjYwMWQzMCJ9.jGJzYV22JE9ETOugsZN8Do8N4ZDwUsTkXbBQOQPY7_s
  • Header
    包含token类型和加密算法名称,并进行Base64编码
{
    'typ': 'JWT',
    'alg': 'HS256'
}
  • Payload
    有效载荷,存放有效信息的地方,并进行Base64编码
{
    "sub": '123456',
    "name": 'tom',
    "admin": true
}
  • Signature
    加密信息,加密方式如下代码所示
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');

pom.xml文件引入依赖

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
<!--        jdk1.8以上版本需要引入(不包含1.8)-->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

编写生成JWT数据、解析JWT数据

package com.test.allstart.utils;

import io.jsonwebtoken.*;
import org.junit.Test;

import java.util.Date;
import java.util.UUID;

public class Jwt {

    private long time = 1000*60*60*24;      // 一天的毫秒数
    private String signature = "admin";   // 加密密钥

    /**
    * 生成JWT数据
    */
    @org.junit.Test  // 单元测试注解
    public void jwt(){
        // 创建jwt对象
        JwtBuilder jwtBuilder = Jwts.builder();

        String jwtToken = jwtBuilder
                // header
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                // payload
                .claim("username","tom")
                .claim("role","adminAce")
                .setSubject("admin-test")   // 设置主题
                .setExpiration(new Date(System.currentTimeMillis()+ time))            // 设置有效时间
                .setId(UUID.randomUUID().toString())
                // signature
                .signWith(SignatureAlgorithm.HS256, signature)
                .compact();
        System.out.println(jwtToken);
    }

    /*
    * 解析JWT数据
    */
    @org.junit.Test
    public void jwtParse(){
        String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" +
                ".eyJ1c2VybmFtZSI6InRvbSIsInJvbGUiOiJhZG1pbkFjZSIsInN1YiI6ImFkbWluLXRlc3QiLCJleHAiOjE2NTY3NDExNjQsImp" +
                "0aSI6IjJkODA4MGU4LWJhN2UtNGZiNS04MTViLTM4N2U3Y2MwOTlmYyJ9.6pKISySzxvADAVh-eyHb4jkw3V0Et34jPjQZ-DPi5Nk";
        JwtParser jwtParser = Jwts.parser();
        Jws<Claims> claimsJws = jwtParser.setSigningKey(signature).parseClaimsJws(token);
        Claims claims = claimsJws.getBody();
        System.out.println(claims.get("username"));
        System.out.println(claims.get("role"));
        System.out.println(claims.getId());
        System.out.println(claims.getSubject());
        System.out.println(claims.getExpiration());
    }
}

文章作者: zerollone
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zerollone !
  目录