获取访问令牌之前,请确保了解如何 初始化应用程序对象。 了解 访问令牌和资源之间的关系也至关重要。
在 MSAL 中,可以使用库提供的 acquireToken* 方法获取应用需要调用的 API 的访问令牌。 这些 acquireToken* 方法提取了使用 OAuth 2.0 授权代码流获取令牌所涉及的 2 个步骤:
- 向 Microsoft Entra ID 发出请求以获取
authorization code - 交换包含用户同意范围的 访问令牌 的代码
获取访问令牌
选择交互类型
如果不确定两者之间acquireTokenRedirect的差异,请参阅acquireTokenPopup。
准备请求对象
必须将请求对象传递给 acquireToken* API。 此对象允许你在请求中使用不同的参数。 有关请求对象参数的详细信息,请参阅 此处 。 所有 acquireToken* 调用都需要作用域。
检查缓存
MSAL 使用 缓存 基于特定参数(包括范围、资源和颁发机构)存储令牌,并在需要时从缓存中检索令牌。 当这些令牌过期时,它还可以对其进行静默续订。 MSAL 通过 acquireTokenSilent 该方法公开此功能。
使用其中一个 ssoSilent 或 login* API 登录后,缓存将包含一组 ID、访问和刷新令牌。 每次需要访问令牌时,都应调用 acquireTokenSilent ,如果此操作失败,请改为调用交互式 API。
acquireTokenSilent 将在缓存中查找有效的令牌,如果它即将过期或不存在,将自动尝试使用缓存的刷新令牌对其进行刷新。 您可以acquireTokenSilent在此处阅读有关如何使用的更多信息。
Popup
var request = {
scopes: ["User.Read"],
};
msalInstance.acquireTokenSilent(request).then(tokenResponse => {
// Do something with the tokenResponse
}).catch(async (error) => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
return msalInstance.acquireTokenPopup(request);
}
// handle other errors
})
重定向
var request = {
scopes: ["User.Read"],
};
msalInstance.acquireTokenSilent(request).then(tokenResponse => {
// Do something with the tokenResponse
}).catch(error => {
if (error instanceof InteractionRequiredAuthError) {
// fallback to interaction when silent call fails
return msalInstance.acquireTokenRedirect(request)
}
// handle other errors
});
使用访问令牌
检索到访问令牌后,必须将其包含在 Authorization 标头中作为持有者令牌,用于对你获取令牌的资源的请求,如下所示:
var headers = new Headers();
var bearer = "Bearer " + tokenResponse.accessToken;
headers.append("Authorization", bearer);
var options = {
method: "GET",
headers: headers
};
var graphEndpoint = "https://graph.microsoft.com/v1.0/me";
fetch(graphEndpoint, options)
.then(resp => {
//do something with response
});
MSAL 令牌获取最佳做法
下面是使用 MSAL 获取令牌的最佳做法,以避免错误、性能命中和可用性问题。 某些情况下,这些规定可能有例外。
使用单个 PublicClientApplication 实例
实例化每个应用程序一个 PublicClientApplication ,并在整个应用中使用相同的实例。 这可确保对于 MSAL 在任何给定时间执行的操作,都只有一个单一事实来源(请参阅:MSAL 事件),并消除不同应用对象并行发起交互式请求或发生潜在缓存冲突的可能性,因为这些情况可能导致应用出现故障、性能下降或损害用户体验。
始终等待承诺解析
所有 MSAL acquireToken* 和 login* API 执行异步操作并返回承诺。 在执行依赖于身份验证状态或令牌的任何其他任务(例如呈现用户信息、调用受保护的 API 或调用其他 MSAL API)之前,应始终等待这些承诺得到解决。
先尝试无提示请求,然后尝试交互
请求令牌时,始终先使用 acquireTokenSilent,如果需要(例如,当抛出 InteractionRequiredAuthError 时)回退到交互式令牌获取。
允许并发静默请求。 如果同时发出两个或多个无提示请求,则只有一个请求会转到网络(如果需要),但只要这些请求用于相同的请求参数(例如范围),所有请求都会接收响应。
不允许并发交互式请求。 如果同时发出两个或多个交互式请求,则只有第一个请求会启动交互,其余请求都会因 interaction_in_progress 错误而失败。 建议熟悉此错误和可能的补救措施,以避免在应用程序中遇到此错误。
为每个资源发起一次令牌请求
一次只能请求一个资源的访问令牌(请参阅 资源和范围)。 如果需要,可以使用请求对象中的参数请求用户同意多个资源 extraScopesToConsent 所需的范围(权限)。 对于先前已获用户同意的权限范围,可以静默获取访问令牌。