如何在Jmeter中使用Java加载公钥?

问题描述 投票:0回答:1

我正在尝试在Jmeter中生成JWT令牌。为了“自动化”它,我编写了一个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

有人会知道怎么了吗?

java jmeter beanshell
1个回答
0
投票

根据Gimby的建议,我已经在命令行中运行了Java应用程序。它给了我一个更清晰的错误消息。

似乎问题是目标intellij JDK和cmd行默认为Java的不同版本。

在IDE目标中,JDK设置为8,在cmd行中默认为14。

© www.soinside.com 2019 - 2024. All rights reserved.