jwt配置及代码模板

发布时间 2023-09-20 23:41:16作者: 小臣敲键盘

jwt配置及代码模板

jwt工具类的使用

  • 依赖
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.6.0</version>
</dependency>
  • application.properties配置
jwt.config.key=userlogin
jwt.config.failureTime=3600000
  • 代码模板
@Getter
@Setter
@ConfigurationProperties("jwt.config")
public class JwtUtil {
    
//签名私钥
private String key;
//签名失效时间
private Long failureTime;

/**
 * 设置认证token
 *
 * @param id      用户登录ID
 * @param subject 用户登录名
 * @param map     其他私有数据
 * @return
 */
public String createJwt(String id, String subject, Map<String, Object> map) {

    //1、设置失效时间
    long now = System.currentTimeMillis();  //毫秒
    long exp = now + failureTime;

    //2、创建JwtBuilder
    JwtBuilder jwtBuilder = Jwts.builder().setId(id).setSubject(subject)
            .setIssuedAt(new Date())
            //设置签名防止篡改
            .signWith(SignatureAlgorithm.HS256, key);

    //3、根据map设置claims
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        jwtBuilder.claim(entry.getKey(), entry.getValue());
    }
    jwtBuilder.setExpiration(new Date(exp));

    //4、创建token
    String token = jwtBuilder.compact();
    return token;
}

/**
 * 解析token
 *
 * @param token
 * @return
 */
public Claims parseJwt(String token) {
    Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
    return claims;
}

这段代码是一个 JWT(JSON Web Token)工具类,用于创建和解析 JWT,以进行身份验证。

在JWT验证中,有三个重要的组成部分:头部(header)、载荷(payload)和签名(signature)。JWT是一个由这三部分组成的字符串,它使用签名密钥对头部和载荷进行签名,确保其完整性和真实性。

代码中的createJwt方法用于创建JWT。它接收用户ID用户名其他私有数据的映射作为参数。在方法内部,它首先获取当前时间,并计算出失效时间。然后使用Jwts.builder()创建一个JwtBuilder实例。接下来,设置ID、主题和签发时间,使用指定的签名算法(这里是HS256)和密钥对头部和载荷进行签名。最后,使用map中的键值对作为私有数据(claim)添加到JWT的载荷中,并设置失效时间。最终,通过调用compact()方法创建并返回JWT字符串。

parseJwt方法用于解析JWT。它接收JWT字符串作为参数,并使用指定的密钥对JWT进行解析验证签名。然后,它返回解析出的载荷(Claims)对象。

在实际使用中,您需要将密钥和签名失效时间(failureTime)设置为合适的值,并根据自己的业务逻辑调用这些方法来创建和验证JWT。

  • 关于Claims

Claims是JWT Token中存储的声明(Claims)信息的容器,说白了就是可以从中获得token解密后的信息,它提供了一些方法来方便地获取和设置声明的值。以下是一些常用的Claims方法:

1. `getId()`:获取Token的ID声明("jti")的值。
2. `setId(String id)`:设置Token的ID声明("jti")的值。
3. `getSubject()`:获取Token的主题声明("sub")的值。
4. `setSubject(String subject)`:设置Token的主题声明("sub")的值。
5. `getAudience()`:获取Token的接收方声明("aud")的值。
6. `setAudience(String audience)`:设置Token的接收方声明("aud")的值。
7. `getIssuedAt()`:获取Token的签发时间声明("iat")的值,返回的是一个`Date`对象。
8. `setIssuedAt(Date issuedAt)`:设置Token的签发时间声明("iat")的值,传入一个`Date`对象。
9. `getExpiration()`:获取Token的过期时间声明("exp")的值,返回的是一个`Date`对象。
10. `setExpiration(Date expiration)`:设置Token的过期时间声明("exp")的值,传入一个`Date`对象。
11. `put(String key, Object value)`:将自定义的声明键值对放入`Claims`中。
12. `get(String key)`:根据键获取自定义的声明值。

通过这些方法,你可以从Claims中获取标准声明的值(如ID、主题、接收方、签发时间、过期时间等),以及自定义声明。具体使用哪些方法取决于你的业务需求和JWT Token中所包含的声明信息。

开发过程中搭配拦截器实现jwt验证

JWT配合拦截器实例参考下一章:https://www.cnblogs.com/chuimber/p/17718845.html