I passed environment variables like this in user defined variables: ${__BeanShell(System.getenv,appKey)} ${__BeanShell(System.getenv,appSecret)}
Now the JSR223 sampler has 200 OK response. But where can I see the signature value? Response is blank in the view results tree. [image: image.png] On Fri, Apr 4, 2025 at 2:06 AM schmalenb...@acm.org < c.schmalenb...@perfomatics.com> wrote: > sorry, I made a copy paste error, once again a fixed code snippet:... > and an additional information: you must provide the appKey and the > appSecret as an environment variable from outside. > that means that you have to export those variables in the terminla from > which you start your jmeter session, or as usual in an encapsulating shell > script > > // here the code... > import javax.crypto.Mac > import javax.crypto.spec.SecretKeySpec > import java.util.Base64 > > // Retrieve environment variables (using System.getenv as an example) > def key = System.getenv("appKey") ?: "defaultKey" > def secret = System.getenv("appSecret") ?: "am1ldGVy" > > def ts = System.currentTimeMillis() > def baseString = "${key}-2-${ts}" > > // Decode the secret from Base64 > def secretDecoded = Base64.decoder.decode(secret) > > // Generate HMAC-SHA256 hash > Mac mac = Mac.getInstance("HmacSHA256") > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) > byte[] macSignature = mac.doFinal(baseString.getBytes("UTF-8")) > > // Encode the signature to Base64 and sanitize it > def macSignatureBase64 = Base64.encoder.encodeToString(macSignature) > .replace("=", "") > .replace("+", "-") > .replace("/", "_") > > // Simulated environment variable storage (Postman equivalent) > def environment = [:] // A map to mimic Postman environment variables > environment["signature"] = macSignatureBase64 > environment["timestamp"] = ts > > // put the result in jmeter vars > vars.put("signature",macSignatureBase64) > vars.put("timestamp","" + ts) > > // Debug output > println "Signature: ${macSignatureBase64}" > println "Timestamp: ${ts}" > > > Abhitosh Patil <abhitosh...@gmail.com> hat am 03.04.2025 21:15 CEST > geschrieben: > > > > > > Hi Chriss, > > Hi executed below Groovy code with JSR223 sampler and got an error for > that. > > > > Code: > > import javax.crypto.Mac > > import javax.crypto.spec.SecretKeySpec > > import java.util.Base64 > > > > // Retrieve environment variables (using System.getenv as an example) > > def key = System.getenv("d552a1b3-3558-3c47-b34a-1ba87558b74b") ?: > "defaultKey" > > def secret = > System.getenv("vz7noe5z17i2usV58oFR5YMtU1BUFL0Ah9+eXuwV6IQ=") ?: "am1ldGVy" > > def ts = System.currentTimeMillis() > > def baseString = "${key}-2-${ts}" > > > > // Decode the secret from Base64 > > def secretDecoded = Base64.decoder.decode(secret) > > > > // Generate HMAC-SHA256 hash > > Mac mac = Mac.getInstance("HmacSHA256") > > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) > > byte[] macSignature = mac.doFinal(baseString.getBytes("UTF-8")) > > > > // Encode the signature to Base64 and sanitize it > > def macSignatureBase64 = Base64.encoder.encodeToString(macSignature) > > .replace("=", "")import javax.crypto.Mac > > import javax.crypto.spec.SecretKeySpec > > import java.util.Base64 > > > > // Retrieve environment variables (using System.getenv as an example) > > def key = System.getenv("appKey") ?: "defaultKey" > > def secret = System.getenv("appSecret") ?: "am1ldGVy" > > > > def ts = System.currentTimeMillis() > > def baseString = "${key}-2-${ts}" > > > > // Decode the secret from Base64 > > def secretDecoded = Base64.decoder.decode(secret) > > > > // Generate HMAC-SHA256 hash > > Mac mac = Mac.getInstance("HmacSHA256") > > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) > > byte[] macSignature = mac.doFinal(baseString.getBytes("UTF-8")) > > > > // Encode the signature to Base64 and sanitize it > > def macSignatureBase64 = Base64.encoder.encodeToString(macSignature) > > .replace("=", "") > > .replace("+", "-") > > .replace("/", "_") > > > > // Simulated environment variable storage (Postman equivalent) > > def environment = [:] // A map to mimic Postman environment variables > > environment["signature"] = macSignatureBase64 > > environment["timestamp"] = ts > > > > // put the result in jmeter vars > > vars.put("signature",macSignatureBase64) > > vars.put("timestamp","" + ts) > > > > // Debug output > > println "Signature: ${macSignatureBase64}" > > println "Timestamp: ${ts}" > > > > Getting this error: > > > > > > On Thu, Apr 3, 2025 at 11:30 PM Christof Schmalenbach < > c.schmalenb...@perfomatics.com> wrote: > > > I see that my last mail was not well formatted; here another trial... > > > > > > import javax.crypto.Mac > > > import javax.crypto.spec.SecretKeySpec > > > import java.util.Base64 > > > > > > // Retrieve environment variables (using System.getenv as an example) > > > def key = System.getenv("appKey") ?: "defaultKey" > > > def secret = System.getenv("appSecret") ?: "am1ldGVy" > > > > > > def ts = System.currentTimeMillis() > > > def baseString = "${key}-2-${ts}" > > > > > > // Decode the secret from Base64 > > > def secretDecoded = Base64.decoder.decode(secret) > > > > > > // Generate HMAC-SHA256 hash > > > Mac mac = Mac.getInstance("HmacSHA256") > > > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) > > > byte[] macSignature = mac.doFinal(baseString.getBytes("UTF-8")) > > > > > > // Encode the signature to Base64 and sanitize it > > > def macSignatureBase64 = Base64.encoder.encodeToString(macSignature) > > > .replace("=", "")import javax.crypto.Mac > > > import javax.crypto.spec.SecretKeySpec > > > import java.util.Base64 > > > > > > // Retrieve environment variables (using System.getenv as an example) > > > def key = System.getenv("appKey") ?: "defaultKey" > > > def secret = System.getenv("appSecret") ?: "am1ldGVy" > > > > > > def ts = System.currentTimeMillis() > > > def baseString = "${key}-2-${ts}" > > > > > > // Decode the secret from Base64 > > > def secretDecoded = Base64.decoder.decode(secret) > > > > > > // Generate HMAC-SHA256 hash > > > Mac mac = Mac.getInstance("HmacSHA256") > > > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) > > > byte[] macSignature = mac.doFinal(baseString.getBytes("UTF-8")) > > > > > > // Encode the signature to Base64 and sanitize it > > > def macSignatureBase64 = Base64.encoder.encodeToString(macSignature) > > > .replace("=", "") > > > .replace("+", "-") > > > .replace("/", "_") > > > > > > // Simulated environment variable storage (Postman equivalent) > > > def environment = [:] // A map to mimic Postman environment variables > > > environment["signature"] = macSignatureBase64 > > > environment["timestamp"] = ts > > > > > > // put the result in jmeter vars > > > vars.put("signature",macSignatureBase64) > > > vars.put("timestamp","" + ts) > > > > > > // Debug output > > > println "Signature: ${macSignatureBase64}" > > > println "Timestamp: ${ts}" > > > > > > .replace("+", "-") > > > .replace("/", "_") > > > > > > // Simulated environment variable storage (Postman equivalent) > > > def environment = [:] // A map to mimic Postman environment variables > > > environment["signature"] = macSignatureBase64 > > > environment["timestamp"] = ts > > > > > > // put the result in jmeter vars > > > vars.put("signature",macSignatureBase64) > > > vars.put("timestamp","" + ts) > > > > > > // Debug output > > > println "Signature: ${macSignatureBase64}" > > > println "Timestamp: ${ts}" > > > > > > > > > On 4/3/25 19:49, Christof Schmalenbach wrote: > > > > Hi Abhitosh, > > > > I'm not sure, whether I understand your js code completely. > > > > But I got at least an idea. This is the result of my code migration. > > > > I test the code in a jmeter script within a jsr223 sampler and it > seems > > > > to work. > > > > (OpenJDK version 19.X; may be that in java version 8.X not all > packages > > > > used are supported???) > > > > > > > > regards > > > > Christof > > > > > > > > import javax.crypto.Mac import javax.crypto.spec.SecretKeySpec import > > > > java.util.Base64 // Retrieve environment variables (using > System.getenv > > > > as an example) def key = System.getenv("appKey") ?: "defaultKey" def > > > > secret = System.getenv("appSecret") ?: "am1ldGVy" def ts = > > > > System.currentTimeMillis() def baseString = "${key}-2-${ts}" // > Decode > > > > the secret from Base64 def secretDecoded = > Base64.decoder.decode(secret) > > > > // Generate HMAC-SHA256 hash Mac mac = Mac.getInstance("HmacSHA256") > > > > mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) byte[] > > > > macSignature = mac.doFinal(baseString.getBytes("UTF-8")) // Encode > the > > > > signature to Base64 and sanitize it def macSignatureBase64 = > > > > Base64.encoder.encodeToString(macSignature) .replace("=", "") > > > > .replace("+", "-") .replace("/", "_") // Simulated environment > variable > > > > storage (Postman equivalent) def environment = [:] // A map to mimic > > > > Postman environment variables environment["signature"] = > > > > macSignatureBase64 environment["timestamp"] = ts // Debug output > println > > > > "Signature: ${macSignatureBase64}" println "Timestamp: ${ts}" > > > > > > > > > > > > > > > > On 4/3/25 16:32, Abhitosh Patil wrote: > > > >> Javascript: > > > >> > > > >> var key = pm.environment.get('appKey); > > > >> > > > >> var secret = pm.environment.get('appSecret); > > > >> > > > >> var ts = (new Date()).getTime()); > > > >> var baseString = key + "-" + "2" + "-" + ts; > > > >> > > > >> var words = CryptoJS. enc.Base64.parse(secret); > > > >> > > > >> vaz macSignature = CryptoJS. HmacSHA256 (CryptoJS. enc. Utf8.parse > > > >> (baseString), words); > > > >> > > > >> var macSignatureBase64 = macSignature.toString (CryptoJS. > enc.Base64); > > > >> > > > >> macSignatureBase64 = macSignatureBase64.replace(/=/g, ""); > > > >> > > > >> mac SignatureBase64 = macSignatureBase64.replace(/\+/g, "-"); > > > >> > > > >> macSignatureBase64 = macSignatureBase64.replace(/\//g, "_"); > > > >> > > > >> postman.setEnvironmentVariable("signature", macSignatureBase64); > > > >> > > > >> postman, setEnvironmentVariable("timestamp", ts); > > > >> > > > >> On Thu, 3 Apr, 2025, 5:12 pm Christof,< > c.schmalenb...@perfomatics.com> > > > >> wrote: > > > >> > > > >>> Hi Abhitosh, > > > >>> is the javascript script small in size? > > > >>> If so you could remove or replace with dummies all hardcoded > security > > > >>> related parts and attach the script in this channel. > > > >>> May be , that someone will take the challenge and migrate it to > > > >>> groovy . > > > >>> It it is 100 lines or more I will not have the time to do that. > > > >>> Otherwise > > > >>> I will give it a chance. > > > >>> > > > >>> Christof > > > >>> > > > >>> > > > >>> > > > >>> Am 3. April 2025 09:02:36 UTC schrieb Abhitosh Patil < > > > >>> abhitosh...@gmail.com>: > > > >>>> Unfortunately ChatGPT or other AI tools are not allowed in our > > > >>> organisation > > > >>>> network. > > > >>>> > > > >>>> On Wed, 2 Apr, 2025, 9:04 pm Abhitosh Patil,< > abhitosh...@gmail.com> > > > >>> wrote: > > > >>>>> Thank you Chris. > > > >>>>> I'll check this possibility. > > > >>>>> > > > >>>>> On Wed, 2 Apr, 2025, 9:03 pm > > > >>>>> Christof,<c.schmalenb...@perfomatics.com> > > > >>>>> wrote: > > > >>>>> > > > >>>>>> Hi Abhitosh, > > > >>>>>> groovy is one of the supported languages in jsr223 sampler. If > your > > > >>>>>> javascript has not thousand codelines, I'm very optimistic, that > > > >>>>>> with > > > >>> the > > > >>>>>> help of chatGPT you should be able to migrate your code > > > >>>>>> from js -> groovy. > > > >>>>>> regards > > > >>>>>> Christof > > > >>>>>> > > > >>>>>> > > > >>>>>> Am 2. April 2025 14:49:15 UTC schrieb Abhitosh Patil < > > > >>>>>> abhitosh...@gmail.com>: > > > >>>>>>> Initially I was using Java 17 but later switched to java 8 > > > >>>>>>> Currently getting error like "javax.script.scriptExecution: > > > >>>>>>> reference > > > >>>>>>> error: pm is not defined. > > > >>>>>>> > > > >>>>>>> Rhino or Graalvm are not available on our company download > portal. > > > >>>>>>> > > > >>>>>>> I don't know anything about Groovy. > > > >>>>>>> > > > >>>>>>> On Wed, 2 Apr, 2025, 8:10 pm Dmitri T,<glin...@live.com> > wrote: > > > >>>>>>> > > > >>>>>>>> 1. > > > >>>>>>>> You answered your own question: JavaScript code cannot be run > in > > > >>>>>> JMeter. > > > >>>>>>>> > > > >>>>>>>> 1. > > > >>>>>>>> Also, if you're on Java 15+ you won't be able able to choose > > > >>>>>> JavaScript > > > >>>>>>>> in JSR223 test elements because it has been removed from JDK< > > > >>>>>>>> https://openjdk.org/jeps/372> > > > >>>>>>>> 2. > > > >>>>>>>> There could be inconsistencies between Postman JavaScript API > and > > > >>>>>> JMeter > > > >>>>>>>> so you won't have access to pm. namespace in JMeter > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> So you either need to restore JavaScript engine by adding > Mozilla > > > >>>>>> Rhino< > > > >>>>>>>> https://github.com/mozilla/rhino> or switching to GraalVM< > > > >>>>>>>> https://www.graalvm.org/> or re-write your code in Groovy. > The > > > >>> latter > > > >>>>>>>> option is better from performance perspective as Groovy > scripts > > > >>>>>>>> can > > > >>> be > > > >>>>>>>> compiled and cached and it matters especially for "heavy" > tasks > > > >>>>>>>> like > > > >>>>>>>> cryptography. More information: Apache Groovy: What Is Groovy > Used > > > >>>>>> For?< > > > >>>>>>>> https://www.blazemeter.com/blog/apache-groovy> > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> > > > >>>>>>>> ________________________________ > > > >>>>>>>> From: Abhitosh Patil<abhitosh...@gmail.com> > > > >>>>>>>> Sent: Wednesday, April 2, 2025 5:14 PM > > > >>>>>>>> To: JMeter Users List<user@jmeter.apache.org> > > > >>>>>>>> Subject: Need to execute javascript using JMeter > > > >>>>>>>> > > > >>>>>>>> We have a requirement to generate unique authentication > > > >>>>>>>> signature to > > > >>>>>> pass > > > >>>>>>>> as a header in API request. We have a pre-request javascript > for > > > >>> same > > > >>>>>> in > > > >>>>>>>> postman tool. > > > >>>>>>>> > > > >>>>>>>> Same javascript we tried in JMeter using jsr223 and beanshell > > > >>>>>> elements. But > > > >>>>>>>> it's not working. Any solution for this? > > > >>>>>>>> > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: user-unsubscr...@jmeter.apache.org > > > For additional commands, e-mail: user-h...@jmeter.apache.org > > > >