- 使用JWT驗證客戶的攜帶的token
- 客戶端在請求接口時,需要在request的head中攜帶一個token令牌
- 服務器拿到這個token解析獲取用戶資源,這里的資源是非重要的用戶信息
目前我的理解,用於校驗的幾種方式
1. 攔截器
2. SpringSecurity驗證(目前沒有弄懂)
3. shiro攔截驗證
攔截器
配置好攔截器后,過濾掉無需驗證的接口,其他的接口在請求的時候,獲取其token然后解析是否是正確的客戶端資源
SrpingSecurity
SpringSecurity就麻煩多了...此處省略1000字
Shiro自定義認證
shiro在自定義realm中有兩個方法,一個是認證,一個是授權,在其認證的方法內驗證其token
重點
上面說的只是個流程,最主要的是jwt怎么做token的編碼和解碼的
long expire = 680090;
String = "123";
這里有兩個需要注意的地方,就是設置過期時間和鹽
過期時間是驗證token的有效時間,在自己手動設置過期時間內是有效的,超過此時間,jwt就無法解析其token了
其次是鹽,這是個字符串常量,也可以動態生成鹽,放入數據庫中在驗證的時候獲取解析,這里需要將其詞符串設置成Base64編碼,不然會解析錯誤..(大坑)這里使用的是apache的codec來編碼字符串,也可使用java自帶的Base64工具編碼
生成token
/**
* 生成jwt token
*/
public String generateToken(long userId) {
Date nowDate = new Date();
//過期時間
Date expireDate = new Date(nowDate.getTime() + expire * 1000);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
//生成加密密鑰
return Jwts.builder()
.setHeaderParam("typ", "JWT")
.setSubjectsecret(userId+"")
.setIssuedAt(nowDate)
.setExpiration(expireDate)
.signWith(signatureAlgorithm, new String(org.apache.commons.codec.binary.Base64.encodeBase64(secret.getBytes())))
.compact();
}
ps: 在這里傳入的是用戶id,這在解碼后通過getSubject()方法可以獲取到,如果需要傳入用戶的多個信息也可以設置成
.claim("info",userInfo)
.claim("id",userId)
獲取
@Test
public void jwt(){
String s = generateToken(1,"小明");
System.out.println(s);
Claims claimByToken = getClaimByToken(s);
System.out.println(claimByToken.get("info")+"--"+claimByToken.get("id"));
}
resut: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpbmZvIjoi5bCP5piOIiwiaWQiOjEsImlhdCI6MTU0NDg4NTQyOCwiZXhwIjoxNTQ1NTY1NTE4fQ.4SvjebEFd4lixC1jHgyMpQrlPoQz8DI0BTFYsGY0GsPKx_dc7GfDLR2qd_mi46mLpDvJ0HCatfEmhb7w7y9xrA
小明--1
解析token
/**
* 解析token
*
* @param token
* @return
*/
public Claims getClaimByToken(String token) {
String secret = "123";
try {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
return Jwts.parser()
.setSigningKey(new String(org.apache.commons.codec.binary.Base64.encodeBase64("123".getBytes())))
.parseClaimsJws(token)
.getBody();
}catch (Exception e){
System.out.println("jwt 解密失敗");
return null;
}
}
ps:目前解決了基本問題,shiro+jwt 就很NICE-__-
至於SpringSecurity:還是要多多學習了.....
