UNPKG

@azure/msal-browser

Version:
144 lines (136 loc) 5.07 kB
/* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ import { StandardInteractionClient } from "./StandardInteractionClient.js"; import { CommonSilentFlowRequest, ServerTelemetryManager, RefreshTokenClient, AuthError, AzureCloudOptions, invokeAsync, AccountInfo, StringDict, } from "@azure/msal-common/browser"; import * as BrowserPerformanceEvents from "../telemetry/BrowserPerformanceEvents.js"; import { ApiId } from "../utils/BrowserConstants.js"; import { createBrowserAuthError, BrowserAuthErrorCodes, } from "../error/BrowserAuthError.js"; import { AuthenticationResult } from "../response/AuthenticationResult.js"; import { initializeBaseRequest } from "../request/RequestHelpers.js"; import { getRedirectUri, initializeServerTelemetryManager, } from "./BaseInteractionClient.js"; export class SilentRefreshClient extends StandardInteractionClient { /** * Exchanges the refresh token for new tokens * @param request */ async acquireToken( request: CommonSilentFlowRequest ): Promise<AuthenticationResult> { const baseRequest = await invokeAsync( initializeBaseRequest, BrowserPerformanceEvents.InitializeBaseRequest, this.logger, this.performanceClient, request.correlationId )( request, this.config, this.performanceClient, this.logger, this.correlationId ); const silentRequest: CommonSilentFlowRequest = { ...request, ...baseRequest, }; if (request.redirectUri) { // Make sure any passed redirectUri is converted to an absolute URL - redirectUri is not a required parameter for refresh token redemption so only include if explicitly provided silentRequest.redirectUri = getRedirectUri( request.redirectUri, this.config.auth.redirectUri, this.logger, this.correlationId ); } const serverTelemetryManager = initializeServerTelemetryManager( ApiId.acquireTokenSilent_silentFlow, this.config.auth.clientId, this.correlationId, this.browserStorage, this.logger ); const refreshTokenClient = await this.createRefreshTokenClient({ serverTelemetryManager, authorityUrl: silentRequest.authority, azureCloudOptions: silentRequest.azureCloudOptions, account: silentRequest.account, }); // Send request to renew token. Auth module will throw errors if token cannot be renewed. return invokeAsync( refreshTokenClient.acquireTokenByRefreshToken.bind( refreshTokenClient ), BrowserPerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, this.logger, this.performanceClient, request.correlationId )(silentRequest, ApiId.acquireTokenSilent_silentFlow).catch( (e: AuthError) => { (e as AuthError).setCorrelationId(this.correlationId); serverTelemetryManager.cacheFailedRequest(e); throw e; } ) as Promise<AuthenticationResult>; } /** * Currently Unsupported */ logout(): Promise<void> { // Synchronous so we must reject return Promise.reject( createBrowserAuthError( BrowserAuthErrorCodes.silentLogoutUnsupported ) ); } /** * Creates a Refresh Client with the given authority, or the default authority. * @param params { * serverTelemetryManager: ServerTelemetryManager; * authorityUrl?: string; * azureCloudOptions?: AzureCloudOptions; * extraQueryParams?: StringDict; * account?: AccountInfo; * } */ protected async createRefreshTokenClient(params: { serverTelemetryManager: ServerTelemetryManager; authorityUrl?: string; azureCloudOptions?: AzureCloudOptions; extraQueryParameters?: StringDict; account?: AccountInfo; }): Promise<RefreshTokenClient> { // Create auth module. const clientConfig = await invokeAsync( this.getClientConfiguration.bind(this), BrowserPerformanceEvents.StandardInteractionClientGetClientConfiguration, this.logger, this.performanceClient, this.correlationId )({ serverTelemetryManager: params.serverTelemetryManager, requestAuthority: params.authorityUrl, requestAzureCloudOptions: params.azureCloudOptions, requestExtraQueryParameters: params.extraQueryParameters, account: params.account, }); return new RefreshTokenClient(clientConfig, this.performanceClient); } }