1、JWT官网:https://jwt.io
用户认证流程:
2、JWT介绍
JSON Web TOKEN(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于在各方之间作为JSON对象安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。JWTS可以使用秘密(使用HMAC算法)或公钥/私钥对使用RSA或ECDSA来签名。
虽然JWTS可以加密,但也提供保密各方之间,我们将重点放在签名令牌。签名的令牌可以验证包含在其中的声明的完整性,而加密的令牌隐藏这些声明以防其他各方。当令牌使用公钥/私钥对签名时,签名也证明只有持有私钥的方才是签名的方。
JWT由3个子字符串组成,分别为Header,Payload以及Signature,结合JWT的格式即:Header.Payload.Signature
。(Claim是描述Json的信息的一个Json,将Claim转码之后生成Payload)。
2.1 头部信息(Header)
头部信息包含 声明的类型 如:jwt 和声明的加密算法 一般使用HMAC SHA256
JWT里验证和签名使用的算法,可选择下面的。
2.2 载荷信息(Claim)
存放我们的有效信息,包括标准信息和自定信息
标准信息如下:
"iss":"Issuer —— 用于说明该JWT是由谁签发的",
"sub":"Subject —— 用于说明该JWT面向的对象",
"aud":"Audience —— 用于说明该JWT发送给的用户",
"exp":"Expiration Time —— 数字类型,说明该JWT过期的时间",
"nbf":"Not Before —— 数字类型,说明在该时间之前JWT不能被接受与处理",
"iat":"Issued At —— 数字类型,说明该JWT何时被签发",
"jti":"JWT ID —— 说明标明JWT的唯一ID",
"user-definde1":"自定义属性举例",
"user-definde2":"自定义属性举例"
自定义数据:
我们可以将一些不是很敏感的数据放入到载荷中 如下面的代码:
String token = JWT.create().withClaim("userId", 123L)
2.3 签名信息
这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方 式进行加盐secret组合加密,然后就构成了jwt的第三部分。
3、JWT整合
3.1 pom.xml
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.8.0</version> </dependency>
3.2 创建token
public static final String SECRET = "WWW.QGSTU.COM"; public static final int EXPIRED_INTERVAL = 10; public static String createToken(Long user_id) { Date iatDate = new Date(); // expire time Calendar nowTime = Calendar.getInstance(); nowTime.add(Calendar.DATE, EXPIRED_INTERVAL); Date expiresDate = nowTime.getTime(); // 头部信息 Map<String, Object> map = new HashMap<String, Object>(); map.put("alg", "HS256"); map.put("typ", "JWT"); String token = JWT.create() // header .withHeader(map) // payload .withIssuer("Mihuu Authorise") .withAudience("APP") .withSubject("subject") // sign time .withIssuedAt(iatDate) // expire time .withExpiresAt(expiresDate) // 自定义 .withClaim("user_id", null == user_id ? null : user_id.toString()) .withClaim("test", "my jwt token") .withClaim("isAdmin", true) // signature .sign(Algorithm.HMAC256(SECRET)); return token; }
3.3 解密token,返回token信息
public static Map<String, Claim> verifyToken(String token) { DecodedJWT jwt = null; try { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET)) .withIssuer("Mihuu Authorise").build(); jwt = verifier.verify(token); } catch (Exception e) { // token 校验失败, 抛出Token验证非法异常 } return jwt.getClaims(); }
3.4 执行事例
public static void main(String[] args) { String token = JWTUtils.createToken(100L); System.out.println("token: " + token); Map<String, Claim> claims = JWTUtils.verifyToken(token2); System.out.println("over..."); }