首页 > 解决方案 > Jmeter Groovy 在使用 MSAL4J 时报告 NoSuchMethodError: ResourceOwnerPasswordCredentialsGrant

问题描述

我正在尝试使用Microsoft Authentication Library for Java使用用户名和密码重新创建用户身份验证,因为我们需要向许多租户中的新应用程序授予管理员许可。

为此,我在 Groovy 2.4.16 中添加了一个JSR233 采样器,因此我可以创建一个脚本来使用 msal4j。脚本如下所示:

import com.microsoft.aad.msal4j.*;
import com.nimbusds.oauth2.sdk.*;
//import java.util.concurrent.*;

Set<String> scope = Collections.singleton(Arrays.asList("openid","profile","email", "offline_access"));
String username = vars.get("USER");
String password = vars.get("PASSWORD");

//log.info("USER: " + username);
//log.info("PASSWORD: " + password);
log.info("SCOPE: " + scope);
log.info("CLIENT: " + vars.get("CLIENT"));

UserNamePasswordParameters parameters =
     UserNamePasswordParameters
        .builder(scope, username, password.toCharArray())
        .build();

PublicClientApplication pca = 
    PublicClientApplication.builder(vars.get("CLIENT"))
        .authority("https://login.microsoftonline.com/" + vars.get("TENANT"))
        .build();             

IAuthenticationResult result = pca.acquireToken(parameters).join();

但是,在测试采样器时,我收到以下错误:

ERROR o.a.j.JMeter: Uncaught exception in thread Thread[Thread Group 1-1,6,main]
java.lang.NoSuchMethodError: com.nimbusds.oauth2.sdk.ResourceOwnerPasswordCredentialsGrant.<init>(Ljava/lang/String;Lcom/nimbusds/oauth2/sdk/auth/Secret;)V
    at com.microsoft.aad.msal4j.UserNamePasswordRequest.createAuthenticationGrant(UserNamePasswordRequest.java:22) ~[msal4j-1.8.0.jar:1.8.0]
    at com.microsoft.aad.msal4j.UserNamePasswordRequest.<init>(UserNamePasswordRequest.java:14) ~[msal4j-1.8.0.jar:1.8.0]
    at com.microsoft.aad.msal4j.PublicClientApplication.acquireToken(PublicClientApplication.java:35) ~[msal4j-1.8.0.jar:1.8.0]
    at com.microsoft.aad.msal4j.IPublicClientApplication$acquireToken.call(Unknown Source) ~[?:?]
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) ~[groovy-all-2.4.16.jar:2.4.16]
    at Script29.run(Script29.groovy:24) ~[?:?]
    at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:321) ~[groovy-all-2.4.16.jar:2.4.16]
    at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:72) ~[groovy-all-2.4.16.jar:2.4.16]
    at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_271]
    at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:223) ~[ApacheJMeter_core.jar:5.2.1]
    at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:71) ~[ApacheJMeter_java.jar:5.2.1]
    at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:627) ~[ApacheJMeter_core.jar:?]
    at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:551) ~[ApacheJMeter_core.jar:?]
    at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:490) ~[ApacheJMeter_core.jar:?]
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:257) ~[ApacheJMeter_core.jar:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_271]

我认为问题可能在于范围的定义:Set<String> scope = Collections.singleton(Arrays.asList("openid","profile","email", "offline_access"));但我并不完全确定。

标签: groovyjmetermsal

解决方案


查看您收到错误的类的JavaDoc,我可以看到它需要 2 个字符串作为参数:

ResourceOwnerPasswordCredentialsGrant​(String username, Secret password)    
Creates a new resource owner password credentials grant.

所以很可能你正遭受一种Jar Hell形式的痛苦,所以仔细检查你的依赖库版本,如果不匹配会导致 API 冲突和错误,就像你面临的那样。

另请注意,根据 JMeter 最佳实践,您应该始终使用最新版本的 JMeter ,因此请考虑在下次有机会时升级到JMeter 5.3 (或JMeter 下载页面上提供的任何最新版本)


推荐阅读