3.6.3 JWT入門
Spring Security 提供對JWT的支持,本節咱們使用Spring Security 提供的JwtHelper來建立JWT令牌,校驗JWT令牌 等操做。 3.6.3.1 生成私鑰和公鑰
JWT令牌生成採用非對稱加密算法
一、生成密鑰證書 下邊命令生成密鑰證書,採用RSA 算法每一個證書包含公鑰和私鑰 keytool -genkeypair -alias xckey -keyalg RSA -keypass xuecheng -keystore xc.keystore -storepass xuechengkeystore
Keytool 是一個java提供的證書管理工具 -alias:密鑰的別名
-keyalg:使用的hash算法 -keypass:密鑰的訪問密碼 -keystore:密鑰庫文件名,xc.keystore保存了生成的證書
-storepass:密鑰庫的訪問密碼
查詢證書信息:
keytool -list -keystore xc.keystore
刪除別名
keytool -delete -alias xckey -keystore xc.keystore
二、導出公鑰 openssl是一個加解密工具包,這裏使用openssl來導出公鑰信息。
安裝 openssl:http://slproweb.com/products/Win32OpenSSL.html
安裝資料目錄下的Win64OpenSSL-1_1_0g.exe 配置openssl的path環境變量,本教程配置在D:\OpenSSL-Win64\bin
cmd進入xc.keystore文件所在目錄執行以下命令:
[mw_shl_code=applescript,true]keytool ‐list ‐rfc ‐‐keystore xc.keystore | openssl x509 ‐inform pem ‐pubkey [/mw_shl_code]
輸入密鑰庫密碼:
下邊這一段就是公鑰內容:-----BEGIN PUBLIC KEY----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAijyxMdq4S6L1Af1rtB8SjCZHNgsQG8JTfGy55eYvzG0B /E4AudR2prSRBvF7NYPL47scRCNPgLnvbQczBHbBug6uOr78qnWsYxHlW6Aa5dI5NsmOD4DLtSw8eX0hFyK5F j6ScYOSFBz9cd1nNTvx2+oIv0lJDcpQdQhsfgsEr1ntvWterZt/8r7xNN83gHYuZ6TM5MYvjQNBc5qC7Krs9wM7U oQuL+s0X6RlOib7/mcLn/lFLsLDdYQAZkSDx/6+t+1oHdMarChIPYT1sx9Dwj2j2mvFNDTKKKKAq0cv14Vrhz67Vj mz2yMJePDqUi0JYS2r0iIo7n8vN7s83v5uOQIDAQAB-----END PUBLIC KEY----
將上邊的公鑰拷貝到文本文件中,合併爲一行。
3.6.3.2 生成jwt令牌
在認證工程建立測試類,測試jwt令牌的生成與驗證。html
[mw_shl_code=applescript,true]//生成一個jwt令牌 @Test public void testCreateJwt(){ //證書文件 String key_location = "xc.keystore"; //密鑰庫密碼 String keystore_password = "xuechengkeystore"; //訪問證書路徑 ClassPathResource resource = new ClassPathResource(key_location); //密鑰工廠 KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource, keystore_password.toCharArray()); //密鑰的密碼,此密碼和別名要匹配 String keypassword = "xuecheng"; //密鑰別名 String alias = "xckey"; //密鑰對(密鑰和公鑰) KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypassword.toCharArray()); //私鑰 RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate(); //定義payload信息 Map<String, Object> tokenMap = new HashMap<>(); tokenMap.put("id", "123"); tokenMap.put("name", "mrt"); tokenMap.put("roles", "r01,r02"); tokenMap.put("ext", "1"); //生成jwt令牌 Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(aPrivate)); //取出jwt令牌 String token = jwt.getEncoded(); System.out.println("token="+token); } [/mw_shl_code]