Azure 上的 Java:云原生身份验证





5.00/5 (1投票)
在本系列的下一部分中,我们将探讨您的应用程序如何知道它正在被使用。我们还将探讨 Azure 如何通过其服务和免费代码库为用户进行身份验证提供支持。
API 常常需要识别其调用者。它可以是调用 API 的 Web 应用程序,也可以是调用 API 的另一个 API。识别 API 的调用者也称为身份验证。构建自己的身份验证框架可能很棘手。值得庆幸的是,您不必构建自己的身份验证框架。已经有可用的解决方案。 Azure Active Directory (Azure AD) 和 Microsoft 身份验证库 (MSAL) 适用于各种平台,用于处理令牌和身份验证。
Azure AD 提供了一种方式,用户可以使用组织提供的现有凭据登录到应用程序,而不是为每个应用程序创建一个新的登录。使用 Azure AD 可以使您的应用程序免于与用户维护相关的许多任务,例如登录和密码重置。OAuth 流程验证用户,然后暂时将用户交给另一个页面进行登录。登录后,该页面会将访问令牌传递回应用程序。应用程序可以使用访问令牌检索有关当前用户的更多信息。
创建租户
要开始使用 Azure AD,您需要访问 Azure AD 租户。租户代表一个组织。您可能已经为您的帐户设置了一个租户。要检查,请登录 Azure 门户,然后在右上角查看。如果您的帐户已设置为租户,它会显示在您的用户名下。
如果您还没有 Azure AD 租户,可以创建一个。在 Azure 门户中,选择“Azure Active Directory”。从顶部的菜单中,选择“创建租户”。
选择“Azure Active Directory”作为租户类型,然后单击下一步。填写您的组织信息并继续创建租户。
拥有租户后,您必须将您的应用程序注册为 Azure AD 的客户端。在门户中,选择“Azure Active Directory”。在“管理”菜单下,选择“应用注册”,然后单击+新建注册。
为应用程序提供一个用户将识别的名称,并确保您已从“支持的帐户类型”选项中选择了您的租户。单击注册以创建您的租户。
将其添加到应用程序
现在您已经设置了一个租户,适用于 Java 的 Microsoft 身份验证库 (MSAL4J) 将管理身份验证。您可以通过将依赖项声明添加到项目的 Maven 存储库中,将 MSAL4J 添加到项目中。添加后,该库的类可以通过 com.microsoft.azure.msal4j
命名空间获得。
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>msal4j</artifactId>
<version>1.9.1</version>
</dependency>
MSAL4J 支持不同的身份验证场景。两个常见的场景是
- 用户必须使用应用程序进行身份验证。
- 服务必须使用应用程序进行身份验证。
当用户必须进行身份验证时,您可以使用 OAuth。OAuth 是一种开放标准,它使一个网站或服务可以为另一个网站或服务执行身份验证,而无需共享用户的凭据。应用程序将用户转发到登录页面,用户使用他们的帐户凭据登录。身份验证后,该页面会将用户发送回应用程序,并向应用程序提供用户的身份验证令牌。应用程序使用身份验证令牌来检索访问令牌。 MSAL4J 简化了检索令牌的过程。在我们的应用程序中,添加以下代码以检索访问令牌。
//ConfidentialClientApplication app;
String authCode = authorizationCode.getValue();
AuthorizationCodeParameters parameters = AuthorizationCodeParameters.builder(
authCode,
new URI(currentUri)).
build();
IAuthenticationResult result = app.acquireToken(parameters).get();
SessionManagementHelper.storeTokenCacheInSession(httpServletRequest,
app.tokenCache().serialize());
对于需要身份验证的 Web 调用,将访问令牌添加到调用的标头中。Azure AD 还提供了一个端点,该端点在使用访问令牌调用时提供有关用户的信息,以 JSON 对象的形式。
HttpURLConnection connection = (HttpURLConnection) MSGraphEndpoint;
connection.setRequestProperty("Authorization", "Bearer " + accessToken);
connection.setRequestProperty("Accept", "application/json");
String response = HttpClientHelper.getResponseStringFromConn(connection);
int responseCode = conn.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException(response);
}
JSONObject userInformation = HttpClientHelper.processResponse(responseCode,
response);
尝试自己运行应用程序。当您运行应用程序时,它现在将检查用户是否已登录。如果用户未登录,用户会看到一个指向登录页面的链接。用户登录后,页面会显示一条消息,表明用户已成功登录并显示基本信息。
结论
Azure 提供了其他功能,您可以使用这些功能来丰富应用程序的功能。在本系列的 下一部分 中,我们将研究 Azure 认知服务,以及如何使用现有的云原生服务。