UNPKG

@azure/msal-common

Version:
124 lines (111 loc) 3.95 kB
/* * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. */ import { AuthError } from "./AuthError.js"; import * as InteractionRequiredAuthErrorCodes from "./InteractionRequiredAuthErrorCodes.js"; export { InteractionRequiredAuthErrorCodes }; /** * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required */ export const InteractionRequiredServerErrorMessage = [ InteractionRequiredAuthErrorCodes.interactionRequired, InteractionRequiredAuthErrorCodes.consentRequired, InteractionRequiredAuthErrorCodes.loginRequired, InteractionRequiredAuthErrorCodes.badToken, InteractionRequiredAuthErrorCodes.uxNotAllowed, InteractionRequiredAuthErrorCodes.interruptedUser, ]; export const InteractionRequiredAuthSubErrorMessage = [ "message_only", "additional_action", "basic_action", "user_password_expired", "consent_required", "bad_token", "ux_not_allowed", "interrupted_user", ]; /** * Error thrown when user interaction is required. */ export class InteractionRequiredAuthError extends AuthError { /** * The time the error occured at */ timestamp: string; /** * TraceId associated with the error */ traceId: string; /** * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-common/docs/claims-challenge.md * * A string with extra claims needed for the token request to succeed * web site: redirect the user to the authorization page and set the extra claims * web api: include the claims in the WWW-Authenticate header that are sent back to the client so that it knows to request a token with the extra claims * desktop application or browser context: include the claims when acquiring the token interactively * app to app context (client_credentials): include the claims in the AcquireTokenByClientCredential request */ claims: string; /** * Server error number; */ readonly errorNo?: string; constructor( errorCode?: string, errorMessage?: string, subError?: string, timestamp?: string, traceId?: string, correlationId?: string, claims?: string, errorNo?: string ) { super(errorCode, errorMessage, subError); Object.setPrototypeOf(this, InteractionRequiredAuthError.prototype); this.timestamp = timestamp || ""; this.traceId = traceId || ""; this.correlationId = correlationId || ""; this.claims = claims || ""; this.name = "InteractionRequiredAuthError"; this.errorNo = errorNo; } } /** * Helper function used to determine if an error thrown by the server requires interaction to resolve * @param errorCode * @param errorString * @param subError */ export function isInteractionRequiredError( errorCode?: string, errorString?: string, subError?: string ): boolean { const isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1; const isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1; const isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some((irErrorCode) => { return errorString.indexOf(irErrorCode) > -1; }); return ( isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError ); } /** * Creates an InteractionRequiredAuthError */ export function createInteractionRequiredAuthError( errorCode: string, errorMessage?: string ): InteractionRequiredAuthError { return new InteractionRequiredAuthError(errorCode, errorMessage); }