|
17 | 17 | import com.fasterxml.jackson.core.JsonProcessingException; |
18 | 18 | import com.nimbusds.jose.JOSEException; |
19 | 19 | import com.nimbusds.jose.JWSVerifier; |
| 20 | +import com.nimbusds.jose.JWSAlgorithm; |
| 21 | +import com.nimbusds.jose.crypto.ECDSAVerifier; |
20 | 22 | import com.nimbusds.jose.crypto.RSASSAVerifier; |
21 | 23 | import com.nimbusds.jwt.JWTClaimsSet; |
22 | 24 | import com.nimbusds.jwt.SignedJWT; |
|
41 | 43 | import java.security.cert.CertificateException; |
42 | 44 | import java.security.cert.CertificateFactory; |
43 | 45 | import java.security.cert.X509Certificate; |
| 46 | +import java.security.PublicKey; |
44 | 47 | import java.security.interfaces.RSAPublicKey; |
| 48 | +import java.security.interfaces.ECPublicKey; |
45 | 49 | import java.text.ParseException; |
46 | 50 | import java.util.Date; |
47 | 51 | import java.util.LinkedHashMap; |
@@ -81,8 +85,22 @@ public User parseJwtToken(String token) { |
81 | 85 | try { |
82 | 86 | CertificateFactory cf = CertificateFactory.getInstance("X.509"); |
83 | 87 | X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(config.certificate.getBytes())); |
84 | | - RSAPublicKey publicKey = (RSAPublicKey) cert.getPublicKey(); |
85 | | - JWSVerifier verifier = new RSASSAVerifier(publicKey); |
| 88 | + PublicKey publicKey = cert.getPublicKey(); |
| 89 | + JWSAlgorithm alg = parseJwt.getHeader().getAlgorithm(); |
| 90 | + JWSVerifier verifier; |
| 91 | + if (JWSAlgorithm.Family.RSA.contains(alg)) { |
| 92 | + if (!(publicKey instanceof RSAPublicKey)) { |
| 93 | + throw new AuthException("Public key type mismatch for RSA algorithm."); |
| 94 | + } |
| 95 | + verifier = new RSASSAVerifier((RSAPublicKey) publicKey); |
| 96 | + } else if (JWSAlgorithm.Family.EC.contains(alg)) { |
| 97 | + if (!(publicKey instanceof ECPublicKey)) { |
| 98 | + throw new AuthException("Public key type mismatch for EC algorithm."); |
| 99 | + } |
| 100 | + verifier = new ECDSAVerifier((ECPublicKey) publicKey); |
| 101 | + } else { |
| 102 | + throw new AuthException("Unsupported jwt algorithm: " + alg.getName()); |
| 103 | + } |
86 | 104 | boolean verify = parseJwt.verify(verifier); |
87 | 105 | if (!verify) { |
88 | 106 | throw new AuthException("Cannot verify signature."); |
|
0 commit comments