Я пытаюсь сгенерировать токен JWT в Jmeter. Чтобы «автоматизировать» это, я написал класс java, содержащий метод, генерирующий токен. В IntelliJ все работает нормально, и я получаю токен. Поэтому я создал файл jar и включил его в jmeter. Я написал следующий сценарий beanshell.
import com.giro.jwttest.App;
System.out.println("BEANSHELL");
App app = new App();
String token = app.generateToken();
System.out.println(token);
log.info("token: " + token);
Для ясности вот мой java код:
package com.giro.jwttest;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class App
{
private String jwtSubject = "testSubj";
private String jwtIssuer = "Issuer";
private String jwtAudience = "Audience";
private String jksPassword = "123test321";
public PublicKey loadPublicKey(String filename)
throws Exception
{
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Certificate cert = cf.generateCertificate(new FileInputStream(filename));
PublicKey retVal = cert.getPublicKey();
return retVal;
}
public String generateToken() {
System.out.println("generateToken method invoke");
try
{
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
long expMillis = nowMillis + 14400000; //set expiration time to now + 4 hours
Date exp = new Date(expMillis);
HashSet<String> roles = new HashSet<>();
roles.add("Role1");
roles.add("Role2");
Map<String, Object> claims = new HashMap<>();
claims.put("claim_value", "123");
claims.put("avq_roles", roles);
claims.put("surname", "Testuser");
claims.put("givenname", "Test");
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
System.out.println("getting truststore");
ks.load(new FileInputStream("/Users/giro/Desktop/jwttest/keystore/hanbotest.jks"), jksPassword.toCharArray());
System.out.println("after");
Key key = ks.getKey("hanbotest", jksPassword.toCharArray());
System.out.println("after1");
PublicKey publicKey = loadPublicKey("/Users/giro/Desktop/jwttest/keystore/hanbotest.cer");
System.out.println("after2");
String compactJws = io.jsonwebtoken.Jwts.builder()
.setClaims(claims)
.setSubject(jwtSubject)
.setAudience(jwtAudience)
.setExpiration(exp)
.setIssuedAt(now)
.setIssuer(jwtIssuer)
.setNotBefore(now)
.signWith(SignatureAlgorithm.RS512, key)
.compact();
System.out.println(compactJws);
Jws<Claims> x = Jwts.parser().setSigningKey(publicKey).parseClaimsJws(compactJws);
String id = x.getBody().getId();
return compactJws;
}
catch (Exception ex)
{
System.out.println("Exception occurred");
ex.printStackTrace();
}
return null;
}}
Согласно выходным данным jmeter останавливается на строке:
String compactJws = io.jsonwebtoken.Jwts.builder()
.setClaims(claims)
.setSubject(jwtSubject)
.setAudience(jwtAudience)
.setExpiration(exp)
.setIssuedAt(now)
.setIssuer(jwtIssuer)
.setNotBefore(now)
.signWith(SignatureAlgorithm.RS512, key)
.compact();
Сообщение об ошибке в журнале Jmeter:
2020-05-08 09:07:16,734 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import com.giro.jwttest.App; System.out.println("BEANSHE . . . '' : Typed variable declaration : Method Invocation app.generateToken
2020-05-08 09:07:16,734 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import com.giro.jwttest.App; System.out.println("BEANSHE . . . '' : Typed variable declaration : Method Invocation app.generateToken
Кто-нибудь знает, что может быть не так?