JWT入门

什么是JWT

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

JWT有什么用?

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

JWT的组成

JWT由3部分组成,用.拼接:

eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJqdGkiOiIxMTYxMjAxMC1lYTU4LTRmODYtOWNjNS05YmYyOTZmYjUzY2EiLCJzdWIiOiJhZG1pbi1zdWJqZWN0IiwidXNlcm5hbWUiOiJ0b20iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NTkxODc3MTh9.YNwwm6X–5BNkUscrjiD90J-sQe8J1aszQsxZrJE4Jo

这三部分分别是:

  • Header
{
	"type":  "jwt",
	"alg": "HS256"
}
  • Payload
{
	"id": "123456789",
	"subject":  "abc",
	"username": "paul",
	"role": "aaaa",
	"expiration": 100000000000
}
  • Signature
var encodeString = base64UrlEncode(header)  +  "."  + base64UrlEncode(payload);

var  signature = HMACSHA256(encodeString, "secret");

入门代码

pom.xml

<dependencies>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <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>
    </dependencies>
public class Test {
    private long time = 1000 * 60 * 60 * 24;
    private String signature = "admin";

    @org.junit.Test
    public void jwt() {
        JwtBuilder jwtBuilder = Jwts.builder();
        Map headerMap = new HashMap();
        headerMap.put("type", "jwt");
        headerMap.put("alg", "HS256");
        String jwtToken = jwtBuilder
                //header
                .setHeaderParams(headerMap)
                //payload
                .setId(UUID.randomUUID().toString())
                .setSubject("admin-subject")
                .claim("username", "tom")
                .claim("role", "admin")
                .setExpiration(new Date(System.currentTimeMillis() + time))
                //signature
                .signWith(SignatureAlgorithm.HS256, signature)
                .compact();
        System.out.println(jwtToken);
    }

    @org.junit.Test
    public void parse() {
        String token = "eyJ0eXBlIjoiand0IiwiYWxnIjoiSFMyNTYifQ.eyJqdGkiOiIxMTYxMjAxMC1lYTU4LTRmODYtOWNjNS05YmYyOTZmYjUzY2EiLCJzdWIiOiJhZG1pbi1zdWJqZWN0IiwidXNlcm5hbWUiOiJ0b20iLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2NTkxODc3MTh9.YNwwm6X--5BNkUscrjiD90J-sQe8J1aszQsxZrJE4Jo";
        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.getSubject());
        System.out.println(claims.getExpiration());
        System.out.println(claims.getId());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值