我们已在 Microsoft Entra Id 中注册了 1 个 Azure Function App 和 1 个相应的客户端应用程序。 使用 grant_type“授权代码”,API 的授权工作正常,但对于 grant_type“客户端凭据”,我们收到以下错误:
java.util.concurrent.CompletionException: com.microsoft.aad.msal4j.MsalInteractionRequiredException: AADSTS90083: 请求不受支持。跟踪 ID: 20d89e47-3937-4535-b174-8cc57d31a400 相关 ID: c2bc0944-902d-4768-851e-615bcfd6776c 时间戳: 2024-04-09 06:09:57Z 在 com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:89) 在 com.microsoft.aad.msal4j.AuthenticationResultSupplier.get(AuthenticationResultSupplier.java:17) 在 java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ... 1 更多 造成原因: com.microsoft.aad.msal4j.MsalInteractionRequiredException: AADSTS90083: 请求不受支持。跟踪 ID: 20d89e47-3937-4535-b174-8cc57d31a400 相关 ID: c2bc0944-902d-4768-851e-615bcfd6776c 时间戳: 2024-04-09 06:09:57Z 在 com.microsoft.aad.msal4j.MsalServiceExceptionFactory.fromHttpResponse(MsalServiceExceptionFactory.java:37) 在
我们尝试将范围更改为不同的值。还添加了应用程序角色。
我使用下面的代码和客户端凭据成功检索了访问令牌。
代码:
import com.microsoft.aad.msal4j.*;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class Main {
private static String clientId = "<clien_ID>";
private static String clientSecret = "<client_secret>";
private static String authority = "https://login.microsoftonline.com/<tenant_ID>";
public static void main(String args[]) {
try {
acquireToken();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void acquireToken() throws Exception {
final IClientCredential credential = ClientCredentialFactory.createFromSecret(clientSecret);
final ConfidentialClientApplication cca = ConfidentialClientApplication.builder(clientId, credential)
.authority(authority)
.build();
final Set<String> scopes = Collections.singleton("https://graph.microsoft.com/.default");
final ClientCredentialParameters parameters = ClientCredentialParameters.builder(scopes).build();
CompletableFuture<IAuthenticationResult> future = cca.acquireToken(parameters);
IAuthenticationResult result;
try {
result = future.get();
System.out.println("Access Token: " + result.accessToken());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
throw e;
}
}
}
输出:
上面的代码成功运行,获取带有客户端凭据的访问令牌,如下所示。