
import com.sap.gateway.ip.core.customdev.util.Message;
import java.util.HashMap;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
def Message processData(Message message) {
//Properties
map = message.getProperties();
def clientSecret = map.get("clientSecret");
def clientId = map.get("clientId");
//convert Hex String to Byte array
def clientSecretBlob = hexStringToByteArray(clientSecret);
// Prepare JWT Header
def jwtHeader = JWTHeader()
// Prepare JWT JWTClaim
def jwtClaim = JWTClaim()
// Concat JWT Header and JWT Claim
def unsignedToken= "${jwtHeader}" + "." + "${jwtClaim}";
//JWT Signature
def hash = hmac_sha256(clientSecretBlob, unsignedToken)
signature = hash.encodeBase64().toString().replaceAll("\n","").replaceAll("\\+","-").replaceAll("/", "_").replaceAll("\\=","");
//Headers
def content = "application/json";
message.setHeader("Content-Type", content);
message.setHeader("api-version", 2);
message.setHeader("jwt", unsignedToken + "." + signature);
return message;
}
def JWTHeader() {
def jwtHeader = """
{"alg":"HS256","typ":"JWT"}
"""
def jwtHeader_str = Base64.encodeBase64URLSafeString(jwtHeader.replaceAll("\\s","").getBytes("UTF-8"));
return jwtHeader_str;
}
def JWTClaim() {
def iat = (int)(new Date().getTime() / 1000);
def exp = (int)((new Date().getTime() / 1000) + 30);
def nbf = (int)(new Date().getTime() / 1000);
def iss = map.get("clientId");
def method = map.get("method");
def path = map.get("path");
def host = map.get("host");
def request_id = UUID.randomUUID().toString();
def region = map.get("region");
def jwtClaim = """
{"exp":${exp},"iat":${iat},"nbf":${nbf},"iss":"${iss}","method":"${method}","path":"${path}","host":"${host}","request_id":"${request_id}","region":"${region}"}
"""
def jwtClaim_str = Base64.encodeBase64URLSafeString(jwtClaim.replaceAll("\n","").replaceAll("\\\\","/").getBytes("UTF-8"));
return jwtClaim_str;
}
def hexStringToByteArray(String s){
def len = (int) s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
int j = i / 2;
String byte_hex = s.substring(i, i + 2);
try {
int byte_value = Integer.parseInt(byte_hex, 16);
data[j] = (byte) byte_value;
} catch (NumberFormatException error) {
throw new IllegalArgumentException("Bad hex byte value " + byte_hex);
}
}
return data;
}
def hmac_sha256(secretKey, String data) {
try {
Mac mac = Mac.getInstance("HmacSHA256")
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "HmacSHA256")
mac.init(secretKeySpec)
byte[] digest = mac.doFinal(data.getBytes())
return digest
} catch (InvalidKeyException e) {
throw new RuntimeException("Invalid key exception while converting to HMac SHA256")
}
}
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
19 | |
19 | |
9 | |
9 | |
7 | |
7 | |
5 | |
5 | |
5 | |
5 |