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
> > >
>

Reply via email to