use of com.nimbusds.jwt.SignedJWT in project pac4j by pac4j.
the class JwtAuthenticator method validate.
@Override
public void validate(final TokenCredentials credentials, final WebContext context) {
init();
final String token = credentials.getToken();
if (context != null) {
// set the www-authenticate in case of error
context.setResponseHeader(HttpConstants.AUTHENTICATE_HEADER, "Bearer realm=\"" + realmName + "\"");
}
try {
// Parse the token
JWT jwt = JWTParser.parse(token);
if (jwt instanceof PlainJWT) {
if (signatureConfigurations.isEmpty()) {
logger.debug("JWT is not signed and no signature configurations -> verified");
} else {
throw new CredentialsException("A non-signed JWT cannot be accepted as signature configurations have been defined");
}
} else {
SignedJWT signedJWT = null;
if (jwt instanceof SignedJWT) {
signedJWT = (SignedJWT) jwt;
}
// encrypted?
if (jwt instanceof EncryptedJWT) {
logger.debug("JWT is encrypted");
final EncryptedJWT encryptedJWT = (EncryptedJWT) jwt;
boolean found = false;
final JWEHeader header = encryptedJWT.getHeader();
final JWEAlgorithm algorithm = header.getAlgorithm();
final EncryptionMethod method = header.getEncryptionMethod();
for (final EncryptionConfiguration config : encryptionConfigurations) {
if (config.supports(algorithm, method)) {
logger.debug("Using encryption configuration: {}", config);
try {
config.decrypt(encryptedJWT);
signedJWT = encryptedJWT.getPayload().toSignedJWT();
if (signedJWT != null) {
jwt = signedJWT;
}
found = true;
break;
} catch (final JOSEException e) {
logger.debug("Decryption fails with encryption configuration: {}, passing to the next one", config);
}
}
}
if (!found) {
throw new CredentialsException("No encryption algorithm found for JWT: " + token);
}
}
// signed?
if (signedJWT != null) {
logger.debug("JWT is signed");
boolean verified = false;
boolean found = false;
final JWSAlgorithm algorithm = signedJWT.getHeader().getAlgorithm();
for (final SignatureConfiguration config : signatureConfigurations) {
if (config.supports(algorithm)) {
logger.debug("Using signature configuration: {}", config);
try {
verified = config.verify(signedJWT);
found = true;
if (verified) {
break;
}
} catch (final JOSEException e) {
logger.debug("Verification fails with signature configuration: {}, passing to the next one", config);
}
}
}
if (!found) {
throw new CredentialsException("No signature algorithm found for JWT: " + token);
}
if (!verified) {
throw new CredentialsException("JWT verification failed: " + token);
}
}
}
createJwtProfile(credentials, jwt);
} catch (final ParseException e) {
throw new CredentialsException("Cannot decrypt / verify JWT", e);
}
}
use of com.nimbusds.jwt.SignedJWT in project pac4j by pac4j.
the class ECSignatureConfigurationTests method testSignVerify.
@Test
public void testSignVerify() throws JOSEException {
final ECSignatureConfiguration config = new ECSignatureConfiguration(buildKeyPair());
final JWTClaimsSet claims = new JWTClaimsSet.Builder().subject(VALUE).build();
final SignedJWT signedJwt = config.sign(claims);
assertTrue(config.verify(signedJwt));
}
use of com.nimbusds.jwt.SignedJWT in project pac4j by pac4j.
the class RSASignatureConfigurationTests method testMissingPublicKey.
@Test
public void testMissingPublicKey() {
final RSASignatureConfiguration config = new RSASignatureConfiguration();
config.setPrivateKey((RSAPrivateKey) buildKeyPair().getPrivate());
final SignedJWT signedJWT = config.sign(buildClaims());
TestsHelper.expectException(() -> config.verify(signedJWT), TechnicalException.class, "publicKey cannot be null");
}
use of com.nimbusds.jwt.SignedJWT in project pac4j by pac4j.
the class RSASignatureConfigurationTests method testSignVerify.
@Test
public void testSignVerify() throws JOSEException {
final RSASignatureConfiguration config = new RSASignatureConfiguration(buildKeyPair());
final JWTClaimsSet claims = new JWTClaimsSet.Builder().subject(VALUE).build();
final SignedJWT signedJwt = config.sign(claims);
assertTrue(config.verify(signedJwt));
}
use of com.nimbusds.jwt.SignedJWT in project pac4j by pac4j.
the class SecretSignatureConfigurationTests method testSignVerifyBase64.
@Test
public void testSignVerifyBase64() throws JOSEException {
SecretSignatureConfiguration config = new SecretSignatureConfiguration();
config.setSecretBase64(BASE64_512_BIT_SIG_SECRET);
final JWTClaimsSet claims = new JWTClaimsSet.Builder().subject(VALUE).build();
final SignedJWT signedJwt = config.sign(claims);
assertTrue(config.verify(signedJwt));
}
Aggregations