The loadExternalTokens() API
MSAL Browser 从 2.17.0 版本开始新增了 loadExternalTokens() API,该 API 允许将 ID 令牌、访问令牌和刷新令牌加载到 MSAL 缓存中,然后可使用 acquireTokenSilent() 获取这些令牌。
注意:这是一项高级功能,仅用于在浏览器环境中进行测试。 将令牌加载到应用程序的缓存可能会导致应用中断。 此外,我们建议 loadExternalTokens() 将 API 与单元和集成测试一起使用。 对于 E2E 测试,请改为参考我们的 TestingSample。
API loadExternalTokens() 是一个公共 API,可促进应用将自定义加载令牌添加到 MSAL 缓存。
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions,
);
loadExternalTokens() 接收类型为 SilentRequest 的请求、类型为 ExternalTokenResponse 的响应以及类型为 LoadTokenOptions 的选项。
请参阅每个类型定义,这些定义可从以下项 @azure/msal-browser导入:
正在加载令牌
可以提供用于缓存的 ID、访问和刷新令牌的任意组合,但至少 loadExternalTokens API 需要以下一组输入参数来适当标识令牌关联和缓存:
-
SilentRequest具有帐户信息的对象,或 - 具有机构的
SilentRequest对象和具有clientInfo的LoadTokenOptions对象,或 - 一个带有授权信息的
SilentRequest对象,以及一个带有client_info的服务器响应对象 - 一个具有颁发机构的
SilentRequest对象,以及一个带有id_token的服务器响应对象
下面的示例演示单独加载令牌,但是,可以在单个请求中提供任意 1、2 或全部 3 个令牌。
加载 ID 令牌
除了 上面 列出的参数外,还提供以下内容来加载 ID 令牌:
- 包含
id_token字段的服务器响应
还会根据上面提供的信息在缓存中设置帐户。
请参阅下面的代码示例:
const config: Configuration = {
auth: { clientId: "your-client-id" },
};
const silentRequest: SilentRequest = {
account: {
homeAccountId: "your-home-account-id",
environment: "login.microsoftonline.com",
tenantId: "your-tenant-id",
username: "test@contoso.com",
localAccountId: "your-local-account-id",
},
};
const serverResponse: ExternalTokenResponse = {
id_token: "id-token-here",
};
const loadTokenOptions: LoadTokenOptions = {};
const pca = new PublicClientApplication(config);
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions
);
// OR
const config: Configuration = {
auth: { clientId: "your-client-id" },
};
const silentRequest: SilentRequest = {
scopes: [],
authority: "https://login.microsoftonline.com/your-tenant-id",
};
const serverResponse: ExternalTokenResponse = {
id_token: "id-token-here",
};
const loadTokenOptions: LoadTokenOptions = {
clientInfo: "client-info-here",
};
const pca = new PublicClientApplication(config);
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions
);
// OR
const config: Configuration = {
auth: { clientId: "your-client-id" },
};
const silentRequest: SilentRequest = {
scopes: [],
authority: "https://login.microsoftonline.com/your-tenant-id",
};
const serverResponse: ExternalTokenResponse = {
id_token: "id-token-here",
client_info: "client-info-here",
};
const loadTokenOptions: LoadTokenOptions = {};
const pca = new PublicClientApplication(config);
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions
);
加载访问令牌
除了 上面 列出的参数外,还提供以下内容来加载访问令牌:
- 包含
access_token、expires_in、token_type和scope的服务器响应
请参阅下面的代码示例:
const config: Configuration = {
auth: { clientId: "your-client-id" },
};
const silentRequest: SilentRequest = {
scopes: ["User.Read", "email"],
account: {
homeAccountId: "your-home-account-id",
environment: "login.microsoftonline.com",
tenantId: "your-tenant-id",
username: "test@contoso.com",
localAccountId: "your-local-account-id",
},
};
const serverResponse: ExternalTokenResponse = {
token_type: AuthenticationScheme.BEARER, // "Bearer"
scope: "User.Read email",
expires_in: 3599,
access_token: "access-token-here",
};
const loadTokenOptions: LoadTokenOptions = {
extendedExpiresOn: 6599,
};
const pca = new PublicClientApplication(config);
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions
);
加载刷新令牌
除了 上面 列出的参数外,还提供以下内容来加载刷新令牌:
- 带有
refresh_token以及可选的refresh_token_expires_in的服务器响应
请参阅下面的代码示例:
const config: Configuration = {
auth: { clientId: "your-client-id" },
};
const silentRequest: SilentRequest = {
scopes: [],
account: {
homeAccountId: "your-home-account-id",
environment: "login.microsoftonline.com",
tenantId: "your-tenant-id",
username: "test@contoso.com",
localAccountId: "your-local-account-id",
},
};
const serverResponse: ExternalTokenResponse = {
refresh_token: "refresh-token-here",
refresh_token_expires_in: "86399",
};
const loadTokenOptions: LoadTokenOptions = {};
const pca = new PublicClientApplication(config);
await loadExternalTokens(
config,
silentRequest,
serverResponse,
loadTokenOptions
);