使用 Microsoft 身份验证库授权访问 API

已完成

你现在可以将公司的用户登录到 Web 应用程序。 接下来,在页面上的员工个人资料中显示信息,例如员工的职务、工作电子邮件地址等。 可以发现 Microsoft Graph API 提供对用户相关数据的访问权限。

本单元介绍 MSAL 如何帮助你获取对 Microsoft 服务(例如 Microsoft Graph API)的已授权访问权限。

API 权限和范围

Microsoft Entra ID 保护的 Web 服务将定义一组权限,用于访问该服务公开的 API 功能和数据。 应用程序可从用户和管理员那里请求这些权限,只有在用户或管理员批准该请求之后,应用才能代表用户访问或处理数据。 例如, Microsoft Graph 已定义执行以下任务及其他任务所需的权限:

  • 读取用户的日历
  • 写入用户的日历
  • 以用户身份发送邮件

用户和管理员可以进行控制并知道应用程序可以访问哪些数据。 在应用程序可以访问受 Microsoft 保护的 API 之前,你需要提供应用程序权限来执行操作。

Microsoft Entra ID 支持两种类型的权限:委托的权限和应用程序权限。

  • 委托的权限由包含登录用户的应用使用。 对于这些应用,由用户或管理员同意应用请求的权限, 向应用授予委托的权限,以便该应用在对目标 API 进行调用时可充当登录的用户。 某些高特权权限需要管理员同意。

  • 应用程序权限由无需存在登录用户即可运行的应用使用;例如,以后台服务或守护程序形式运行的应用。 只有管理员才能同意应用程序权限。

可以从 Azure 门户向应用注册分配这些 API 权限。

作用域

Microsoft Entra ID 实现 OAuth 2.0 授权协议,通过该协议,应用可代表用户访问基于 Web 的资源。

在 OAuth 2.0 中,这些类型的权限集称为“范围”。 向 Microsoft Entra ID 发出授权请求时,应用程序通过在请求的查询参数 scope 中指定权限来请求所需的权限。 例如,范围值 https://graph.microsoft.com/Calendars.Read 用于请求在 Microsoft Graph 中读取用户日历的权限。

使用 MSAL 获取访问令牌

通过访问令牌,客户端应用程序可以安全地调用受 Microsoft Entra ID 保护的 Web API。 可使用 Microsoft 身份验证库 (MSAL) 通过多种方式获取访问令牌。 一般情况下,用于获取令牌的方式取决于应用程序是公共客户端应用程序(例如桌面或移动应用)还是机密客户端应用程序(例如 Web 应用、Web API 或守护程序应用程序)。

MSAL 的几种令牌获取方法需要一个 scopes 参数,该参数是声明所需权限和请求资源的字符串列表。

MSAL 在获取令牌后会缓存令牌。 对于使用 OpenID Connect 授权代码流的 Web 应用程序,控制器中的建议模式为:

  • 在尝试通过其他方式获取令牌之前,应先尝试以无提示方式从缓存中获取令牌:

    final SilentParameters parameters = SilentParameters
                                            .builder(Collections.singleton(Config.SCOPES), context.getAccount())
                                            .build();
    
    final ConfidentialClientApplication client = getConfidentialClientInstance();
    
    client.tokenCache().deserialize(context.getTokenCache());
    
    final IAuthenticationResult result = client.acquireTokenSilently(parameters).get();
    
  • 如果缓存中没有任何令牌,且无提示令牌请求未能获取令牌,则可以使用授权代码流来获取令牌:

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                                                        .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES))
                                                        .build();
    
    final IAuthenticationResult result = app.acquireToken(authParams).get();
    

MSAL 也可以在令牌快到期时刷新令牌(因为令牌缓存中还包含刷新令牌)。

身份验证结果

当客户端请求访问令牌时,Microsoft Entra ID 还会返回一条身份验证结果,其中包含有关访问令牌的元数据。 此数据可让应用执行访问令牌的智能缓存,而无需分析访问令牌本身。 MSAL 返回的 AuthenticationResult 公开:

  • Web API 的访问令牌。
  • 用户的 ID 令牌 (JWT)。
  • 令牌过期时间,告知令牌的过期日期/时间。
  • 租户 ID 包含用户所在的租户。
  • 令牌的颁发范围。
  • 用户的唯一 ID。

Microsoft Graph 简介

Microsoft Graph API 提供单一终结点 https://graph.microsoft.com用于访问 Microsoft 云中丰富的、以人为中心的数据和见解。 可以使用 REST API 或 SDK 访问终结点,并构建支持 Microsoft 365 场景的应用,范围涵盖生产力、协作、教育、人员和工作场所智能等。 Microsoft Graph 还包括一组功能强大的服务,用于管理用户和设备标识。

例如,可通过访问 https://graph.microsoft.com/v1.0/me 终结点来读取已登录用户的属性。