1. 程式人生 > >JWT原理 使用(入門篇)

JWT原理 使用(入門篇)

1、JWT簡介

JWT:Json Web Token,是基於Json的一個公開規範,這個規範允許我們使用JWT在使用者和伺服器之間傳遞安全可靠的資訊,他的兩大使用場景是:認證和資料交換 使用起來就是,由服務端根據規範生成一個令牌(token),並且發放給客戶端。此時客戶端請求服務端的時候就可以攜帶者令牌,以令牌來證明自己的身份資訊。 作用:類似session保持登入狀態 的辦法,通過token來代表使用者身份。  

2,JWT生成

 

3,JWT校驗

 

4,一些問題

a、token到底生成什麼樣最好?(規則),每個使用者要唯一 b、token返回給客戶端之後,服務端還要儲存嗎? c、校驗token時,怎麼保證資料並沒有被黑客攔截並篡改?(安全) d、token頒發給客戶端之後,要不要有過期時間? e、多次登入生成的token都是一樣的嗎?都是可用的嗎?  

5,JWT規則詳解

一個JWT實際上就是一個字串,它由三部分組成:頭部、載荷與簽名 header.payload.signature 一個正常的token為: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG-9-9MCUufCgrAhhGjuo85GKV4bOQ    

 

6,JWT令牌的優點:

a、jwt基於json,非常方便解析 b、可以再令牌中自定義豐富的內容,易擴充套件(payload可以擴充套件) c、通過簽名,讓JWT防止被篡改,安全性高 d、資源服務使用JWT可不依賴認證服務即可完成授權    

7,demo測試

 1 /**
 2 * JWT 測試controller
 3 *
 4 * @author wangmeng
 5 * @date 2019/9/2
 6 */
 7 @RestController
 8 @RequestMapping(value = "/user", produces = { "application/json; charset=UTF-8" })
 9 public class JWTController {
10  
11  
12     private static final String SECRET = "[email protected]";
13  
14  
15     @RequestMapping("/login/{username}/{password}")
16     public Map login(@PathVariable String username, @PathVariable String password) {
17         Map result = new HashMap();
18         if (username.equals("admin") && password.equals("123456")) {
19             String jwt = Jwts.builder().
20                     setSubject(username).
21                     signWith(SignatureAlgorithm.HS512, SECRET).
22                     compact();
23             result.put("token", jwt);
24         } else {
25             result.put("message", "賬號密碼錯誤");
26         }
27  
28  
29         return result;
30     }
31  
32  
33     @RequestMapping("/goods/{token}")
34     public Map verifyToken(@PathVariable String token) {
35         Map result = new HashMap();
36         Jws<Claims> claimsJws = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token);
37         result.put("username", claimsJws.getBody().getSubject());
38         return result;
39     }
40 }

 

 

請求測試:

1、生成token   2、使用token請求,獲取username    

8、問題解答

a、token到底生成什麼樣最好?(規則),每個使用者要唯一 三部分組成:頭部、載荷與簽名 header.payload.signature   b、token返回給客戶端之後,服務端還要儲存嗎? 服務端不需要儲存   c、校驗token時,怎麼保證資料並沒有被黑客攔截並篡改?(安全) signature中有私鑰來進行簽名,可以保證安全性   d、token頒發給客戶端之後,要不要有過期時間? 需要設定token過期時間   e、多次登入生成的token都是一樣的嗎?都是可用的嗎? 可以再payload加上時間戳,來保證每次生成的token都不一樣,都是可用的  

 後記

JWT還有很多內容需要挖掘,這裡只是入門篇,後面有時間還會看看JWT原始碼 以及一些常見的坑。