Java 如何使用MSAL4J为守护程序获取令牌?

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 在反复阅读示

我有一个用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账户。我把“秘密”发给你了。对,默认情况下不需要配置缓存的任何内容,对吗?对,默认情况下不需要配置任何有关缓存的内容,对吗?