Testing

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 对象和具有 clientInfoLoadTokenOptions 对象,或
  • 一个带有授权信息的 SilentRequest 对象,以及一个带有 client_info 的服务器响应对象
  • 一个具有颁发机构的 SilentRequest 对象,以及一个带有 id_token 的服务器响应对象

下面的示例演示单独加载令牌,但是,可以在单个请求中提供任意 1、2 或全部 3 个令牌。

加载 ID 令牌

除了 上面 列出的参数外,还提供以下内容来加载 ID 令牌:

  1. 包含 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
);

加载访问令牌

除了 上面 列出的参数外,还提供以下内容来加载访问令牌:

  1. 包含 access_tokenexpires_intoken_typescope 的服务器响应

请参阅下面的代码示例:

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
);

加载刷新令牌

除了 上面 列出的参数外,还提供以下内容来加载刷新令牌:

  1. 带有 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
);