groovy - 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"));
但我并不完全确定。
解决方案
查看您收到错误的类的JavaDoc,我可以看到它需要 2 个字符串作为参数:
ResourceOwnerPasswordCredentialsGrant(String username, Secret password)
Creates a new resource owner password credentials grant.
所以很可能你正遭受一种Jar Hell形式的痛苦,所以仔细检查你的依赖库版本,如果不匹配会导致 API 冲突和错误,就像你面临的那样。
另请注意,根据 JMeter 最佳实践,您应该始终使用最新版本的 JMeter ,因此请考虑在下次有机会时升级到JMeter 5.3 (或JMeter 下载页面上提供的任何最新版本)
推荐阅读
- java - 通过 java 客户端使用呈现的页面链接
- xslt - 如何使用 XSLT 将字符串分成前后数字的两部分?
- php - 是否有一个 PHP 函数可以遍历关联数组并按公共值/键对其进行分组?
- ruby-on-rails - update_all 似乎不适用于儿童
- azure-web-app-service - 无法在 Web 应用服务的部署中心授权一个驱动器
- scikit-learn - SkikitLearn 学习曲线强烈依赖于 MLPClassifier 的批量大小???或者:如何诊断 NN 的偏差/方差?
- spring - 如何通过@Cacheable 注解记录缓存命中?
- c - 使用 src 代码使用库而不安装它
- jakarta-ee - NullPointerException 从 EntityManagerFactory 创建 EntityManager
- ios - 无法使用 Xcode 10.2 构建