JWT的基本使用

JWT的基本使用

    • 什么是JWT
    • JWT有什么用
    • JWT的组成
      • 1、Header
      • 2、Payload
      • 3、Signature
    • jwt的使用
      • 引入依赖
      • 方法介绍
      • 使用场景
        • 创建jwt
        • 验证jwt 格式
        • 解析jwt

什么是JWT

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

JWT有什么用

JWT通常用于Web应用程序中的身份验证和授权目的。一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都要先进行JWT安全校验,通过之后再进行处理。

JWT的组成

JWT由Header、Playload、Signature三部分组成,由.拼接。令牌最终的格式像这样: abc.def.xyz。

1、Header

Header-标头。通常由两部分组成:令牌的类型(JWT和所使用的签名算法如HMAC、SHA256或RSA),经过Base64 Url编码后形成JWT的第一部分。
“typ”:“JWT".
“alg”:“HS256"

2、Payload

playload-有效负载。存放用户自定义的信息,通常会把用户信息和令牌到期时间放在这里,同样是一个JSON对象,里面的key和value可随意设置,经过Base64 Url编码后形成JWT的第二部分,由于部分是没有加密的,建议只存放一些非敏感信息。
{
"sub”:"1234567890”
“name”:"john”,
“admin”; true
}

3、Signature

Signature-签名。使用标头的算法和私钥对第一部分和第二部分进行加密,通过Base64 Ur编码后形成]WT的第三部分

var encodeString = bane64UrlEncode(header) + “.” + base64UrlEncode(payload);
var signature = HMACSHA256(encodestring, secret);

jwt的使用

引入依赖

	
      <dependency>
            <groupId>io.jsonwebtokengroupId>
            <artifactId>jjwtartifactId>
            <version>0.9.1version>
        dependency>
	
        <dependency>
            <groupId>javax.activationgroupId>
            <artifactId>activationartifactId>
            <version>1.1.1version>
        dependency>

        <dependency>
            <groupId>com.sun.xml.bindgroupId>
            <artifactId>jaxb-coreartifactId>
            <version>3.0.2version>
        dependency>

        <dependency>
            <groupId>com.sun.xml.bindgroupId>
            <artifactId>jaxb-implartifactId>
            <version>2.1.13version>
        dependency>

        <dependency>
            <groupId>javax.xml.bindgroupId>
            <artifactId>jaxb-apiartifactId>
            <version>2.3.1version>
        dependency>

方法介绍

JwtBuilder JwtBuilder jwtBuilder = Jwts.builder(); //创建对象
setHeaderParam() //设置Header部参数
claim() //设置Payload 部参数
setExpiration() //设置失效时间
signWith() //设置signature部参数
compact() //构建方法

使用场景

创建jwt

	//时间
 private long time = 1000 * 60 * 10;
 
	//盐
 private String salt = "salt";


 //创建一个JwtBuilder对象
        JwtBuilder jwtBuilder = Jwts.builder();
        //用jwtBuilder对象构建token
        String token = jwtBuilder
                //Header
                .setHeaderParam("typ","JWT")
                .setHeaderParam("alg","HS256")
                //Payload
                .claim("username","admin")
                .claim("role","admin")
                .claim("isAdmin","true")
                .setSubject("jwt_test")
                //token过期时间
                .setExpiration(new Date(System.currentTimeMillis() + time))
                //signature
                .signWith(SignatureAlgorithm.HS256,salt)
                .compact();
//eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwiaXNBZG1pbiI6InRydWUiLCJzdWIiOiJqd3RfdGVzdCIsImV4cCI6MTY4OTg1NzY4NX0.acfJftGZCmI28R9JkmwlbHeroR3HS9LIe_dmLUetOCU
        System.out.println(token);
验证jwt 格式

Jwts.parser().isSigned()

  public void checkJwt(){
        boolean signed = Jwts.parser().isSigned(jwtTest());
        System.out.println(signed);
    }
解析jwt

通过解析jwt可以获取之前所设置的参数,前提是要知道salt和token

   public void  condJwt(){
        JwtParser parser = Jwts.parser();
        Jws<Claims> claimsJws = parser.setSigningKey(salt).parseClaimsJws(jwtTest());
        //Header
        JwsHeader header = claimsJws.getHeader();
        System.out.println(header.get("typ")); //JWT
        System.out.println(header.get("alg")); //HS256 
        //Payload
        Claims body = claimsJws.getBody();
        System.out.println(body.get("username"));//admin
        System.out.println(body.get("role"));//admin
        System.out.println(body.get("isAdmin"));//true
        System.out.println(body.getSubject());//jwt_test
    }

你可能感兴趣的:(java)