Java jwt使用公鑰字符串驗(yàn)證解析token鎖方法詳解
引言
本文主要示例如何通過(guò)已知的公鑰(字符串),來(lái)使用java-jwt校驗(yàn)token鎖。
由于java-jwt中校驗(yàn)時(shí)所需要的公鑰是RSAPublicKey對(duì)象而我們目前的公鑰是字符串,所以我們需要進(jìn)行轉(zhuǎn)化,本篇文章主要就是記錄如何進(jìn)行這個(gè)轉(zhuǎn)化
如果需要了解公鑰、私鑰的概念,請(qǐng)百度其它文章。
代碼
<!-- java-jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.2.1</version>
</dependency>
/**
* 根據(jù)公鑰字符串生成PublicKey對(duì)象
* @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;
}
/**
* 校驗(yàn)token
* @param token
* @return
* @throws Exception
*/
public static DecodedJWT verifierToken(String token)throws Exception{
//其實(shí)按照規(guī)定只需要傳遞 publicKey 來(lái)校驗(yàn)即可,這可能是auth0 的缺點(diǎn)
Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) getPublicKey(),null);
JWTVerifier verifier = JWT.require(algorithm)
//.withIssuer(ISSUER)
.build(); //Reusable verifier instance 可復(fù)用的驗(yàn)證實(shí)例
DecodedJWT jwt = verifier.verify(token);
return jwt;
}
測(cè)試
@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());
}
}

到此這篇關(guān)于Java jwt使用公鑰字符串驗(yàn)證解析token鎖方法詳解的文章就介紹到這了,更多相關(guān)Java驗(yàn)證解析token鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用IntelliJ IDEA搭建MyBatis-Plus框架并連接MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了如何使用IntelliJ IDEA搭建MyBatis-Plus框架并連接MySQL數(shù)據(jù)庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
Spring Boot與Spring Security的跨域問(wèn)題解決方案
跨域問(wèn)題是指在Web開(kāi)發(fā)中,瀏覽器出于安全考慮,限制了不同域名之間的資源訪問(wèn),本文重點(diǎn)給大家介紹Spring Boot與Spring Security的跨域問(wèn)題解決方案,感興趣的朋友一起看看吧2023-09-09
IDEA 開(kāi)發(fā)多項(xiàng)目依賴的方法(圖文)
這篇文章主要介紹了IDEA 開(kāi)發(fā)多項(xiàng)目依賴的方法(圖文),本文講一下關(guān)于使用IntelliJ IDEA基于Maven創(chuàng)建多模塊項(xiàng)目的實(shí)際開(kāi)發(fā),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
Spring框架基于注解的AOP之各種通知的使用與環(huán)繞通知實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring框架基于注解的AOP之各種通知的使用及其環(huán)繞通知,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-11-11
基于jstree使用JSON數(shù)據(jù)組裝成樹(shù)
這篇文章主要為大家詳細(xì)介紹了基于jstree使用JSON數(shù)據(jù)組裝成樹(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫(kù)存的項(xiàng)目實(shí)踐
在開(kāi)發(fā)中,異步任務(wù)應(yīng)用的場(chǎng)景非常的廣泛,本文主要介紹了SpringBoot異步任務(wù)實(shí)現(xiàn)下單校驗(yàn)庫(kù)存的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09

