参考博文:https://www.jianshu.com/p/576dbf44b2ae
一、介绍
Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
二、JWT样式格式
1 2 3 4 5 6 7 8 9 10
| eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
//第一部分我们称它为头部(header) eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
//第二部分我们称其为载荷(payload, 类似于飞机上承载的物品) yJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
//第三部分是签证(signature) SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
|
三、如何使用JWT
关于JWT在此我就不做过多的介绍,下面直接看,如何通过代码实现JWT
1.导入依赖
1 2 3 4 5
| <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version> </dependency>
|
2.创建Token实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class JWTToken implements AuthenticationToken {
private String token;
public JWTToken(String token) { this.token = token; }
@Override public Object getPrincipal() { return token; }
@Override public Object getCredentials() { return token; } }
|
3.书写工具类(包括加密解密)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| public class JWTUtil { private static final long EXPIRE_TIME = 5 * 60 * 1000;
public static String sign(String username, String secret) { try { Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); Algorithm algorithm = Algorithm.HMAC256(secret); return JWT.create().withClaim("username", username) .withExpiresAt(date) .sign(algorithm); } catch (UnsupportedEncodingException e) { return null; } }
public static String getUsername(String token) { try { DecodedJWT jwt = JWT.decode(token); return jwt.getClaim("username").asString(); } catch (Exception e) { return null; } }
public static boolean verify(String token, String username, String secret) { try { Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier verifier = JWT.require(algorithm) .withClaim("username", username) .build(); DecodedJWT jwt = verifier.verify(token); return true; } catch (TokenExpiredException e) { return false; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return false; } } }
|
总结: JWT只是一个单独的工具,要和其他的框架或者自行实现一些其他功能才能真的将JWT应用在后台开发中,后面我将总结如何使用Shiro + JWT实现一个简单的权限认证功能。