jwt 双令牌实现 2021-06-09

java-jwt-3.16.0

@Test
    public void testJwt()  {
        System.out.println("1. 用户登录");
        String username = "jiayanchao";
        String password = "asd123456";
        System.out.println("  登录过程,验证用户名和密码,成功继续,失败返回: 用户名或者密码错误");

        //使用HS256生成token,有人使用用户的密码做密钥,不好
        // Payload的内容只经过了 Base64 编码,对客户端来说当于明文存储,所以不要放置敏感信息。
        String secret = "2e74s0=f+(&9ychj2!#+h&of-l0sk)%%2u9ty(#a(9xgn=_nf41";
        String accessToken = JWT.create()
                .withClaim("username", username)  // 声明变量数据
                .withClaim("userId", 11)  // 声明变量数据
                .withExpiresAt(new Date(System.currentTimeMillis() + 30 * 60 * 1000))  // 过期时间 30分钟
                .sign(Algorithm.HMAC256(secret));  /// 签名

        String refreshToken = JWT.create()
                .withClaim("username", username)  // 声明变量数据
                .withClaim("userId", 11)  // 声明变量数据
                .withExpiresAt(new Date(System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000))  // 7天
                .sign(Algorithm.HMAC256(secret));  /// 签名

        System.out.println("2. 用户登录成功返回两个token");
        System.out.println("accessToken: "+accessToken);
        System.out.println("refreshToken: "+refreshToken);


        System.out.println("\n3. 用户个本地保存token");
        System.out.println("\n4. 携带accessToken访问接口");


        // Thread.sleep(2000); //测过期
        //  key += "1"; // 测签名
        //验证过程
        try {
            JWT.require(Algorithm.HMAC256(secret)).build().verify(accessToken);
            System.out.println("\n5. 验证access_token, 如何通过就正常处理返回数据");

        } catch (TokenExpiredException e) {
            logger.error("access_token过期 返回401");
        } catch (SignatureVerificationException e) {
            logger.error("签名被修改 返回401");
        }

        System.out.println("\n6. 验证失败需要客户端掉用/refresh接口,使用refreshToken获取新的accessToken");
        System.out.println("\n7. 验证refreshToken过期就需要重新登录");
    }

你可能感兴趣的:(jwt 双令牌实现 2021-06-09)