SpringSecurity、Spring Social、SpringSession、TX-LCN、Spring Cloud Data Flow、JWT 架构(十)

继续JWT,这次我们来聊聊具体的使用。

JWT提供多种加密的方式,可以对默认信息和自定义信息进行加密,正如上一篇所述,JWT生成的值是字符串,由三部分组成:头、载体、签名。具体的使用步骤是这样的:

第一步:自定义加密的秘钥,这个秘钥是服务端的。一般为26个英文字母的大小写一起的随机组合。

//服务端的秘钥

private static final String SERVER_KEY = "abcdefghijklmnopqrstuvwxyz";

//令牌有效时间

private static final Long TOKEN_TIME = 60 * 60 * 1000L;

//在一个月内可以刷新令牌有效时间

private static final Long TOKEN_MOUTH_FLUSH_TIME = 60 * 60 * 1000L;

第二步:生成一个获取加密秘钥的方法

public static Key getKey() {
        //HS256加密
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        //秘钥
        byte[] apiKey = DatatypeConverter.parseBase64Binary(SERVER_KEY);
        Key key = new SecretKeySpec(apiKey, signatureAlgorithm.getJcaName());
        return key;
    }

第三步:创建一个用户的token令牌

/**
     * 创建用户令牌
     * @param userId
     * @return
     */
    public String createUserToken(String userId) {
        try {
            JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("typ","JWT")
            .claim("iss", "zpark")//发行人
            .claim("sub", "login")//主题
            .claim("userId", userId)//用户编号
            .claim("aud", "localhost:8080")//用户
            .signWith(SignatureAlgorithm.HS256, getKey());
            //获取当前的时间
            Long now = System.currentTimeMillis();
            Long expTime = now + TOKEN_TIME;
            //到期时间
            System.out.println("到期时间:" + new Date(expTime));
            Date date = new Date(expTime);
            jwtBuilder.setExpiration(date).setNotBefore(new Date());
            String userToken =  jwtBuilder.compact();//生成token
            System.out.println(userToken);
            return userToken;
        } catch (Exception e) {
            System.err.println("/JwtObject/createUserToken Exception:" + e.getMessage());
            return null;
        }
    }

第四步:创建一个校验用户userToken的方法

/**
     * 校验用户的token
     * @param userToken
     * @return
     */

public String vaildUserToken(String userToken) {
        String sign = null;
        try {
            System.out.println("被校验的token:" + userToken);
            sign = userToken.split("\\.")[2];//切分字符串
            //获取载荷
            Map<String,Object> jwtClaims = Jwts.parser().setSigningKey(getKey())
                    .parseClaimsJws(userToken).getBody();
            ObjectMapper objectMapper = new ObjectMapper();
            //将载荷转换为字符串 
            //payload={"iss":"zpark","sub":"login","userId":"12345","aud":"localhost:8080","exp":1564631139,"nbf":1564627550}
            String payload = objectMapper.writeValueAsString(jwtClaims);
            //重新生成签名
            JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
                .setPayload(payload).signWith(SignatureAlgorithm.HS256, getKey());
            //获得新的签名
            String newSign = builder.compact().split("\\.")[2];
            System.out.println("新的签名:" + newSign);
            return newSign;
        }catch (ExpiredJwtException e) {
            System.out.println(e);
            //当捕获到ExpiredJwtException异常时说明用户的userToken已经过期。
            //如果用户的userToken过期,要返回null,并跳转到登录界面让用户重新输入密码
            //和用户名重新登录,并生成新的userToken。
            return null;
        }catch (Exception e) {
            System.out.println(e);
            return null;
        }
    }

pom.xml

<dependencies>
          <!-- JWT -->
          <dependency>
              <groupId>com.auth0</groupId>
              <artifactId>java-jwt</artifactId>
              <version>3.3.0</version>
          </dependency>
          <dependency>
              <groupId>io.jsonwebtoken</groupId>
              <artifactId>jjwt</artifactId>
              <version>0.6.0</version>
          </dependency>
          <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>
  </dependencies>

好了以上就是我们的单机测试代码。用于生成userToken和校验用户的token。接下来,我们将生成的userToken返回前端,然后前端拿着生成的userToken进行登录这里需要用到用户的还有mysql数据库。然后进行一些列的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值