教程:用Java创建和验证JWT
“我喜歡編寫身份驗證和授權代碼。” ?從來沒有Java開發人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權和多因素身份驗證。
Java對JWT(JSON Web令牌)的支持過去需要進行大量工作:廣泛的自定義,花費數小時來解決依賴項,以及僅用于組裝簡單JWT的代碼頁。 不再!
本教程將向您展示如何使用現有的JWT庫做兩件事:
您會注意到本教程很短。 那是因為那很容易。 如果您想更深入地了解,請查看JWT規范或深入閱讀有關在Spring Boot應用程序中使用JWT進行令牌身份驗證的更長的文章 。
什么是JWT?
JSON Web令牌是JSON對象,用于在各方之間以緊湊和安全的方式發送信息。 JSON規范 (或Javascript對象表示法)定義了一種使用鍵值對創建純文本對象的方法。 這是一種構造基于原始類型(數字,字符串等)的數據的緊湊方法。 您可能已經非常熟悉JSON。 就像沒有括號的XML。
令牌可用于在各方之間發送任意狀態。 這里的“當事人”通常是指客戶端Web應用程序和服務器。 JWT具有多種用途:身份驗證機制,URL安全編碼,安全共享私有數據,互操作性,數據過期等。
實際上,此信息通常與兩件事有關:授權和會話狀態。 服務器可以使用JWT告訴客戶端應用程序允許用戶執行哪些操作(或允許他們訪問哪些數據)。
JWT通常還用于存儲Web會話的狀態相關用戶數據。 因為JWT是在客戶端應用程序和服務器之間來回傳遞的,這意味著狀態數據不必存儲在某個地方的數據庫中(隨后在每個請求中都可以檢索到); 因此,它可以很好地擴展。
讓我們看一個JWT示例(取自jsonwebtoken.io )
JWT具有三部分:標頭,正文和簽名。 標頭包含有關JWT編碼方式的信息。 主體是代幣的肉 ( 索賠所在的地方)。 簽名提供了安全性。
關于令牌的編碼方式以及信息在體內的存儲方式,我們這里不做很多詳細介紹。 如果需要,請查看前面提到的教程 。
不要忘記:加密簽名不??提供保密性; 它們只是檢測篡改JWT的一種方式,除非JWT經過專門加密,否則它們是公開可見的。 簽名只是提供了一種驗證內容的安全方法。
大。 得到它了? 現在,您需要使用JJWT制作令牌! 對于本教程,我們使用現有的JWT庫。 Java JWT (又名JJWT)由Les Hazlewood (Apache Shiro的主要提交人,Storm的前聯合創始人兼CTO,現為Okta自己的高級架構師)創建,JJWT是一個簡化JWT創建和驗證的Java庫。 它完全基于JWT , JWS , JWE , JWK和JWA RFC規范,并根據Apache 2.0許可的條款開源。 該庫還為規范添加了一些不錯的功能,例如JWT壓縮和聲明執行。
用Java生成令牌
這部分超級容易。 讓我們看一些代碼。 克隆GitHub存儲庫 :
git clone https://github.com/oktadeveloper/okta-java-jwt-example.git cd okta-java-jwt-example這個示例非常基礎,并且包含一個src/main/java/JWTDemo.java類文件,其中包含兩個靜態方法: createJWT()和decodeJWT() 。 足夠巧妙的是,這兩種方法創建了一個JWT并對JWT進行解碼。 看下面的第一種方法。
public static String createJWT(String id, String issuer, String subject, long ttlMillis) {//The JWT signature algorithm we will be using to sign the tokenSignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);//We will sign our JWT with our ApiKey secretbyte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(SECRET_KEY);Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());//Let's set the JWT ClaimsJwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).setIssuer(issuer).signWith(signatureAlgorithm, signingKey);//if it has been specified, let's add the expirationif (ttlMillis > 0) {long expMillis = nowMillis + ttlMillis;Date exp = new Date(expMillis);builder.setExpiration(exp);} //Builds the JWT and serializes it to a compact, URL-safe stringreturn builder.compact(); }總而言之, createJWT()方法執行以下操作:
- 設置哈希算法
- 獲取簽發日期索賠的當前日期
- 使用SECRET_KEY靜態屬性生成簽名密鑰
- 使用流暢的API添加聲明并簽署JWT
- 設置到期日期
可以根據您的需求進行定制。 例如,如果您想添加其他或自定義聲明。
解碼令牌
現在看一下更簡單的decodeJWT()方法。
public static Claims decodeJWT(String jwt) {//This line will throw an exception if it is not a signed JWS (as expected)Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(SECRET_KEY)).parseClaimsJws(jwt).getBody();return claims; }該方法再次使用靜態SECRET_KEY屬性生成簽名密鑰,并使用該方法來驗證JWT是否未被篡改。 如果簽名與令牌不匹配,則該方法將引發io.jsonwebtoken.SignatureException異常。 如果簽名確實匹配,則該方法將索賠作為Claims對象返回。
差不多了!
運行JUnit測試
為了獲得更多的榮譽,您可以在示例項目中運行JUnit測試。 有三個測試,它們演示了JJWT庫的一些基本功能。 第一個測試顯示了一條愉快的路,創建并成功解碼了有效的JWT。 第二個測試顯示了當您嘗試將完全偽造的字符串解碼為JWT時,JJWT庫將如何失敗。 最后一個測試顯示了被JJWT篡改的方式將如何導致decodeJWT()方法引發SignatureException 。
您可以使用以下命令從命令行運行這些測試:
./gradlew test -i-i將Gradle的日志級別設置為Info以便我們看到測試的簡單日志輸出。
了解有關在Java應用程序中使用JWT的更多信息
JJWT庫使創建和驗證JWT非常容易。 只需指定一個秘密密鑰和一些聲明,您就會擁有一個JJWT。 以后,使用相同的密鑰對JJWT進行解碼并驗證其內容。
現在,創建和使用JJWT非常簡單,為什么不使用它們呢?
不要忘記SSL! 請記住,除非對JWT進行加密,否則它們中編碼的信息通常僅是Base64編碼的,任何小孩和一些寵物都可以讀取。 因此,除非您希望中國,俄羅斯和FBI讀取所有會話數據,否則請使用SSL對其進行加密。
Baeldung 在Java和JWT上有相當不錯的深入教程 。
另外,這里還有Okta博客提供的更多鏈接,可幫助您繼續前進:
- Java應用程序的簡單令牌認證
- Spring Boot,OAuth 2.0和Okta入門
- 確保Spring Boot應用程序安全的10種絕佳方法
- 如果您的JWT被盜怎么辦?
- JWT分析器和檢查器Chrom插件
- 在線編碼或解碼JWT
如果您對此帖子有任何疑問,請在下面添加評論。 有關更多精彩內容, 請在Twitter上關注@oktadev , 在Facebook上關注我們,或訂閱我們的YouTube頻道 。
“我喜歡編寫身份驗證和授權代碼。” ?從來沒有Java開發人員。 厭倦了一次又一次地建立相同的登錄屏幕? 嘗試使用Okta API進行托管身份驗證,授權和多因素身份驗證。
``教程:用Java創建和驗證JWT''最初于2018年10月31日發布在Okta開發者博客上。
翻譯自: https://www.javacodegeeks.com/2019/01/tutorial-create-verify-jwts-java.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的教程:用Java创建和验证JWT的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 腾讯文档代码快捷键(腾讯文档功能)
- 下一篇: 电脑屏幕红白蓝一直闪(电脑屏幕红白蓝一直
