发表于: 2020-01-05 11:57:06

1 1065


今日完成了什么:

了解jwt,了解使用JWT实现Token认证

JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

从网上扒了一个JWT工具类

public class JwtUtils {

    /**

     * 签发JWT

     * @param id

     * @param subject 可以是JSON数据 尽可能少

     * @param ttlMillis

     * @return  String

     *

     */

    public static String createJWT(String id, String subject, long ttlMillis) {

        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

        long nowMillis = System.currentTimeMillis();

        Date now = new Date(nowMillis);

        SecretKey secretKey = generalKey();

        JwtBuilder builder = Jwts.builder()

                .setId(id)

                .setSubject(subject)   // 主题

                .setIssuer("user")     // 签发者

                .setIssuedAt(now)      // 签发时间

                .signWith(signatureAlgorithm, secretKey); // 签名算法以及密匙

        if (ttlMillis >= 0) {

            long expMillis = nowMillis + ttlMillis;

            Date expDate = new Date(expMillis);

            builder.setExpiration(expDate); // 过期时间

        }

        return builder.compact();

    }

    /**

     * 验证JWT

     * @param jwtStr

     * @return

     */

    public static CheckResult validateJWT(String jwtStr) {

        CheckResult checkResult = new CheckResult();

        Claims claims = null;

        try {

            claims = parseJWT(jwtStr);

            checkResult.setSuccess(true);

            checkResult.setClaims(claims);

        } catch (ExpiredJwtException e) {

            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_EXPIRE);

            checkResult.setSuccess(false);

        } catch (SignatureException e) {

            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_FAIL);

            checkResult.setSuccess(false);

        } catch (Exception e) {

            checkResult.setErrCode(SystemConstant.JWT_ERRCODE_FAIL);

            checkResult.setSuccess(false);

        }

        return checkResult;

    }

    public static SecretKey generalKey() {

        byte[] encodedKey = Base64.decode(SystemConstant.JWT_SECERT);

        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");

        return key;

    }

    

    /**

     * 

     * 解析JWT字符串

     * @param jwt

     * @return

     * @throws Exception

     */

    public static Claims parseJWT(String jwt) throws Exception {

        SecretKey secretKey = generalKey();

        return Jwts.parser()

            .setSigningKey(secretKey)

            .parseClaimsJws(jwt)

            .getBody();

    }

}

对照关于头部,载荷,签证的详细介绍对jwt的工具类的代码有了一个初步的认识

但是具体的使用还是要多看看网上的例子。

   public ReturnVo login(String username, String password,HttpServletResponse

            response) {

        User user =  userService.findByUsername(username);

        if(user!=null){

            if(user.getPassword().equals(password)){

                //把token返回给客户端-->客户端保存至cookie-->客户端每次请求附带cookie参数

                String JWT = JwtUtils.createJWT("1", username, SystemConstant.JWT_TTL);

                return ReturnVo.ok(JWT);

            }else{

                return ReturnVo.error();

            }

        }else{

            return ReturnVo.error();

        }

    }

遇到的问题:暂无

明天计划的事:任务需要了解的东西凑差不多了解了,要开始实际操作了。

学会了什么:了解了jwt




返回列表 返回列表
评论

    分享到