JWT令牌创建和解析讲解
JJWT的介紹和使用
JJWT是一個提供端到端的JWT創建和驗證的Java庫。永遠免費和開源(Apache License,版本2.0),JJWT很容易使用和理解。它被設計成一個以建筑為中心的流暢界面,隱藏了它的大部分復雜性。
官方文檔:
https://github.com/jwtk/jjwt
創建TOKEN
(1)依賴引入
在parent項目中的pom.xml中添加依賴:
<!--鑒權--> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version> </dependency>(2)創建測試
在common的/test/java下創建測試類,并設置測試方法
public class JwtTest {/***** 創建Jwt令牌*/@Testpublic void testCreateJwt(){JwtBuilder builder= Jwts.builder().setId("888") //設置唯一編號.setSubject("小白") //設置主題 可以是JSON數據.setIssuedAt(new Date()) //設置簽發日期.signWith(SignatureAlgorithm.HS256,"leon");//設置簽名 使用HS256算法,并設置SecretKey(字符串)//構建 并返回一個字符串System.out.println( builder.compact() );} }運行打印結果:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NjIwNjIyODd9.RBLpZ79US MplQyfJCZFD2muHV_KLks7M1ZsjTu6Aez4再次運行,會發現每次運行的結果是不一樣的,因為我們的載荷中包含了時間。
TOKEN解析
我們剛才已經創建了token ,在web應用中這個操作是由服務端進行然后發給客戶端,客戶端在下次向服務端發送請求時需要攜帶這個token(這就好像是拿著一張門票一樣),那服務端接到這個token 應該解析出token中的信息(例如用戶id),根據這些信息查詢數據庫返回相應的結果。
/**** 解析Jwt令牌數據*/ @Test public void testParseJwt(){String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NjIwNjIyODd9.RBLpZ79USMplQyfJCZFD2muHV_KLks7M1ZsjTu6Aez4";Claims claims = Jwts.parser().setSigningKey("leon").parseClaimsJws(compactJwt).getBody();System.out.println(claims); }運行打印效果:
{jti=888, sub=小白, iat=1562062287}試著將token或簽名秘鑰篡改一下,會發現運行時就會報錯,所以解析token也就是驗證token.
設置過期時間
有很多時候,我們并不希望簽發的token是永久生效的,所以我們可以為token添加一個過期時間。
token過期設置
解釋:
.setExpiration(date)//用于設置過期時間 ,參數為Date類型數據運行,打印效果如下:
eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NjIwNjI5MjUsImV4cCI6MT U2MjA2MjkyNX0._vs4METaPkCza52LuN0-2NGGWIIO7v51xt40DHY1U1Q解析TOKEN
/**** 解析Jwt令牌數據*/ @Test public void testParseJwt(){String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NjIwNjI5MjUsImV4cCI6MTU2MjA2MjkyNX0._vs4METaPkCza52LuN0-2NGGWIIO7v51xt40DHY1U1Q";Claims claims = Jwts.parser().setSigningKey("leon").parseClaimsJws(compactJwt).getBody();System.out.println(claims); }當前時間超過過期時間,則會報錯。
自定義claims
我們剛才的例子只是存儲了id和subject兩個信息,如果你想存儲更多的信息(例如角色)可以定義自定義claims。
創建測試類,并設置測試方法:
創建token:
@Test public void createJwt(){long currentTimeMillis = System.currentTimeMillis();long l = currentTimeMillis + 20000;//生成令牌//創建jwtbuilderJwtBuilder builder = Jwts.builder();//1.頭(不設置,默認) 2 載荷(數據) 3. 簽名builder.setId("唯一的標識").setIssuer("頒發者")//生成令牌的一方.setSubject("主題")//就是描述 jwt的信息.setExpiration(new Date(l))//設置過期時間.signWith(SignatureAlgorithm.HS256,"leon");//設置簽名//3.可以自定義載荷Map<String, Object> map = new HashMap<>();map.put("myaddress","cn");map.put("mycity","sz");builder.addClaims(map);//生成令牌String compact = builder.compact();System.out.println(compact);}解析TOKEN:
@Test public void parseJwt(){//String st = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLllK_kuIDnmoTmoIfor4YiLCJpc3MiOiLpooHlj5HogIUiLCJzdWIiOiLkuLvpopgifQ.AU33UoJ8Vz_ZoCtKcvCEm5R0UFknLE-06E49z1h0nfI";//String st = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLllK_kuIDnmoTmoIfor4YiLCJpc3MiOiLpooHlj5HogIUiLCJzdWIiOiLkuLvpopgiLCJteWNpdHkiOiJzeiIsIm15YWRkcmVzcyI6ImNuIn0.VbuggDeIH66QlRAWGxoWPIKaRkCZOy45G-hAyz0Nq_k";String st = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLllK_kuIDnmoTmoIfor4YiLCJpc3MiOiLpooHlj5HogIUiLCJzdWIiOiLkuLvpopgiLCJleHAiOjE1NjY5ODU0NTMsIm15Y2l0eSI6InN6IiwibXlhZGRyZXNzIjoiY24ifQ.KtmMC-Hu1qlmYQgmLphoITQSZWRVv8YDssLZURKyczY";//解析令牌Jws<Claims> leon = Jwts.parser().setSigningKey("leon").parseClaimsJws(st);System.out.println(leon.getBody());}?
總結
以上是生活随笔為你收集整理的JWT令牌创建和解析讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JWT令牌组成和安全校验讲解
- 下一篇: 项目中鉴权流程分析