分散式應用的登入檢驗解決方案 JWT講解( json web token)
什麼是JWT
JWT 是一個開放標準,它定義了一種用於簡潔,自包含的用於通訊雙方之間以 JSON 物件的形式安全傳遞資訊的方法。 可以使用 HMAC 演算法或者是 RSA 的公鑰金鑰對進行簽名
簡單來說: 就是通過一定規範來生成token,然後可以通過解密演算法逆向解密token,這樣就可以獲取使用者資訊
優點
生產的token可以包含基本資訊,比如id、使用者暱稱、頭像等資訊,避免再次查庫
儲存在客戶端,不佔用服務端的記憶體資源
缺點
token是經過base64編碼,所以可以解碼,因此token加密前的物件不應該包含敏感資訊,如使用者許可權,密碼等
如果沒有服務端儲存,則不能做登入失效處理,除非服務端改祕鑰
JWT格式組成
頭部、負載、簽名
header+payload+signature
頭部:主要是描述簽名演算法
負載:主要描述是加密物件的資訊,如使用者的id等,也可以加些規範裡面的東西,如iss簽發者,exp 過期時間,sub 面向的使用者
簽名:主要是把前面兩部分進行加密,防止別人拿到token進行base解密後篡改token
相關依賴
<!-- JWT相關 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
封裝生產token方法
/**
* 根據使用者資訊,生成令牌
* @param user
* @return
*/
/**
* 過期時間一週
*/
static final long EXPIRE = 60000 * 60 *24 * 7;
/**
* 加密金鑰
*/
private static final String SECRET;
/**
* 令牌字首
*/
private static final String TOKEN_PREFIX ;
/**
* subject
*/
private static final String SUBJECT;
public static String geneJsonWebToken(User user){
String token = Jwts.builder().setSubject(SUBJECT)
.claim("head_img",user.getHeadImg())
.claim("id",user.getId())
.claim("name",user.getName())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
.signWith(SignatureAlgorithm.HS256,SECRET).compact();
token = TOKEN_PREFIX + token;
return token;
}
封裝校驗token方法
public static Claims checkJWT(String token){
try{
final Claims claims = Jwts.parser().setSigningKey(SECRET)
.parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody();
return claims;
}catch (Exception e){
return null;
}
}
注意點
根據使用者資訊生成令牌
* 1.生成的token,是可以通過base64進行解密出明文資訊
* 2.base64進行解密出明文資訊,修改再編碼,則會解密失敗
* 3.無法作廢已頒佈的token,除非改金鑰
相關文章
- JWT(Json WEB Token)JWTJSONWeb
- json web token 實踐登入以及校驗碼驗證JSONWeb
- JSON Web Token(JWT) 簡介JSONWebJWT
- 前後端分離使用 Token 登入解決方案後端
- python使用JWT(json web token)實現驗證PythonJWTJSONWeb
- C#分散式登入——jwtC#分散式JWT
- 【Azure Developer】如何驗證 Azure AD的JWT Token (JSON Web 令牌)?DeveloperJWTJSONWeb
- 實現基於JWT的Token登入驗證功能JWT
- GitHub不再支援密碼驗證解決方案:SSH免密與Token登入配置Github密碼
- 除了cookie,你還可以用jwt(json web token)!CookieJWTJSONWeb
- JSON Web Token 使用詳解JSONWeb
- 分散式鎖的解決方案分散式
- 講述分散式架構雲平臺解決方案分散式架構
- 『JWT』,你必須瞭解的認證登入方案JWT
- 分散式下的WebSocket解決方案分散式Web
- Redis分散式鎖解決方案Redis分散式
- Redis 分散式鎖解決方案Redis分散式
- SAP HANA分散式解決方案分散式
- 分散式事務解決方案分散式
- 阿里雲解決方案架構師,講述分散式架構雲平臺解決方案阿里架構分散式
- 常用的分散式事務解決方案分散式
- 聊聊分散式下的WebSocket解決方案分散式Web
- vue4 + laravel8使用JWT登入及token驗證VueLaravelJWT
- 前後端分離之JWT(JSON Web Token)的使用後端JWTJSONWeb
- JSON Web Token 入門教程JSONWeb
- Java 自定義註解在登入驗證的應用Java
- 分散式互斥的高效容錯解決方案分散式
- 你必須瞭解的分散式事務解決方案分散式
- 分散式 ID 解決方案之美團 Leaf分散式
- SpringCloud 分散式事務解決方案SpringGCCloud分散式
- 杉巖分散式儲存解決方案分散式
- MSSQL server分散式事務解決方案SQLServer分散式
- 分散式事務解決方案--GTS(二)分散式
- 分散式事務解決方案--GTS(一)分散式
- 分散式事務解決方案彙總分散式
- 分散式事務解決方案(五)【TCC型方案】分散式
- 分散式事務解決方案與適用場景分析分散式
- 微信登入-6問題解決方案