如何在JWT中使用token?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網站策劃、網站設計、網站制作、做網站、電子商務、網站推廣、網站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網的全面整合營銷服務。公司擁有豐富的網站建設和互聯(lián)網應用系統(tǒng)開發(fā)管理經驗、成熟的應用系統(tǒng)解決方案、優(yōu)秀的網站開發(fā)工程師團隊及專業(yè)的網站設計師團隊。JWT token的組成
頭部(Header),格式如下:
{ “typ”: “JWT”, “alg”: “HS256” }
由上可知,該token使用HS256加密算法,將頭部使用Base64編碼可得到如下個格式的字符串:
eyJhbGciOiJIUzI1NiJ9
有效載荷(Playload):
{ “iss”: “Online JWT Builder”, “iat”: 1416797419, “exp”: 1448333419, ……. “userid”:10001 }
有效載荷中存放了token的簽發(fā)者(iss)、簽發(fā)時間(iat)、過期時間(exp)等以及一些我們需要寫進token中的信息。有效載荷也使用Base64編碼得到如下格式的字符串:
eyJ1c2VyaWQiOjB9
簽名(Signature):
將Header和Playload拼接生成一個字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我們提供的密鑰(secret,服務器自己提供的一個字符串)對str進行加密生成最終的JWT,即我們需要的令牌(token),形如:str.”簽名字符串”。
token在服務與客戶端的交互流程
1:客戶端通過用戶名和密碼登錄
2:服務器驗證用戶名和密碼,若通過,生成token返回給客戶端。
3:客戶端收到token后以后每次請求的時候都帶上這個token,相當于一個令牌,表示我有權限訪問了
4:服務器接收(通常在攔截器中實現(xiàn))到該token,然后驗證該token的合法性(為什么能驗證下面說)。若該token合法,則通過請求,若token不合法或者過期,返回請求失敗。
關于Token的思考
服務如何判斷這個token是否合法?
由上面token的生成可知,token中的簽名是由Header和有效載荷通過Base64編碼生成再通過加密算法HS256和密鑰最終生成簽名,這個簽名位于JWT的尾部,在服務器端同樣對返回過來的JWT的前部分再進行一次簽名生成,然后比較這次生成的簽名與請求的JWT中的簽名是否一致,若一致說明token合法。由于生成簽名的密鑰是服務器才知道的,所以別人難以偽造。
token中能放敏感信息嗎?
不能,因為有效載荷是經過Base64編碼生成的,并不是加密。所以不能存放敏感信息。
Token的優(yōu)點
(1)相比于session,它無需保存在服務器,不占用服務器內存開銷。
(2)無狀態(tài)、可拓展性強:比如有3臺機器(A、B、C)組成服務器集群,若session存在機器A上,session只能保存在其中一臺服務器,此時你便不能訪問機器B、C,因為B、C上沒有存放該Session,而使用token就能夠驗證用戶請求合法性,并且我再加幾臺機器也沒事,所以可拓展性好就是這個意思。
(3)由(2)知,這樣做可就支持了跨域訪問。
Java實例:JWT token使用
部分代碼來自互聯(lián)網,找不到原作者了。。
編寫JWT(Java Web Token)操作類:JavaWebToken
public class JavaWebToken { private static Logger log = LoggerFactory.getLogger(JavaWebToken.class); //該方法使用HS256算法和Secret:bankgl生成signKey private static Key getKeyInstance() { //We will sign our JavaWebToken with our ApiKey secret SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl"); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); return signingKey; } //使用HS256簽名算法和生成的signingKey最終的Token,claims中是有效載荷 public static String createJavaWebToken(Map<String, Object> claims) { return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact(); } //解析Token,同時也能驗證Token,當驗證失敗返回null public static Map<String, Object> parserJavaWebToken(String jwt) { try { Map<String, Object> jwtClaims = Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody(); return jwtClaims; } catch (Exception e) { log.error("json web token verify failed"); return null; } } }
編寫登錄Conreoller,在服務器端給客戶返回token.
public LoginStatusMessage checkUserAndPassword( @RequestParam(value="username",required=true) String username, @RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{ User u = new User(); //登錄成功 if((u = userService.checkUsernameAndPassword(user)) != null){ Map<String,Object> m = new HashMap<String,Object>(); m.put("userid", user.getUserid()); String token = JavaWebToken.createJavaWebToken(m); System.out.println(token); LoginStatusMessage lsm = new LoginStatusMessage(); lsm.setUser(u); lsm.setToken(token); return lsm; }; //登錄失敗,返回Null return null; }
在攔截器中對請求中的Token驗證(部分代碼,表示下意思):
String token = request.getParameter("token"); if(JavaWebToken.parserJavaWebToken(token) != null){ //表示token合法 return true; }else{ //token不合法或者過期 return false; }
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)成都網站設計公司行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)成都網站設計公司的支持。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、網站設計器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
當前題目:如何在JWT中使用token-創(chuàng)新互聯(lián)
新聞來源:http://m.rwnh.cn/article36/iidsg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供App設計、ChatGPT、搜索引擎優(yōu)化、網站收錄、品牌網站建設、外貿網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)