一、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 = "wangmengtest.@163.com";
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 }
請求測試:
一、生成token
二、使用token請求,獲取username
八、問題解答
a、token到底生成什麼樣最好?(規則),每一個用戶要惟一
三部分組成:頭部、載荷與簽名 header.payload.signature
b、token返回給客戶端以後,服務端還要保存嗎?
服務端不須要保存
c、校驗token時,怎麼保證數據並無被黑客攔截並篡改?(安全)
signature中有私鑰來進行簽名,能夠保證安全性
d、token頒發給客戶端以後,要不要有過時時間?
須要設置token過時時間
e、屢次登陸生成的token都是同樣的嗎?都是可用的嗎?
能夠再payload加上時間戳,來保證每次生成的token都不同,都是可用的
後記
JWT還有不少內容須要挖掘,這裏只是入門篇,後面有時間還會看看JWT源碼 以及一些常見的坑。