快速入门:使用应用的标识获取令牌并从 Java 控制台应用中调用 Microsoft Graph API
欢迎使用! 这可能不是你期望看到的页面。 在修复时,此链接应会将你转至正确的文章:
对此造成你的不便,我们深表歉意;感谢你的耐心等待,我们正在努力解决此问题。
在本快速入门中,你将下载并运行一个代码示例,该示例演示 Java 应用程序如何使用应用的标识获取访问令牌来调用 Microsoft Graph API 并在目录中显示用户列表。 代码示例演示无人参与的作业或 Windows 服务如何使用应用程序标识而不是用户标识运行。
先决条件
若要运行此示例,需要:
- Java 开发工具包 (JDK) 8 或更高版本
- Maven
下载并配置快速入门应用
步骤 1:在 Azure 门户中配置应用程序
为使本快速入门的代码示例正常运行,需创建客户端机密,并添加 Graph API 的 User.Read.All 应用程序权限。
应用程序已使用这些属性进行配置。
步骤 2:下载 Java 项目
注意
Enter_the_Supported_Account_Info_Here
步骤 3:管理员同意
如果尝试在此时运行应用程序,则会收到“HTTP 403 - 禁止访问”错误:Insufficient privileges to complete the operation
。 之所以出现这种错误,是因为任何仅限应用的权限都需要管理员同意:目录的云应用程序管理员必须为应用程序授予同意。 根据自己的角色选择下面的一个选项:
云应用程序管理员
如果你是租户的云应用程序管理员,请转到“API 权限”页面,选择“为 Enter_the_Tenant_Name_Here 授予管理员同意”。
标准用户
如果你是租户的标准用户,你需要请求云应用程序管理员为你的应用程序授予管理员同意。 为此,请将以下 URL 提供给管理员:
https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here
步骤 4:运行应用程序
可通过从 IDE 中运行 ClientCredentialGrant.java 的主方法,直接测试示例。
从 shell 或命令行:
$ mvn clean compile assembly:single
这将在 /targets 目录中生成一个 msal-client-credential-secret-1.0.0.jar 文件。 使用 Java 可执行文件运行此内容,如下所示:
$ java -jar msal-client-credential-secret-1.0.0.jar
运行后,应用程序应显示配置的租户中的用户列表。
重要
本快速入门应用程序使用客户端机密将自己标识为机密客户端。 由于客户端机密是以纯文本形式添加到项目文件的,因此为了安全起见,建议在考虑将应用程序用作生产应用程序之前,使用证书来代替客户端机密。 若要详细了解如何使用证书,请查看有关此示例的这些说明,它们位于同一 GitHub 存储库中,但在另一个文件夹“msal-client-credential-certificate”中。
详细信息
MSAL Java
MSAL Java 是一个用于登录用户和请求令牌的库,此类令牌用于访问受 Microsoft 标识平台保护的 API。 如前所述,本快速入门请求令牌的方法是使用应用程序自身的标识而不是委托的权限。 在此示例中使用的身份验证流称为客户端凭据 oauth 流。 若要详细了解如何搭配使用 MSAL Java 和守护程序应用,请参阅本文。
可以使用 Maven 或 Gradle 将 MSAL4J 添加到应用程序,以通过对应用程序的 pom.xml (Maven) 或 build.gradle (Gradle) 文件进行以下更改来管理依赖项。
在 pom.xml 中:
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>msal4j</artifactId>
<version>1.0.0</version>
</dependency>
在 build.gradle 中:
compile group: 'com.microsoft.azure', name: 'msal4j', version: '1.0.0'
MSAL 初始化
通过将以下代码添加到要在其中使用 MSAL4J 的文件的顶部,来添加对 MSAL for Java 的引用:
import com.microsoft.aad.msal4j.*;
然后,使用以下代码对 MSAL 进行初始化:
IClientCredential credential = ClientCredentialFactory.createFromSecret(CLIENT_SECRET);
ConfidentialClientApplication cca =
ConfidentialClientApplication
.builder(CLIENT_ID, credential)
.authority(AUTHORITY)
.build();
其中: 说明 CLIENT_SECRET
是在 Azure 门户中为应用程序创建的客户端机密。 CLIENT_ID
是在 Azure 门户中注册的应用程序的应用程序(客户端) ID。 可以在 Azure 门户的应用的“概览”页中找到此值。 AUTHORITY
用户要进行身份验证的 STS 终结点。 对于公有云,通常为 https://login.microsoftonline.com/{tenant}
,其中 {tenant} 是租户名称或租户 ID。
请求令牌
若要通过应用的标识来请求令牌,请使用 acquireToken
方法:
IAuthenticationResult result;
try {
SilentParameters silentParameters =
SilentParameters
.builder(SCOPE)
.build();
// try to acquire token silently. This call will fail since the token cache does not
// have a token for the application you are requesting an access token for
result = cca.acquireTokenSilently(silentParameters).join();
} catch (Exception ex) {
if (ex.getCause() instanceof MsalException) {
ClientCredentialParameters parameters =
ClientCredentialParameters
.builder(SCOPE)
.build();
// Try to acquire a token. If successful, you should see
// the token information printed out to console
result = cca.acquireToken(parameters).join();
} else {
// Handle other exceptions accordingly
throw ex;
}
}
return result;
其中: 说明 SCOPE
包含请求的范围。 对于机密客户端,这应该使用与 {Application ID URI}/.default
类似的格式,指示所请求的范围是在 Azure 门户的应用对象集中静态定义的范围(就 Microsoft Graph 来说,{Application ID URI}
指向https://graph.microsoft.com
)。 对于自定义 Web API,{Application ID URI}
是在 Azure 门户的“应用注册”的“公开 API”部分中定义的 。
帮助和支持
如果需要帮助、需要报告问题,或者需要详细了解支持选项,请参阅面向开发人员的帮助和支持。
后续步骤
若要详细了解守护程序应用程序,请参阅方案登陆页面。