package org.pac4j.jwt.config.signature; import com.nimbusds.jose.*; import com.nimbusds.jose.crypto.MACSigner; import com.nimbusds.jose.crypto.MACVerifier; import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.SignedJWT; import org.pac4j.core.exception.TechnicalException; import org.pac4j.core.util.CommonHelper; /** * HMac signature configuration: http://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-hmac * * @author Jerome Leleu * @since 1.9.2 */ public class SecretSignatureConfiguration extends AbstractSignatureConfiguration { private String secret; public SecretSignatureConfiguration() { algorithm = JWSAlgorithm.HS256; } public SecretSignatureConfiguration(final String secret) { this(); this.secret = secret; } public SecretSignatureConfiguration(final String secret, final JWSAlgorithm algorithm) { this.secret = secret; this.algorithm = algorithm; } @Override protected void internalInit() { CommonHelper.assertNotNull("algorithm", algorithm); CommonHelper.assertNotBlank("secret", secret); if (!supports(this.algorithm)) { throw new TechnicalException("Only the HS256, HS384 and HS512 algorithms are supported for HMac signature"); } } @Override public boolean supports(final JWSAlgorithm algorithm) { return algorithm != null && MACVerifier.SUPPORTED_ALGORITHMS.contains(algorithm); } @Override public SignedJWT sign(final JWTClaimsSet claims) { init(); try { final JWSSigner signer = new MACSigner(this.secret); final SignedJWT signedJWT = new SignedJWT(new JWSHeader(algorithm), claims); signedJWT.sign(signer); return signedJWT; } catch (final JOSEException e) { throw new TechnicalException(e); } } @Override public boolean verify(final SignedJWT jwt) throws JOSEException { init(); final JWSVerifier verifier = new MACVerifier(this.secret); return jwt.verify(verifier); } public String getSecret() { return secret; } public void setSecret(final String secret) { this.secret = secret; } @Override public String toString() { return CommonHelper.toString(this.getClass(), "secret", "[protected]", "algorithm", algorithm); } }