2022-6月更文挑战12-采用jwt进行权限认证

168 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

采用jwt进行权限认证

前文

jwt是一种常用的用户鉴权的方式。由于分布式微服务的大量出现,cookie与session的认证方式已经存在一定问题。同样的服务集群部署状态下,无法通过session进行信息的存储认证。因此jwt这种无状态认证的方式广泛普及。jwt主要的认证方式是利用客户端请求时生成唯一的token值。后续当需要进行权限认证时,利用该值作为身份认证信息传递到服务器,由各服务从jwt中进行信息的获取以及身份的验证。

jwt认证流程

下面主要简单介绍一下对于jwt的一个应用案例。首先,该方案需要采用公钥及私钥对进行jwt的加密和解密。当请求到达服务器验证身份后,例如通过登陆请求,利用私钥生成一个jwt的token,token中存储用户的身份信息以及该token过期时间等信息,同时将公钥存储到redis当中,并将token存储到redis之中。后续当请求到达各服务时,首先需要通过携带的token进行身份的认证,确保该token有效且未超出过期时间。当身份验证通过后,进行jwt生成token有效期的延长,并更新redis中数据的存储。而需要的信息也可以直接通过公钥进行数据的解析,公钥从redis中获取即可。

下面简单看一些关键的代码:

accessToken = (String) redisUtils.get(userKey);
if(!StringUtils.isEmpty(accessToken) && !JwtUtils.isTokenExpired(accessToken,jwtProperties.getPublicKey())){
    redisUtils.expire(userKey, jwtProperties.getSessionTimeout());
}else{
    Map<String,Object> claims = new HashMap<>();
    claims.put(Constants.CONTEXT_USER_ID,UserUtils.getUserId());
    claims.put(Constants.CONTEXT_USER_NAME,UserUtils.getUsername());
    accessToken = JwtUtils.generateToken(UserUtils.getUsername(),claims,jwtProperties.getPrivateKey(),jwtProperties.getExpire());
    redisUtils.set(userKey,accessToken, jwtProperties.getSessionTimeout());
}
public static String generateToken(String subject, Map<String, Object> claims, PrivateKey privateKey, long expiration) {
    String token = Jwts.builder().claim("claim", claims).setSubject(subject).setId(UUID.randomUUID().toString()).setIssuedAt(new Date()).setExpiration(generateExpirationDate(expiration)).compressWith(CompressionCodecs.DEFLATE).signWith(SIGNATURE_ALGORITHM, privateKey).compact();
    return token;
}

private static Claims getClaimsFromToken(String token, PublicKey publicKey) throws JwtException, IllegalArgumentException {
    Claims claims;
    try {
        claims = (Claims)Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token).getBody();
    } catch (ExpiredJwtException var4) {
        claims = var4.getClaims();
    }

    return claims;
}

通过上面的一些代码,可以看到jwt认证方式的一些关键之处。通过这种方式,即可完成在无状态应用中实现身份认证。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。