Re: Need to execute javascript using JMeter
Christof Schmalenbach <[email protected]> Thu, 3 Apr 2025 19:49:49 +0200
| Newsgroups | gmane.comp.jakarta.jmeter.user |
|---|---|
| Message-ID | <[email protected]> |
--------------kHFjkd3izx3NMF21KvabCdEU
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: quoted-printable
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 =3D System.getenv("appKey") ?: "defaultKey" def
secret =3D System.getenv("appSecret") ?: "am1ldGVy" def ts =3D
System.currentTimeMillis() def baseString =3D "${key}-2-${ts}" // Decode
the secret from Base64 def secretDecoded =3D Base64.decoder.decode(secret)
// Generate HMAC-SHA256 hash Mac mac =3D Mac.getInstance("HmacSHA256")
mac.init(new SecretKeySpec(secretDecoded, "HmacSHA256")) byte[]
macSignature =3D mac.doFinal(baseString.getBytes("UTF-8")) // Encode the
signature to Base64 and sanitize it def macSignatureBase64 =3D
Base64.encoder.encodeToString(macSignature) .replace("=3D", "")
.replace("+", "-") .replace("/", "_") // Simulated environment variable
storage (Postman equivalent) def environment =3D [:] // A map to mimic
Postman environment variables environment["signature"] =3D
macSignatureBase64 environment["timestamp"] =3D ts // Debug output println
"Signature: ${macSignatureBase64}" println "Timestamp: ${ts}"
On 4/3/25 16:32, Abhitosh Patil wrote:
> Javascript:
>
> var key =3D pm.environment.get('appKey);
>
> var secret =3D pm.environment.get('appSecret);
>
> var ts =3D (new Date()).getTime());
> var baseString =3D key + "-" + "2" + "-" + ts;
>
> var words =3D CryptoJS. enc.Base64.parse(secret);
>
> vaz macSignature =3D CryptoJS. HmacSHA256 (CryptoJS. enc. Utf8.parse
> (baseString), words);
>
> var macSignatureBase64 =3D macSignature.toString (CryptoJS. enc.Base64);
>
> macSignatureBase64 =3D macSignatureBase64.replace(/=3D/g, "");
>
> mac SignatureBase64 =3D macSignatureBase64.replace(/\+/g, "-");
>
> macSignatureBase64 =3D macSignatureBase64.replace(/\//g, "_");
>
> postman.setEnvironmentVariable("signature", macSignatureBase64);
>
> postman, setEnvironmentVariable("timestamp", ts);
>
> On Thu, 3 Apr, 2025, 5:12 pm Christof,<[email protected]>
> 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. Otherwi=
se
>> I will give it a chance.
>>
>> Christof
>>
>>
>>
>> Am 3. April 2025 09:02:36 UTC schrieb Abhitosh Patil <
>> [email protected]>:
>>> Unfortunately ChatGPT or other AI tools are not allowed in our
>> organisation
>>> network.
>>>
>>> On Wed, 2 Apr, 2025, 9:04 pm Abhitosh Patil,<[email protected]>
>> wrote:
>>>> Thank you Chris.
>>>> I'll check this possibility.
>>>>
>>>> On Wed, 2 Apr, 2025, 9:03 pm Christof,<[email protected]=
>
>>>> 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 wit=
h
>> 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 <
>>>>> [email protected]>:
>>>>>> Initially I was using Java 17 but later switched to java 8
>>>>>> Currently getting error like "javax.script.scriptExecution: referen=
ce
>>>>>> 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,<[email protected]> 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< http=
s://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 ca=
n
>> be
>>>>>>> compiled and cached and it matters especially for "heavy" tasks li=
ke
>>>>>>> cryptography. More information: Apache Groovy: What Is Groovy Used
>>>>> For?<
>>>>>>> https://www.blazemeter.com/blog/apache-groovy>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ________________________________
>>>>>>> From: Abhitosh Patil<[email protected]>
>>>>>>> Sent: Wednesday, April 2, 2025 5:14 PM
>>>>>>> To: JMeter Users List<[email protected]>
>>>>>>> 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?
>>>>>>>
--------------kHFjkd3izx3NMF21KvabCdEU--