java-jwt通過公鑰字符串驗證解析token方式
更新時間:2025年08月28日 08:59:54 作者:愛學習的大雄
本文示例如何將公鑰字符串轉(zhuǎn)換為RSAPublicKey對象以校驗JWT token,解決了Java-JWT庫中公鑰格式不匹配的問題,并提供代碼測試方法
引言
本文主要示例如何通過已知的公鑰(字符串),來使用java-jwt校驗token所。
由于java-jwt中校驗時所需要的公鑰是RSAPublicKey對象而我們目前的公鑰是字符串,所以我們需要進行轉(zhuǎn)化,本篇文章主要就是記錄如何進行這個轉(zhuǎn)化
如果需要了解公鑰、私鑰的概念,請百度其它文章。
代碼
<!-- java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.2.1</version>
</dependency>
/**
* 根據(jù)公鑰字符串生成PublicKey對象
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
private static PublicKey getPublicKey()
throws NoSuchAlgorithmException, InvalidKeySpecException {
String pem = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWCkZn1ksPM+DBLzgaffe2je6/Kr168fDI/CAM23Ardh4+w5yprtCmNfibCLcNZ66OzPC164p4ufboc9fxXqd5mv0ZtaHGG2pATH5e7z+Gla3Bd3QX8WqJi5LkAtsdP23IQqhz8UHA+Vmd6pTzobcQBhF1K7K/zcK9QDTFon4tCxL12wSOl40CDlWnaHortvljmJ5T3zD1iPjHjpVejI5YQReqxXEuqFVTqu2nhdTWAmfX8KrlVbPGPCevruKFmNvnl09N0Kk2CZGRlLq5aE7UZxH3GOkNWKkVWMO7tUgoJK9r8v/EIrIcuO5SX7RuyyhyY0/fsx3f+CTrUATkfgVwIDAQAB";
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pem));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(pubKeySpec);
System.out.println(publicKey);
return publicKey;
}
/**
* 校驗token
* @param token
* @return
* @throws Exception
*/
public static DecodedJWT verifierToken(String token)throws Exception{
//其實按照規(guī)定只需要傳遞 publicKey 來校驗即可,這可能是auth0 的缺點
Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) getPublicKey(),null);
JWTVerifier verifier = JWT.require(algorithm)
//.withIssuer(ISSUER)
.build(); //Reusable verifier instance 可復用的驗證實例
DecodedJWT jwt = verifier.verify(token);
return jwt;
}
測試
@SpringBootTest(classes = KeycloakdemoApplication.class)
@RunWith(SpringRunner.class)
public class DemoTest {
@Test
public void testGetInstance() throws Exception {
DecodedJWT verify = JWTUtils.verifierToken("eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIxdGtoMFBXanE1SmpOalVjc1hNYnJ1TldQVngtM2tQekJpekJGTDZfUDFJIn0.eyJleHAiOjE2NzM0NTc3MjYsImlhdCI6MTY3MzQ1NzQyNiwiYXV0aF90aW1lIjoxNjczNDU2MTU1LCJqdGkiOiJiMDZlNDljNS1kMTk5LTQ4ZWItYWE4NS1iNWJjMTMxNDVhMWIiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODEvYXV0aC9yZWFsbXMvbXlSZWFsbSIsInN1YiI6ImI4ZTAwM2Y1LTIxNDktNDUwMC04ZTE1LTZkZTU1YWM1MGRmMyIsInR5cCI6IkJlYXJlciIsImF6cCI6Im15Y2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6ImRlM2Q4ZjZhLTE4YzAtNGYzYS1hNmQwLWNlNTBjNmM2ZmNjMyIsImFjciI6IjAiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiYWRtaW4iXX0sInNjb3BlIjoib3BlbmlkIGVtYWlsIHByb2ZpbGUiLCJzaWQiOiJkZTNkOGY2YS0xOGMwLTRmM2EtYTZkMC1jZTUwYzZjNmZjYzMiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIn0.sGblDdBIkwnDDUcGd7-2QlCeA17gnmuvXosqpZ0T_zGlKtr6Ta-z1QSgwdc8K5ivekyIQmcYAIh-eHmfVxjCLKZ6fR-AdTeqenXdkNJuMREzwKpnOFx1Wq2LZUb-hqWKJimBKi2iUPlu4ENAVbFOWxcMwIedySpN74RHF3yP4BKr4YfAmr5u9CSX3EYw0LMiMVlt6l_FKNssKnTLlBq0IPDlBdwV9D1l6qpDXu_uIbvUzb_w8rnSoUGMqqqxI-RNF6m5dit29KWinFfkat5-g-lvbiVz8l0wYfMBGb9ESwC0aXJARcEG7PdhtqYLPjsGFVrjqHMq1ci_BVivAt3Htw");
System.out.println(verify);
System.out.println(verify.getExpiresAt());
System.out.println(verify.getClaim("scope"));
System.out.println(verify.getExpiresAtAsInstant());
System.out.println(verify.getClaims());
}
}

總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
jackson 實現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼
這篇文章主要介紹了jackson 實現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Spring系列中的beanFactory與ApplicationContext
這篇文章主要介紹了Spring系列中的beanFactory與ApplicationContext,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
2022-09-09
SpringBoot中使用Filter和Interceptor的示例代碼
這篇文章主要介紹了SpringBoot中使用Filter和Interceptor的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
2019-06-06
SpringBoot如何使用@Value取配置文件中的map配置
這篇文章主要介紹了SpringBoot如何使用@Value取配置文件中的map配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
2023-05-05 
