117 lines
5.2 KiB
JavaScript
117 lines
5.2 KiB
JavaScript
/*! @azure/msal-common v14.4.0 2023-11-07 */
|
|
'use strict';
|
|
import { buildClientConfiguration } from '../config/ClientConfiguration.mjs';
|
|
import { NetworkManager } from '../network/NetworkManager.mjs';
|
|
import { Logger } from '../logger/Logger.mjs';
|
|
import { HeaderNames, Constants } from '../utils/Constants.mjs';
|
|
import { name, version } from '../packageMetadata.mjs';
|
|
import { CcsCredentialType } from '../account/CcsCredential.mjs';
|
|
import { buildClientInfoFromHomeAccountId } from '../account/ClientInfo.mjs';
|
|
import { RequestParameterBuilder } from '../request/RequestParameterBuilder.mjs';
|
|
import { AuthorityFactory } from '../authority/AuthorityFactory.mjs';
|
|
import { PerformanceEvents } from '../telemetry/performance/PerformanceEvent.mjs';
|
|
|
|
/*
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the MIT License.
|
|
*/
|
|
/**
|
|
* Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.
|
|
* @internal
|
|
*/
|
|
class BaseClient {
|
|
constructor(configuration, performanceClient) {
|
|
// Set the configuration
|
|
this.config = buildClientConfiguration(configuration);
|
|
// Initialize the logger
|
|
this.logger = new Logger(this.config.loggerOptions, name, version);
|
|
// Initialize crypto
|
|
this.cryptoUtils = this.config.cryptoInterface;
|
|
// Initialize storage interface
|
|
this.cacheManager = this.config.storageInterface;
|
|
// Set the network interface
|
|
this.networkClient = this.config.networkInterface;
|
|
// Set the NetworkManager
|
|
this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);
|
|
// Set TelemetryManager
|
|
this.serverTelemetryManager = this.config.serverTelemetryManager;
|
|
// set Authority
|
|
this.authority = this.config.authOptions.authority;
|
|
// set performance telemetry client
|
|
this.performanceClient = performanceClient;
|
|
}
|
|
/**
|
|
* Creates default headers for requests to token endpoint
|
|
*/
|
|
createTokenRequestHeaders(ccsCred) {
|
|
const headers = {};
|
|
headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;
|
|
if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {
|
|
switch (ccsCred.type) {
|
|
case CcsCredentialType.HOME_ACCOUNT_ID:
|
|
try {
|
|
const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);
|
|
headers[HeaderNames.CCS_HEADER] = `Oid:${clientInfo.uid}@${clientInfo.utid}`;
|
|
}
|
|
catch (e) {
|
|
this.logger.verbose("Could not parse home account ID for CCS Header: " +
|
|
e);
|
|
}
|
|
break;
|
|
case CcsCredentialType.UPN:
|
|
headers[HeaderNames.CCS_HEADER] = `UPN: ${ccsCred.credential}`;
|
|
break;
|
|
}
|
|
}
|
|
return headers;
|
|
}
|
|
/**
|
|
* Http post to token endpoint
|
|
* @param tokenEndpoint
|
|
* @param queryString
|
|
* @param headers
|
|
* @param thumbprint
|
|
*/
|
|
async executePostToTokenEndpoint(tokenEndpoint, queryString, headers, thumbprint, correlationId, queuedEvent) {
|
|
if (queuedEvent) {
|
|
this.performanceClient?.addQueueMeasurement(queuedEvent, correlationId);
|
|
}
|
|
const response = await this.networkManager.sendPostRequest(thumbprint, tokenEndpoint, { body: queryString, headers: headers });
|
|
this.performanceClient?.addFields({
|
|
refreshTokenSize: response.body.refresh_token?.length || 0,
|
|
httpVerToken: response.headers?.[HeaderNames.X_MS_HTTP_VERSION] || "",
|
|
}, correlationId);
|
|
if (this.config.serverTelemetryManager &&
|
|
response.status < 500 &&
|
|
response.status !== 429) {
|
|
// Telemetry data successfully logged by server, clear Telemetry cache
|
|
this.config.serverTelemetryManager.clearTelemetryCache();
|
|
}
|
|
return response;
|
|
}
|
|
/**
|
|
* Updates the authority object of the client. Endpoint discovery must be completed.
|
|
* @param updatedAuthority
|
|
*/
|
|
async updateAuthority(cloudInstanceHostname, correlationId) {
|
|
this.performanceClient?.addQueueMeasurement(PerformanceEvents.UpdateTokenEndpointAuthority, correlationId);
|
|
const cloudInstanceAuthorityUri = `https://${cloudInstanceHostname}/${this.authority.tenant}/`;
|
|
const cloudInstanceAuthority = await AuthorityFactory.createDiscoveredInstance(cloudInstanceAuthorityUri, this.networkClient, this.cacheManager, this.authority.options, this.logger, this.performanceClient, correlationId);
|
|
this.authority = cloudInstanceAuthority;
|
|
}
|
|
/**
|
|
* Creates query string for the /token request
|
|
* @param request
|
|
*/
|
|
createTokenQueryParameters(request) {
|
|
const parameterBuilder = new RequestParameterBuilder();
|
|
if (request.tokenQueryParameters) {
|
|
parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);
|
|
}
|
|
return parameterBuilder.createQueryString();
|
|
}
|
|
}
|
|
|
|
export { BaseClient };
|
|
//# sourceMappingURL=BaseClient.mjs.map
|