@azure/msal-browser
Version:
Microsoft Authentication Library for js
107 lines (100 loc) • 3.75 kB
text/typescript
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import { StandardInteractionClient } from "./StandardInteractionClient.js";
import {
CommonSilentFlowRequest,
SilentFlowClient,
invokeAsync,
} from "@azure/msal-common/browser";
import * as BrowserPerformanceEvents from "../telemetry/BrowserPerformanceEvents.js";
import { ApiId } from "../utils/BrowserConstants.js";
import {
BrowserAuthError,
BrowserAuthErrorCodes,
} from "../error/BrowserAuthError.js";
import { AuthenticationResult } from "../response/AuthenticationResult.js";
import { ClearCacheRequest } from "../request/ClearCacheRequest.js";
import {
clearCacheOnLogout,
initializeServerTelemetryManager,
} from "./BaseInteractionClient.js";
export class SilentCacheClient extends StandardInteractionClient {
/**
* Returns unexpired tokens from the cache, if available
* @param silentRequest
*/
async acquireToken(
silentRequest: CommonSilentFlowRequest
): Promise<AuthenticationResult> {
// Telemetry manager only used to increment cacheHits here
const serverTelemetryManager = initializeServerTelemetryManager(
ApiId.acquireTokenSilent_silentFlow,
this.config.auth.clientId,
this.correlationId,
this.browserStorage,
this.logger
);
const clientConfig = await invokeAsync(
this.getClientConfiguration.bind(this),
BrowserPerformanceEvents.StandardInteractionClientGetClientConfiguration,
this.logger,
this.performanceClient,
this.correlationId
)({
serverTelemetryManager,
requestAuthority: silentRequest.authority,
requestAzureCloudOptions: silentRequest.azureCloudOptions,
account: silentRequest.account,
});
const silentAuthClient = new SilentFlowClient(
clientConfig,
this.performanceClient
);
this.logger.verbose("Silent auth client created", this.correlationId);
try {
const response = await invokeAsync(
silentAuthClient.acquireCachedToken.bind(silentAuthClient),
BrowserPerformanceEvents.SilentFlowClientAcquireCachedToken,
this.logger,
this.performanceClient,
silentRequest.correlationId
)(silentRequest);
const authResponse = response[0] as AuthenticationResult;
this.performanceClient.addFields(
{
fromCache: true,
},
silentRequest.correlationId
);
return authResponse;
} catch (error) {
if (
error instanceof BrowserAuthError &&
error.errorCode === BrowserAuthErrorCodes.cryptoKeyNotFound
) {
this.logger.verbose(
"Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.",
this.correlationId
);
}
throw error;
}
}
/**
* API to silenty clear the browser cache.
* @param logoutRequest
*/
logout(logoutRequest?: ClearCacheRequest): Promise<void> {
this.logger.verbose("logoutRedirect called", this.correlationId);
const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);
return clearCacheOnLogout(
this.browserStorage,
this.browserCrypto,
this.logger,
this.correlationId,
validLogoutRequest.account
);
}
}