一、 基于私鑰生成jwt令牌
步驟:
導入認證服務
-
將shangcheng_user_auth工程導入到項目中去,如下圖
-
啟動eureka,再啟動認證服務
3) 認證服務中創建測試類
public class CreateJwtTest {
?
/**** 創建令牌測試*/@Testpublic void testCreateToken(){//證書文件路徑String key_location="shangcheng.jks";//秘鑰庫密碼String key_password="shangcheng";//秘鑰密碼String keypwd = "shangcheng";//秘鑰別名String alias = "shangcheng";
?//訪問證書路徑ClassPathResource resource = new ClassPathResource(key_location);
?//創建秘鑰工廠KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,key_password.toCharArray());
?//讀取秘鑰對(公鑰、私鑰)KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypwd.toCharArray());
?//獲取私鑰RSAPrivateKey rsaPrivate = (RSAPrivateKey) keyPair.getPrivate();
?//定義PayloadMap<String, Object> tokenMap = new HashMap<>();tokenMap.put("id", "1");tokenMap.put("name", "itheima");tokenMap.put("roles", "ROLE_VIP,ROLE_USER");
?//生成Jwt令牌Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(rsaPrivate));
?//取出令牌String encoded = jwt.getEncoded();System.out.println(encoded);}
}
二、 基于公鑰解析jwt令牌
上面創建令牌后,我們可以對JWT令牌進行解析,這里解析需要用到公鑰,我們可以將之前生成的公鑰public.key拷貝出來用字符串變量token存儲,然后通過公鑰解密。
在shangcheng-user-oauth創建測試類com.shangcheng.token.ParseJwtTest實現解析校驗令牌數據,代碼如下:
public class ParseJwtTest {
?/**** 校驗令牌*/@Testpublic void testParseToken(){//令牌String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6IlJPTEVfVklQLFJPTEVfVVNFUiIsIm5hbWUiOiJpdGhlaW1hIiwiaWQiOiIxIn0.IR9Qu9ZqYZ2gU2qgAziyT38UhEeL4Oi69ko-dzC_P9-Vjz40hwZDqxl8wZ-W2WAw1eWGIHV1EYDjg0-eilogJZ5UikyWw1bewXCpvlM-ZRtYQQqHFTlfDiVcFetyTayaskwa-x_BVS4pTWAskiaIKbKR4KcME2E5o1rEek-3YPkqAiZ6WP1UOmpaCJDaaFSdninqG0gzSCuGvLuG40x0Ngpfk7mPOecsIi5cbJElpdYUsCr9oXc53ROyfvYpHjzV7c2D5eIZu3leUPXRvvVAPJFEcSBiisxUSEeiGpmuQhaFZd1g-yJ1WQrixFvehMeLX2XU6W1nlL5ARTpQf_Jjiw";
?//公鑰String publickey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAmt47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnhcP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZSxtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB-----END PUBLIC KEY-----";
?//校驗JwtJwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(publickey));
?//獲取Jwt原始內容String claims = jwt.getClaims();System.out.println(claims);//jwt令牌String encoded = jwt.getEncoded();System.out.println(encoded);}
}
注:
對于令牌的解析,公鑰和私鑰是成對出現的,用正確的公鑰去解析相對應的以私鑰作為簽名的JWT令牌,否則的話無法進行解析。