JWT详解 springboot集成JWT 案例教程

目录

一、什么是JWT

二、JWT的用途

三、JWT认证流程

四、JWT的优势

五、JWT的数据结构

六、JWT的使用案例


一、什么是JWT

官网解释:

JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以验证和信任,因为它是经过数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对签名。

虽然JWT可以加密,以在各方之间提供保密性,但我们将重点关注签名令牌。签名令牌可以验证其中包含的声明的完整性,而加密令牌则对其他方隐藏这些声明。当令牌使用公钥/私钥对签名时,签名还证明只有持有私钥的一方才是签名方。

个人简述:

简单来说,就是前后端传输时识别用户身份信息的一种JSON格式的标志,相较于传统的redis加session来保存用户信息有很多改善的地方,也是目前主流的身份识别策略。最简单的问题就是Web端支持session的方式存储用户数据,但APP端、小程序端不支持,这样,使用JWT便可完美解决。

传统的策略:基于服务端,分布式架构中弊端尤为突出,还需解决session共享问题

JWT的策略:基于客户端

JWT详解 springboot集成JWT 案例教程_第1张图片

二、JWT的用途

1、授权:

JWT是最常见的解决方法。一旦用户登录,每个后续请求将包含JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是当今广泛JWT的一项功能,因为它开销小,而且可以在不同的域中轻松使用。

2、信息交换:

各方之间安全传输信息的好方法。因为可以对JWT进行签名(例如:使用公钥和私钥对),所以可以确保数据的安全性。此外,由于签名是使用标头和有效负载计算的,因此还可以检测到数据是否被篡改。

三、JWT认证流程

JWT详解 springboot集成JWT 案例教程_第2张图片

四、JWT的优势

JWT详解 springboot集成JWT 案例教程_第3张图片

五、JWT的数据结构

JWT由三部分组成,依次是1、标头(header);2、有效载荷(payload);3、签名(signature)。

因此,token的形式一般为header.payload.signature

JWT详解 springboot集成JWT 案例教程_第4张图片

JWT详解 springboot集成JWT 案例教程_第5张图片

1、标头

JWT详解 springboot集成JWT 案例教程_第6张图片

2、有效载荷

这部分里不要放敏感信息!

JWT详解 springboot集成JWT 案例教程_第7张图片 3、签名

这部分是通过header+payload+你的私钥进行Base64编码生成的签名,外部是无法破解的。

JWT详解 springboot集成JWT 案例教程_第8张图片

六、JWT的使用案例

1、导入依赖

        
            com.auth0
            java-jwt
            3.4.1
        

2、JWT工具类

package com.dragonwu.util;


import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

public class JwtUtils {

    private static final String SIGNATURE="你的密钥";

    /**
     * 生成token header.payload.signature
     */
    public static String getToken(Map map){
        Calendar instance=Calendar.getInstance();
        instance.add(Calendar.DATE,7);//默认7天后过期

        //创建jwt builder
        JWTCreator.Builder builder= JWT.create();

        //payload
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });

        String token=builder.withExpiresAt(instance.getTime())//指定令牌过期时间
                .sign(Algorithm.HMAC256(SIGNATURE));//signature
        return token;
    }

    /**
     * 验证token 合法性
     * @return DecodedJWT 获取token信息 若验证失败会直接抛出异常
     */
    public static DecodedJWT verify(String token){
        DecodedJWT verify=JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
        return verify;
    }

}

3、JWT测试

package com.dragonwu.util;

import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.HashMap;
import java.util.Map;

public class MyTest {

    public static void main(String[] args) {
        Map map=new HashMap<>();
        map.put("username","Jack");
        map.put("password","123456");//这里只是案例,一般密码等明杆信息不要放到token的payload里
        String token=JwtUtils.getToken(map);//生成token
        System.out.println(token);
        DecodedJWT verify=JwtUtils.verify(token);//验证token

        //输出token里的信息
        System.out.println(verify.getClaims());
        System.out.println(verify.getClaim("id").asString());
        System.out.println(verify.getClaim("username").asString());
    }
}

4、运行效果

JWT详解 springboot集成JWT 案例教程_第9张图片

你可能感兴趣的:(springboot,javaWeb,spring,boot,java,后端,微服务,spring,cloud)