@azure/msal-browser
Version:
Microsoft Authentication Library for js
157 lines (154 loc) • 6.56 kB
JavaScript
/*! @azure/msal-browser v5.6.3 2026-04-01 */
;
import { createAuthError, AuthErrorCodes } from '@azure/msal-common/browser';
import { PlatformAuthConstants } from '../../utils/BrowserConstants.mjs';
import { createNativeAuthError } from '../../error/NativeAuthError.mjs';
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
class PlatformAuthDOMHandler {
constructor(logger, performanceClient, correlationId) {
this.logger = logger;
this.performanceClient = performanceClient;
this.correlationId = correlationId;
this.platformAuthType = PlatformAuthConstants.PLATFORM_DOM_PROVIDER;
}
static async createProvider(logger, performanceClient, correlationId) {
logger.trace("12mj4a", correlationId);
// @ts-ignore
if (window.navigator?.platformAuthentication) {
const supportedContracts =
// @ts-ignore
await window.navigator.platformAuthentication.getSupportedContracts(PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID);
if (supportedContracts?.includes(PlatformAuthConstants.PLATFORM_DOM_APIS)) {
logger.trace("1h5q1r", correlationId);
return new PlatformAuthDOMHandler(logger, performanceClient, correlationId);
}
}
return undefined;
}
/**
* Returns the Id for the broker extension this handler is communicating with
* @returns
*/
getExtensionId() {
return PlatformAuthConstants.MICROSOFT_ENTRA_BROKERID;
}
getExtensionVersion() {
return "";
}
getExtensionName() {
return PlatformAuthConstants.DOM_API_NAME;
}
/**
* Send token request to platform broker via browser DOM API
* @param request
* @returns
*/
async sendMessage(request) {
this.logger.trace("02bcil", request.correlationId);
try {
const platformDOMRequest = this.initializePlatformDOMRequest(request);
const response =
// @ts-ignore
await window.navigator.platformAuthentication.executeGetToken(platformDOMRequest);
return this.validatePlatformBrokerResponse(response, request.correlationId);
}
catch (e) {
this.logger.error("11im7g", request.correlationId);
throw e;
}
}
initializePlatformDOMRequest(request) {
this.logger.trace("15d6yv", request.correlationId);
const { accountId, clientId, authority, scope, redirectUri, correlationId, state, storeInCache, embeddedClientId, extraParameters, ...remainingProperties } = request;
const validExtraParameters = this.getDOMExtraParams(remainingProperties, correlationId);
const platformDOMRequest = {
accountId: accountId,
brokerId: this.getExtensionId(),
authority: authority,
clientId: clientId,
correlationId: correlationId || this.correlationId,
extraParameters: {
...extraParameters,
...validExtraParameters,
},
isSecurityTokenService: false,
redirectUri: redirectUri,
scope: scope,
state: state,
storeInCache: storeInCache,
embeddedClientId: embeddedClientId,
};
return platformDOMRequest;
}
validatePlatformBrokerResponse(response, correlationId) {
if (response.hasOwnProperty("isSuccess")) {
if (response.hasOwnProperty("accessToken") &&
response.hasOwnProperty("idToken") &&
response.hasOwnProperty("clientInfo") &&
response.hasOwnProperty("account") &&
response.hasOwnProperty("scopes") &&
response.hasOwnProperty("expiresIn")) {
this.logger.trace("0h4vei", correlationId);
return this.convertToPlatformBrokerResponse(response, correlationId);
}
else if (response.hasOwnProperty("error")) {
const errorResponse = response;
if (errorResponse.isSuccess === false &&
errorResponse.error &&
errorResponse.error.code) {
this.logger.trace("0g92vm", correlationId);
throw createNativeAuthError(errorResponse.error.code, errorResponse.error.description, {
error: parseInt(errorResponse.error.errorCode),
protocol_error: errorResponse.error.protocolError,
status: errorResponse.error.status,
properties: errorResponse.error.properties,
});
}
}
}
throw createAuthError(AuthErrorCodes.unexpectedError, "Response missing expected properties.");
}
convertToPlatformBrokerResponse(response, correlationId) {
this.logger.trace("14913t", correlationId);
const nativeResponse = {
access_token: response.accessToken,
id_token: response.idToken,
client_info: response.clientInfo,
account: response.account,
expires_in: response.expiresIn,
scope: response.scopes,
state: response.state || "",
properties: response.properties || {},
extendedLifetimeToken: response.extendedLifetimeToken ?? false,
shr: response.proofOfPossessionPayload,
};
return nativeResponse;
}
getDOMExtraParams(extraParameters, correlationId) {
try {
const stringifiedProperties = {};
for (const [key, value] of Object.entries(extraParameters)) {
if (!value) {
continue;
}
if (typeof value === "object") {
stringifiedProperties[key] = JSON.stringify(value);
}
else {
stringifiedProperties[key] = String(value);
}
}
return stringifiedProperties;
}
catch (e) {
this.logger.error("0eu9o3", correlationId);
this.logger.errorPii("17rpl5", correlationId);
return {};
}
}
}
export { PlatformAuthDOMHandler };
//# sourceMappingURL=PlatformAuthDOMHandler.mjs.map