JWT是指JSON Web Token,一種用于在網絡上安全傳輸信息的開放標準(RFC 7519),定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。JWT由三部分組成,分別是頭部(Header)、載荷(Payload)和簽名(Signature)。通常被用來在用戶和服務器之間傳遞身份信息,以及在不同的系統之間安全地傳遞聲明。JWT通常被用于身份驗證和信息交換,特別是在前后端分離的應用中。
JWT工作示意圖:
JWT由三部分組成,分別是頭部(header)、載荷(payload)和簽名(signature)。
JWT的三部分使用點號(.)連接起來,形成一個完整的JWT令牌。例如:xxxxx.yyyyy.zzzzz
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJaSEFOR1hVTiIsImJvZHkiOnsidXNlclJvbGUiOiJhZG1pbiIsInVzZXJpZCI6IjAwMSJ9LCJleHAiOjE2NjI5NTIxNjIsImlhdCI6MTY2Mjk1MTU1NywianRpIjoiZGZhN2MyZjUtNGNjMC00OWFhLWFiMDUtYzZhY2M4M2YxMDViIn0.xOleM21i7-EI0oOq83Xm-nQVOufajHCupY2QjkpwreQ
JWT通常用于身份驗證和授權,因為它們可以包含用戶的信息,并且可以被驗證和信任。通常用于API認證,因為可以在多個系統之間安全地傳遞信息,而無需使用cookie或session。
<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>4.4.0</version></dependency>
@Slf4j@RestControllerpublic class TokenController { @Autowired private TokenUtil tokenUtil; @PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password){ if(!"admin".equals(username) || !"123".equals(password)){ log.info("賬號或者密碼錯誤!"); } // 模擬從數據庫中獲取的用戶識別信息 String userId = "001"; String userRole = "admin"; Map<String,Object> dataMap = new HashMap<>(); dataMap.put("userId", userId); dataMap.put("userRole", userRole); // 將用戶識別信息存儲到token中 String token = tokenUtil.createToken(dataMap); log.info("生成的token為:{}", token); return token; } @PostMapping("/getUserInfo") public String getUserInfo(@RequestParam String token){ if(ObjectUtils.isEmpty(token)){ log.info("token不能為空!"); return "token不能為空!"; } log.info("收到的token為:{}", token); Map<String, Object> dataMap = tokenUtil.parseToken(token); String userRole = dataMap.get("userRole").toString(); if(!"admin".equals(userRole)){ log.info("非管理員角色,不允許訪問!"); return "非管理員角色,不允許訪問!"; } String userId = dataMap.get("userId").toString(); return "允許登錄,用戶為:" + userId; }}
@Componentpublic class TokenUtil { private static final String DEFAULT_SECRET = "666"; private static final String DEFAULT_DATA_KEY = "body"; private static final String DEFAULT_ISSUER = "REATHIN"; private static final Long DEFAULT_EXPIRE_TIME = 7*24*60*60L; public String createToken(Map<String, Object> dataMap){ return createToken(dataMap, DEFAULT_SECRET); } public String createToken(Map<String, Object> dataMap, String secret){ // 指定使用的加密算法 Algorithm algorithm = Algorithm.HMAC256(secret); return JWT.create() .withClaim(DEFAULT_DATA_KEY, dataMap) .withIssuer(DEFAULT_ISSUER) .withIssuedAt(new Date()) .withExpiresAt(new Date(System.currentTimeMillis() + DEFAULT_EXPIRE_TIME * 1000)) .withJWTId(UUID.randomUUID().toString()) .sign(algorithm); } public Map<String, Object> parseToken(String token){ return parseToken(token, DEFAULT_SECRET); } public Map<String, Object> parseToken(String token, String secret){ // 指定使用的加密算法 Algorithm algorithm = Algorithm.HMAC256(secret); JWTVerifier jwtVerifier = JWT.require(algorithm).build(); DecodedJWT decodedJWT = jwtVerifier.verify(token); return decodedJWT.getClaim(DEFAULT_DATA_KEY).asMap(); }}
優點:
缺點:
本文鏈接:http://www.www897cc.com/showinfo-26-80903-0.htmlJWT在身份驗證與信息交換中的實踐探索
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com