1. 程式人生 > 實用技巧 >JWT JSON Web Token 令牌 技術 在 微服務 中 鑑權功能的使用

JWT JSON Web Token 令牌 技術 在 微服務 中 鑑權功能的使用

JWT是一種規範,本身也是一個字串,作用就是加密,不便於理解,

程式可以解讀其資訊,往往作為令牌使用,;

JWT 是 JSON Web Token 的縮寫, 翻譯是JSON 網路 令牌 的意思;

JWT 字串 由 3個 部分組成

頭部:

是一個json字串 描敘一下 基本資訊:例如說明 型別 演算法 等

比如說這個 json 字串

{"typ":"JWT","alg":"HS256"}

在頭部指明瞭簽名演算法是HS256演算法。 我們進行BASE64編碼http://base64.xpcha.com/,編碼後的字串如下:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

就是

{"typ":"JWT","alg":"HS256"} 變變變eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

載荷:

載荷就是 JWT 放 資訊的地方,好像是 貨車 的 車廂
格式同 頭部
例如
{"sub":"1234567890","name":"John Doe","admin":true}
=>
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

簽證:

文章煞尾 的作用 + 字串 加鹽加密 的作用

最後這裡 是一個 儲存的字串,類似這樣

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

簽證這裡 最重要的是 一個 字串, 再解析整個JWT字串的時候需要用到,你不知道 簽證字串 是什麼 ,就無法 解析整個 JWT 字串

整個

JWT字串 類似是這個樣子 包含了如上3部分資訊

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

/******************************************************************************************************************************************/

JWT作為

令牌使用的時候 往往 通過是 後臺 新增頭 資訊 發給客戶端,也可以做成cookie 發給客戶端;

/*****************************************************************************************************************************************/

Apache開源的JJWT

操作 JWT

1.0生成 JWT

2.0解析JWT

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

首先需要如下依賴

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.0</version>
</dependency>

然後
可用這個類生成 JWT
JwtBuilder builder= Jwts.builder()
   .setId("888")  //設定唯一編號
   .setSubject("某JSON")//設定主題  可以是JSON資料
   .setIssuedAt(new Date())//設定簽發日期
   .signWith(SignatureAlgorithm.HS256,"biyou");//設定簽名 使用HS256演算法,並設定SecretKey(字串),這個"biyou"是關鍵,後面解析要用這個
//構建 並返回一個JWT字串 
System.out.println( builder.compact() );

>>>>>>>>>>>>>>>>>
然後你要拿 這個 JWT 字串做什麼都行

解析JWT字串,可以理解是(貨車卸貨)
String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDQxODF9.ThecMfgYjtoys3JX7dpx3hu6pUm0piZ0tXXreFU_u3Y";
Claims claims = Jwts.parser().setSigningKey("biyou").parseClaimsJws(compactJwt).getBody();
//卸貨
System.out.println(claims);

/*************************************************************************************/
以上是JJWT 的基本操作, JJWT 也可以給 生成的 JWT 字串 設定 過期時間,
如果是已過期的 JWT 字串,JJWT 在解析的時候,會抱一個
ExpiredJwtException的異常,用try-catch !!專門!!抓一下這個異常
就知道 這個 這個 JWT 過期了,

JJWT設定過期時間如下
long currentTimeMillis = System.currentTimeMillis();

Date date = new Date(currentTimeMillis+10086L);

JwtBuilder builder= Jwts.builder()

   .setId("888")  //設定唯一編號

   .setSubject("某JSON")//設定主題  可以是JSON資料

   .setIssuedAt(new Date())//設定簽發日期

   .setExpiration(date)//設定過期時間

   .signWith(SignatureAlgorithm.HS256,"biyou");//設定簽名 使用HS256演算法,並設定SecretKey(字串)

//構建 並返回一個字串

System.out.println( builder.compact() );

JJWT解析
String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDUzMDgsImV4cCI6MTU1NzkwNTMwOH0.4q5AaTyBRf8SB9B3Tl-I53PrILGyicJC3fgR3gWbvUI";
Claims claims = Jwts.parser().setSigningKey("biyou").parseClaimsJws(compactJwt).getBody();
System.out.println(claims);
>>>>>>>>>>>>>>>>>>>>
如果設定了過期時間 解析 需要 try-catch 一下 專門 抓 過期異常
ExpiredJwtException ;