由于现在前端框架越来越流行,前后端分离渐渐也成了大多数公司的选择,那么此时对于用户的身份认证就显得尤为重要,下面来介绍JWT(JsonWEBtokens)生成token,解密加密的过程,服务端生成token之后,客户端每次请求的时候讲token带入在header或者post参数中,服务端做校验
maven依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
TokenUtils
public class TokenUtils {
public static String getJWTString(String tel,Date expires,Key key){
if (tel == null) {
throw new NullPointerException("null username is illegal");
}
if (expires == null) {
throw new NullPointerException("null expires is illegal");
}
if (key == null) {
throw new NullPointerException("null key is illegal");
}
//用签名算法HS256和私钥key生成token
SignatureAlgorithm signatureAlgorithm =SignatureAlgorithm.HS256;
String jwtString = Jwts.builder()
.setIssuer("Jersey-Security-Basic")//设置发行人
.setSubject(tel)//设置抽象主题
.setAudience("user")//设置角色
.setExpiration(expires)//过期时间
.setIssuedAt(new Date())//设置现在时间
.setId("1")//版本1
.signWith(signatureAlgorithm,key)
.compact();
return jwtString;
}
public static boolean isValid(String token, Key key) {
try {
Jwts.parser().setSigningKey(key).parseClaimsJws(token.trim());
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static String getName(String jwsToken, Key key) {
if (isValid(jwsToken, key)) {
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(key).parseClaimsJws(jwsToken);
return claimsJws.getBody().getSubject();
}
return null;
}
public static void main(String[] args) {
Key key=KeyUtil.getKey();
Calendar c=Calendar.getInstance();
c.add(c.DATE, 10);
String token=getJWTString("李未央", c.getTime(), key);
System.out.println("验签结果"+isValid(token, key));
System.out.println("用户名"+getName(token, key));
}
KeyUtils
public class KeyUtil {
public static Key getKey() {
File file=new File("E:\\key.txt");
try {
if(file.exists()){
Key key =MacProvider.generateKey(SignatureAlgorithm.HS512);
ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(file));
oo.writeObject(key);
oo.close();
return key;
}
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file));
ois.close();
Key key= (Key) ois.readObject();
return key;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally{
}
}
// @Test
// public void test() throws Exception {
// getKey();
// }
}
运行TokenUtils可以看到结果,当客户端收到token时可以将一些参数放在本地,当token过期之后,可以通过一些参数(如subject)去服务器重新获取token,