微服务之间调用的安全认证-jwt
在微服務架構下,如何保證服務與服務之間調用的安全性呢?不是說你想調用就可以調用,一定要有認證機制,即只有我們內部服務發出的請求,才可以調用我們的接口。
什么是JWT
JWT(Json Web Token)是為了在網絡應用環境間傳遞聲明而執行的一種基于Json的開放標準。JWT的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源。
比如用在用戶登錄上時,基本思路就是用戶提供用戶名和密碼給認證服務器,服務器驗證用戶提交信息的合法性;如果驗證成功,會產生并返回一個Token,用戶可以使用這個Token訪問服務器上受保護的資源。
JWT由三部分構成,第一部分稱為頭部(Header),第二部分稱為消息體(Payload),第三部分是簽名(Signature)。一個JWT生成的Token格式為:
token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)頭部的信息通常由兩部分內容組成,令牌的類型和使用的簽名算法:
{ "alg": "HS256", "typ": "JWT" }消息體中可以攜帶一些你需要的信息,比如用戶ID。因為你得知道這個Token是哪個用戶的,如下:
{ "id": "94256", "name": "DaDudu", "role": teacher }簽名是用來判斷消息在傳遞的路上是否被篡改,從而保證數據的安全性,如下:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)通過這三部分就組成了我們的Json Web Token。
創建統一的認證服務
生成Token是在進行用戶身份認證之后,通過用戶的ID來生成一個Token,這個Token采用RSA加密的方式進行加密,Token的內容包括用戶的ID和過期時間。
public static String getToken(String uid, int exp) {return Jwts.builder().setSubject(uid).setExpiration(new Date(System.currentTimeMillis() + 1000 *60 *exp)).signWith(SignatureAlgorithm.RS512, priKey).compact(); }檢查Token則是根據調用方帶來的Token檢查是否為合法用戶,就是對Token進行解密操作,能解密并且在有效期內表示合法,合法則返回用戶ID。
public JWTResult checkToken(String token) {try {Claims claims = Jwts.parser().setSigningKey(pubKey).parseClaimsJws(token).getBody();String sub = claims.get("sub", String.class);return new JWTResult(true, sub, " 合法請求 ", ResponseCode.SUCCESS_CODE.getCode());} catch (ExpiredJwtException e) {// 在解析 JWT 字符串時,如果’過期時間字段’已經早于當前時間,// 將會拋出 ExpiredJwtException 異常,說明本次請求已經失效return new JWTResult(false, null, "token 已過期 ", ResponseCode.TOKEN_TIMEOUT_CODE.getCode());} catch (SignatureException e) {// 在解析 JWT 字符串時,如果密鑰不正確,將會解析失敗,拋出 SignatureException 異常,說明該 JWT 字符串是偽造的return new JWTResult(false, null, " 非法請求 ", ResponseCode.NO_AUTH_CODE.getCode()); } catch (Exception e) { return new JWTResult(false, null, " 非法請求 ", ResponseCode.NO_AUTH_CODE.getCode()); }}刷新RSA公鑰及私鑰的作用是防止公鑰、私鑰泄露,公鑰、私鑰一般是寫死的,不過我們可以做成配置的。集成配置管理中心后,可以對公鑰、私鑰進行動態修改,修改之后需要重新初始化公鑰、私鑰的對象信息。
服務提供方進行調用認證
服務提供方就是provider。服務消費方消費接口時,provider需要對其進行身份驗證,驗證通過才可以讓它消費接口。
服務消費方申請Token
目前服務提供方已經開啟了調用認證,這意味著如果現在直接調用接口會被攔截,所以在調用之前需要進行認證,即獲取Token并將其放到請求頭中與請求頭一起傳輸才可以調用接口。
總結
以上是生活随笔為你收集整理的微服务之间调用的安全认证-jwt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《java程序设计基础》使用Reader
- 下一篇: 2019年日本上班的你必须知道的社会保障