JWT介绍&工具类

发布时间 2023-04-04 17:33:39作者: RollBack2010

是什么

Auth0是一个身份验证(authentication)和授权(authorization)服务,它允许开发者通过使用JWT(JSON Web Token)来实现身份验证和授权。JWT是一种开放标准(open standard),它定义了一种紧凑且自包含的方式来在不同的应用程序之间安全地传递信息。

JWT由三部分组成:头部(header)、载荷(payload)和签名(signature)。头部包含算法和令牌类型,载荷包含有关用户的信息,签名是对头部和载荷进行哈希处理的结果,以确保它们在传输过程中没有被篡改。

优势

  1. 简单:JWT是一种简单的数据格式,易于使用和理解。
  2. 自包含:JWT包含了所有必要的信息,不需要在服务器端存储状态信息。
  3. 安全:JWT的签名可以确保数据的完整性和真实性。
  4. 通用:JWT标准已经被广泛地采用,支持多种编程语言和平台。

应用场景

  1. 身份验证(Authentication):JWT可以用来验证用户的身份,避免在每个请求中都需要发送用户名和密码。
  2. 授权(Authorization):JWT可以包含有关用户角色和权限的信息,从而在应用程序中实现访问控制。
  3. API安全(API Security):JWT可以用于保护API,确保只有授权用户才能访问API。

使用Auth0和JWT实现身份验证和授权

  1. 在Auth0上创建一个应用程序,并配置身份验证和授权选项。
  2. 在应用程序中生成JWT令牌,将用户信息和访问权限作为载荷的一部分。
  3. 在每个API请求中,将JWT令牌作为身份验证标头(Header)发送给服务器。
  4. 服务器验证JWT签名,以确保它是有效的,并检查用户角色和权限来授权访问。

总之,Auth0和JWT提供了一种安全且灵活的身份验证和授权解决方案,可用于各种应用程序和场景。

JWTUtil工具类

package com.rb.jwtdemo.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.Date;
import java.util.Map;

public class JwtUtils {
    private static final String secret="secretStr";//自定义密钥,越复杂安全性越高

    // 生成JWT令牌

    /**
     * 生成JWT令牌
     * @param map payload
     * @param expiresDay 过期时间(天)
     * @return token
     */
    public static String generateJwtToken(Map<String,String> map,int expiresDay) {
        Algorithm algorithm = Algorithm.HMAC256(secret);
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.DATE, expiresDay);//设置过期时间
        Date expiresAt = calendar.getTime();

        JWTCreator.Builder builder = JWT.create();
        map.forEach(builder::withClaim);//设置payload
        builder.withExpiresAt(expiresAt);//设置过期时间
        return builder.sign(algorithm);
    }


    /**
     * 验证JWT令牌
     * @param token
     * @return
     */
    public static boolean validateJwtToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWT.require(algorithm).build().verify(token);
            return true;//token验证通过
        }catch (Exception e) {
            return false;//token验证通过
        }
    }

    /**
     * 解析JWT令牌中的信息
     * @param token
     * @return
     */
    // 解析JWT令牌中的信息
    public static DecodedJWT parseJwtToken(String token) {
        Algorithm algorithm = Algorithm.HMAC256(secret);
        return JWT.require(algorithm).build().verify(token);
    }
}

工具类测试

    @Test
    void create() {
        Map map=new HashMap<>();
        map.put("userNo","123456");
        map.put("userName","张三");
        map.put("userType","1");
        String token = JwtUtils.generateJwtToken(map, 1);
        System.out.println(token);

    }
    @Test
    void decode(){
        String token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyTm8iOiIxMjM0NTYiLCJ1c2VyVHlwZSI6IjEiLCJ1c2VyTmFtZSI6IuW8oOS4iSIsImV4cCI6MTY4MDY4NDY5OH0.9O5oOTYwEZxB6AeAPmcLIabxWIvyB_dVpX3S1IGdTVA";
        if(JwtUtils.validateJwtToken(token)){
            DecodedJWT decodedJWT = JwtUtils.parseJwtToken(token);
            System.out.println(decodedJWT.getClaim("userNo").asString());
            System.out.println(decodedJWT.getClaim("userName").asString());
            System.out.println(decodedJWT.getClaim("userType").asString());
        }else {
            System.out.println("token验证失败");
        }
    }