import java.time.Instant import java.time.format.DateTimeFormatter import java.util.UUID import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import org.forgerock.util.encode.Base64 def SECRET = "my-super-secret-key" // 🔐 Replace with real shared secret String computeSignature(String method, String path, String timestamp, String nonce, String body, String secret) { String data = "${method.toUpperCase()}\n${path}\n${timestamp}\n${nonce}\n${body}" SecretKeySpec keySpec = new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256") Mac mac = Mac.getInstance("HmacSHA256") mac.init(keySpec) byte[] hmacBytes = mac.doFinal(data.getBytes("UTF-8")) return Base64.encode(hmacBytes) } def timestamp = DateTimeFormatter.ISO_INSTANT.format(Instant.now()) def nonce = UUID.randomUUID().toString() def method = request.method def path = request.uri.path def body = request.entity?.string ?: "" // Calculate signature def signature = computeSignature(method, path, timestamp, nonce, body, SECRET) // Add headers request.headers.add("X-Timestamp", timestamp) request.headers.add("X-Nonce", nonce) request.headers.add("X-API-Key", "your-key-id") // or use env/config request.headers.add("X-Signature", signature) logger.info("HMAC Signature Added: ${signature}") return next.handle(context, request)