Как я могу загрузить ключ publi c с Java в Jmeter? - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь сгенерировать токен 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

Кто-нибудь знает, что может быть не так?

1 Ответ

1 голос
/ 08 мая 2020

Как предложил Гимби, я запустил приложение java в командной строке. Это дало мне более четкое сообщение об ошибке.

Оказалось, что проблема была в другой версии на Java в целевом intellij JDK и строке cmd по умолчанию.

В IDE target JDK был установлен на 8 и в строке cmd по умолчанию было 14.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...