继续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数据库。然后进行一些列的操作。