|
| 1 | +# DSW011-JWT-token |
| 2 | + |
| 3 | +lin-jinwei |
| 4 | + |
| 5 | +注意,未授权不得擅自以盈利方式转载本博客任何文章。 |
| 6 | + |
| 7 | +--- |
| 8 | + |
| 9 | +Code: [../code/](../code/) |
| 10 | + |
| 11 | + |
| 12 | +## JWT Json-Web-Token官网:https://jwt.io/ |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | +## 使用: |
| 17 | + |
| 18 | +### gradel引入依赖 |
| 19 | + |
| 20 | +#### JWT-必需 |
| 21 | + |
| 22 | +```gradle |
| 23 | +implementation group: 'io.jsonwebtoken', name: 'jjwt', version: '0.12.6' |
| 24 | +implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.6' |
| 25 | +runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.6' |
| 26 | +runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.12.6' |
| 27 | +``` |
| 28 | + |
| 29 | +#### JWT-可选 |
| 30 | + |
| 31 | + |
| 32 | +```gradle |
| 33 | +implementation group: 'com.google.code.gson', name: 'gson', version: '2.11.0' |
| 34 | +``` |
| 35 | + |
| 36 | +### 创建配置文件: |
| 37 | +代码:jwt.properties |
| 38 | + |
| 39 | +```bash |
| 40 | +jwt.secret="12345678901234567890123456789012345678901234567890123456789012345678901234567890" |
| 41 | +jwt.iss="ISS_qianfafang" |
| 42 | +jwt.sub="SUBJECT_zhuti" |
| 43 | +#jwt.aud="ADU_jieshoufang" |
| 44 | +#jwt.exp="EXP_chaoshitime" |
| 45 | +#jwt.nbf="NBF_starttime" |
| 46 | +#jwt.iat="IAT_qianfatime" |
| 47 | +#jwt.jti="JTI_onlyID" |
| 48 | +``` |
| 49 | + |
| 50 | + |
| 51 | +### JWT工具类-JWTUtil: |
| 52 | +代码:com/jinwei/{项目根目录}/JWTUtil.java |
| 53 | + |
| 54 | +```java |
| 55 | +package com.jinwei.S8_mongotemplate; |
| 56 | + |
| 57 | +import io.jsonwebtoken.*; |
| 58 | +import lombok.Data; |
| 59 | +import javax.crypto.SecretKey; |
| 60 | +import java.util.Date; |
| 61 | +import java.util.UUID; |
| 62 | +import io.jsonwebtoken.Jwts; |
| 63 | +import io.jsonwebtoken.security.Keys; |
| 64 | +import io.jsonwebtoken.security.SecureDigestAlgorithm; |
| 65 | +import org.springframework.beans.factory.annotation.Value; |
| 66 | +import org.springframework.context.annotation.Configuration; |
| 67 | +import org.springframework.context.annotation.PropertySource; |
| 68 | +import java.time.Instant; |
| 69 | + |
| 70 | +@Data |
| 71 | +@PropertySource(value = { "jwt.properties" }) |
| 72 | +@Configuration |
| 73 | +public class JWTUtil { |
| 74 | + // 设置token访问的过期时间-单位/分种 |
| 75 | + private static final int MINUTE = 60; |
| 76 | + public static final int ACCESS_EXPIRE = 1 * MINUTE; |
| 77 | + |
| 78 | + // 设置秘钥的加密算法 |
| 79 | + private final static SecureDigestAlgorithm<SecretKey, SecretKey> ALGORITHM = Jwts.SIG.HS512; |
| 80 | + // 生成私钥,只能在服务器端保存 |
| 81 | + // 使用Jwts.SIG.HS256 算法需要SECRET至少32位 |
| 82 | + // 使用Jwts.SIG.HS512 算法需要SECRET至少64位 |
| 83 | + // 设置密钥字符串 |
| 84 | + private static String SECRET = "SECRET"; |
| 85 | + |
| 86 | + // 使用加密算法加密密钥字符串 |
| 87 | + public static final SecretKey KEY = Keys.hmacShaKeyFor(SECRET.getBytes()); |
| 88 | + |
| 89 | + // 设置jwt签发者 |
| 90 | + private static String JWT_ISS; |
| 91 | + |
| 92 | + // 设置jwt主题 |
| 93 | + private static String = "SUBJECT"; |
| 94 | + |
| 95 | + /* 常用声明: |
| 96 | + iss: jwt签发者-签发方 |
| 97 | + sub: jwt主题-面向用户 |
| 98 | + aud: jwt接受者-接受方 |
| 99 | + exp: jwt过期时间-过期时间必须要大于签发时间 |
| 100 | + nbf: jwt开始启用时间-定义在什么时间之前-jwt不可用的 |
| 101 | + iat: jwt签发时间-过期时间必须要大于签发时间 |
| 102 | + jti: jwt唯一身份标识-主要用来作为一次性token-回避重放攻击 |
| 103 | + */ |
| 104 | + public static String genJWTToken(String inputStr) { |
| 105 | + // 生成令牌id-UUID.randomUUID()-随机 |
| 106 | + String uuid = UUID.randomUUID().toString(); |
| 107 | + Date exprireDate = Date.from(Instant.now().plusSeconds(ACCESS_EXPIRE)); |
| 108 | + |
| 109 | + return Jwts.builder() |
| 110 | + // 设置头部信息-header |
| 111 | + .header() |
| 112 | + .add("type", "JWT") |
| 113 | + .add("algo", "HS512") |
| 114 | + .and() |
| 115 | + // 设置负载信息-payload |
| 116 | + .claim("username", inputStr) |
| 117 | + // 设置令牌ID |
| 118 | + .id(uuid) |
| 119 | + // 设置过期日期 |
| 120 | + .expiration(exprireDate) |
| 121 | + // 设置签发时间 |
| 122 | + .issuedAt(new Date()) |
| 123 | + // 设置主题 |
| 124 | + .subject(SUBJECT) |
| 125 | + // 设置签发者 |
| 126 | + .issuer(JWT_ISS) |
| 127 | + // 设置签名 |
| 128 | + .signWith(KEY, ALGORITHM) |
| 129 | + .compact(); |
| 130 | + } |
| 131 | + |
| 132 | + // 解析token-claim |
| 133 | + public static Jws<Claims> parseClaim(String token) { |
| 134 | + return Jwts.parser() |
| 135 | + .verifyWith(KEY) // 必须持有相同的KEY才能解析 |
| 136 | + .build() |
| 137 | + .parseSignedClaims(token); |
| 138 | + } |
| 139 | + |
| 140 | + // 解析头部-Header |
| 141 | + public static JwsHeader parseHeader(String token) { |
| 142 | + return parseClaim(token).getHeader(); |
| 143 | + } |
| 144 | + |
| 145 | + // 解析负载-Payload |
| 146 | + public static Claims parsePayload(String token) { |
| 147 | + return parseClaim(token).getPayload(); |
| 148 | + } |
| 149 | + |
| 150 | +} |
| 151 | +``` |
| 152 | + |
| 153 | +## 测试主文件 |
| 154 | + |
| 155 | +```java |
| 156 | +package com.jinwei.S8_mongotemplate; |
| 157 | + |
| 158 | +import com.google.gson.Gson; |
| 159 | +import org.springframework.boot.SpringApplication; |
| 160 | +import org.springframework.boot.autoconfigure.SpringBootApplication; |
| 161 | +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; |
| 162 | + |
| 163 | +import java.util.Date; |
| 164 | + |
| 165 | +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) |
| 166 | +public class S8MongotemplateApplication { |
| 167 | + |
| 168 | + public static void main(String[] args) { |
| 169 | +// SpringApplication.run(S8MongotemplateApplication.class, args); |
| 170 | + |
| 171 | + User user = new User("user2", "123"); |
| 172 | + String subject = new Gson().toJson(user); |
| 173 | + |
| 174 | + JWTUtil jwtUtil = new JWTUtil(); |
| 175 | + String jwtoken = jwtUtil.genJWTToken(subject); |
| 176 | + |
| 177 | + System.out.println("jwtoken = " + jwtoken); |
| 178 | + System.out.println("jwtUtil.parseClaim(jwtoken) = " + jwtUtil.parseClaim(jwtoken)); |
| 179 | + System.out.println("jwtUtil.parsePayload(jwtoken) = " + jwtUtil.parsePayload(jwtoken)); |
| 180 | + |
| 181 | + } |
| 182 | + |
| 183 | +} |
| 184 | +``` |
| 185 | + |
| 186 | + |
| 187 | + |
0 commit comments