Java 如何使用MSAL4J为守护程序获取令牌?
我有一个用Java编写并在AWS上运行的守护进程。 它使用基于客户端Id、客户端机密和租户Id的令牌调用多个Microsoft API,这些令牌用于我支持的100个用户帐户中的每个帐户。使用MS Azure Active Directory Library for Java(ADAL4J)时,所有这些都可以正常工作。但这就要结束了,所以我不得不转到MS Java身份验证库(MSAL4J) 基本上,我需要使用客户端id、secret和租户来获取MS API所需的accessToken 在反复阅读示例(其中许多是编译的)之后,这似乎是我能找到的最接近的代码:Java 如何使用MSAL4J为守护程序获取令牌?,java,msal,adal4j,Java,Msal,Adal4j,我有一个用Java编写并在AWS上运行的守护进程。 它使用基于客户端Id、客户端机密和租户Id的令牌调用多个Microsoft API,这些令牌用于我支持的100个用户帐户中的每个帐户。使用MS Azure Active Directory Library for Java(ADAL4J)时,所有这些都可以正常工作。但这就要结束了,所以我不得不转到MS Java身份验证库(MSAL4J) 基本上,我需要使用客户端id、secret和租户来获取MS API所需的accessToken 在反复阅读示
public static String getToken( String apiUrl,
String clientId,
String clientSecret,
String tenantId,
String authUrl ) {
String token = null ;
if ( !authUrl.endsWith("/")){
authUrl = authUrl + "/" ;
}
/*
NOTE: This is derived from the following:
https://docs.microsoft.com/en-us/azure/active-directory/develop/scenario-desktop-acquire-token?tabs=java
I simplified the code by taking out the SilentParameters support.
*/
// BAD: authUrl = authUrl + "organizations/";
// BAD: authUrl = "https://login.microsoftonline.com/" + tenantId + "/";
// BAD: authUrl = "https://login.microsoftonline.com/organizations/";
authUrl = "https://login.microsoftonline.com/organizations/" + tenantId + "/" ;
// BAD: Set<String> SCOPE = Collections.singleton("https://graph.microsoft.com/.default");
// BAD: Set<String> scope = Collections.singleton(clientId);
Set<String> scope = Collections.singleton("");
// Load token cache from file and initialize token cache aspect. The token cache will have
// dummy data, so the acquireTokenSilently call will fail.
ITokenCacheAccessAspect tokenCacheAspect = new TokenPersistence("");
PublicClientApplication pca;
try {
pca = PublicClientApplication
.builder(clientId)
.authority(authUrl)
.setTokenCacheAccessAspect(tokenCacheAspect)
.build();
} catch (MalformedURLException e) {
return null ;
}
IAuthenticationResult result;
/*
BAD: ClientCredentialParameters parameters =
BAD: ClientCredentialParameters
BAD: .builder(SCOPE)
BAD: .build();
*/
UserNamePasswordParameters parameters =
UserNamePasswordParameters
.builder(scope, clientId, clientSecret.toCharArray())
.build();
result = pca.acquireToken(parameters).join();
token = result.accessToken() ;
return token ;
}
上面是在acquireToken调用上生成的(靠近底部)
我不知道什么代码需要一个默认构造函数(让JSON满意)。
奥托,我不知道我是否应该打这些电话;似乎有大约47种不同的方式通过和围绕这个MSAL的东西,我根本不确定我是否找到了“正确的道路”
帮帮我,欧比-万·克诺比。你是我唯一的希望签出ms identity java守护程序示例: 签出ms identity java守护程序示例: 尝试根本不使用
TokenCacheAccessAspect
,看看这是否有效?例如:
IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
ConfidentialClientApplication cca = ConfidentialClientApplication.builder(clientId, credential)
.authority(authUrl)
.build();
Set<String> scope = ImmutableSet.of();
ClientCredentialParameters parameters =
ClientCredentialParameters.builder(scope)
.build();
result = cca.acquireToken(parameters).join();
IClientCredential credential=ClientCredentialFactory.createFromSecret(clientSecret);
机密ClientApplication cca=机密ClientApplication.builder(客户端ID,凭证)
.authority(authUrl)
.build();
Set scope=ImmutableSet.of();
ClientCredentialParameters参数=
ClientCredentialParameters.builder(范围)
.build();
结果=cca.acquireToken(参数).join();
其中authUrl
应类似于https://login.microsoftonline.com/
请参阅:尝试根本不使用
TokenCacheAccessAspect
,看看这是否有效?例如:
IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
ConfidentialClientApplication cca = ConfidentialClientApplication.builder(clientId, credential)
.authority(authUrl)
.build();
Set<String> scope = ImmutableSet.of();
ClientCredentialParameters parameters =
ClientCredentialParameters.builder(scope)
.build();
result = cca.acquireToken(parameters).join();
IClientCredential credential=ClientCredentialFactory.createFromSecret(clientSecret);
机密ClientApplication cca=机密ClientApplication.builder(客户端ID,凭证)
.authority(authUrl)
.build();
Set scope=ImmutableSet.of();
ClientCredentialParameters参数=
ClientCredentialParameters.builder(范围)
.build();
结果=cca.acquireToken(参数).join();
其中authUrl
应类似于https://login.microsoftonline.com/
看:我已经做到了;这个例子对我也不适用。我的github问题尚未解决。我在那里发布的代码基于您提供的示例。您是否尝试按照建议使用clientid、tenantid和secret运行示例的干净克隆?我这样问是因为在您提交的问题的描述中,您说您使用的是com.fasterxml.jackson.dataformat jackson-dataformat-cbor2.10.3。这不是示例的一部分,可能是您遇到问题的原因。但第一步是检查没有这些额外依赖项的示例是否适用于您,因为它适用于我。我克隆了代码,更改了常量,运行了它,但失败了。见上面的链接。还有,圣地亚哥,检查你的LinkedIn账户。我把“秘密”寄给你了,我做到了;这个例子对我也不适用。我的github问题尚未解决。我在那里发布的代码基于您提供的示例。您是否尝试按照建议使用clientid、tenantid和secret运行示例的干净克隆?我这样问是因为在您提交的问题的描述中,您说您使用的是com.fasterxml.jackson.dataformat jackson-dataformat-cbor2.10.3。这不是示例的一部分,可能是您遇到问题的原因。但第一步是检查没有这些额外依赖项的示例是否适用于您,因为它适用于我。我克隆了代码,更改了常量,运行了它,但失败了。见上面的链接。还有,圣地亚哥,检查你的LinkedIn账户。我把“秘密”发给你了。对,默认情况下不需要配置缓存的任何内容,对吗?对,默认情况下不需要配置任何有关缓存的内容,对吗?