java-jwt通過公鑰字符串驗(yàn)證解析token方式
引言
本文主要示例如何通過已知的公鑰(字符串),來使用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 來校驗(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());
}
}

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼
這篇文章主要介紹了jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
詳解Java如何實(shí)現(xiàn)防止惡意注冊(cè)
Spring系列中的beanFactory與ApplicationContext
Java實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)
SpringBoot中使用Filter和Interceptor的示例代碼
SpringBoot如何使用@Value取配置文件中的map配置

