Azure上的Java:云原生身份验证
API通常需要识别其调用方。它可以是调用API的Web应用程序,也可以是调用API的另一个API。识别API的调用者也称为身份验证。建立自己的身份验证框架可能很棘手。值得庆幸的是,不必建立自己的身份验证框架。已经有可用的解决方案。AzureActiveDirectory(AzureAD),Microsoft身份验证库(MSAL),可在各种平台上工作以处理令牌和身份验证。
AzureAD为用户提供了一种使用组织提供的预先存在的凭据登录应用程序的方法,而不是为每个应用程序进行新的登录。使用AzureAD使您的应用程序摆脱了与用户维护相关的许多任务,例如登录和密码重置。OAuth流对用户进行身份验证,然后将用户暂时转到另一个页面进行登录。登录后,该页面将访问令牌回传给应用程序。应用程序可以使用访问令牌来检索有关当前用户的更多信息。
创建一个租户
若要开始使用AzureAD,您需要有权访问AzureAD租户。租户代表一个组织。您可能已经为您的帐户设置了一个租户。要进行检查,请登录到Azure门户并在右上角查找。如果您的帐户是为租户设置的,它将显示在您的用户名下方。
如果您还没有AzureAD租户,则可以创建一个。在Azure门户中,选择“AzureActiveDirectory”。从顶部的菜单中,选择“创建租户”。
选择“AzureActiveDirectory”作为租户类型,然后单击“下一步”。填写贵组织的信息,然后继续创建承租人。
一旦有了租户,就必须将应用程序注册为AzureAD的客户端。在门户中,选择“AzureActiveDirectory”。在“管理”菜单下,选择“应用程序注册”,然后单击+新注册。
为用户可以识别的应用程序提供一个名称,并确保您已从“支持的帐户类型”选项中选择了租户。单击注册以创建您的租户。
将其添加到应用程序
现在,您已经设置了一个租户,MicrosoftJava身份验证库(MSAL4J)将管理身份验证。通过将依赖项声明添加到项目的Maven存储库中,可以将MSAL4J添加到项目中。添加后,可通过com.microsoft.azure.msal4j名称空间使用库的类。
<dependency> <groupId>com.microsoft.azure</groupId> <artifactId>msal4j</artifactId> <version>1.9.1</version> </dependency>12345复制代码类型:[java]
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());123456789复制代码类型:[java]
对于需要身份验证的Web呼叫,将访问令牌添加到该呼叫的标题中。AzureAD还提供了一个终结点,当使用访问令牌调用该终结点时,该终结点可在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);1234567891011复制代码类型:[java]
尝试自己运行该应用程序。现在,当您运行该应用程序时,它将检查用户是否登录。如果用户未登录,则用户会看到指向登录页面的链接。用户登录后,页面将显示一条消息,表明用户已成功登录并显示基本信息。
结论
Azure提供了其他功能,可用于丰富应用程序的功能。在本系列的下一部分中,我们将介绍Azure认知服务以及如何使用现有的云原生服务