mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Prompt user to refresh account credentials for AADSTS70043 and AADSTS50173 error codes (#22853)
This commit is contained in:
@@ -24,7 +24,7 @@ import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|||||||
import { Logger } from '../../utils/Logger';
|
import { Logger } from '../../utils/Logger';
|
||||||
import * as qs from 'qs';
|
import * as qs from 'qs';
|
||||||
import { AzureAuthError } from './azureAuthError';
|
import { AzureAuthError } from './azureAuthError';
|
||||||
import { AccountInfo, AuthenticationResult, InteractionRequiredAuthError, PublicClientApplication } from '@azure/msal-node';
|
import { AccountInfo, AuthError, AuthenticationResult, InteractionRequiredAuthError, PublicClientApplication } from '@azure/msal-node';
|
||||||
import { HttpClient } from './httpClient';
|
import { HttpClient } from './httpClient';
|
||||||
import { getProxyEnabledHttpClient, getTenantIgnoreList, updateTenantIgnoreList } from '../../utils';
|
import { getProxyEnabledHttpClient, getTenantIgnoreList, updateTenantIgnoreList } from '../../utils';
|
||||||
import { errorToPromptFailedResult } from './networkUtils';
|
import { errorToPromptFailedResult } from './networkUtils';
|
||||||
@@ -365,7 +365,7 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
return await this.clientApplication.acquireTokenSilent(tokenRequest);
|
return await this.clientApplication.acquireTokenSilent(tokenRequest);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
Logger.error('Failed to acquireTokenSilent', e);
|
Logger.error('Failed to acquireTokenSilent', e);
|
||||||
if (e instanceof InteractionRequiredAuthError) {
|
if (e instanceof AuthError && this.accountNeedsRefresh(e)) {
|
||||||
// build refresh token request
|
// build refresh token request
|
||||||
const tenant: Tenant = {
|
const tenant: Tenant = {
|
||||||
id: tenantId,
|
id: tenantId,
|
||||||
@@ -632,7 +632,6 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
}
|
}
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
|
||||||
//#region interaction handling
|
//#region interaction handling
|
||||||
public async handleInteractionRequiredMsal(tenant: Tenant, resource: Resource): Promise<AuthenticationResult | null> {
|
public async handleInteractionRequiredMsal(tenant: Tenant, resource: Resource): Promise<AuthenticationResult | null> {
|
||||||
const shouldOpen = await this.askUserForInteraction(tenant, resource);
|
const shouldOpen = await this.askUserForInteraction(tenant, resource);
|
||||||
@@ -654,6 +653,17 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether the account needs to be refreshed based on received error instance
|
||||||
|
* and STS error codes from errorMessage.
|
||||||
|
* @param error AuthError instance
|
||||||
|
*/
|
||||||
|
private accountNeedsRefresh(error: AuthError): boolean {
|
||||||
|
return error instanceof InteractionRequiredAuthError
|
||||||
|
|| error.errorMessage.includes(Constants.AADSTS70043)
|
||||||
|
|| error.errorMessage.includes(Constants.AADSTS50173);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asks the user if they would like to do the interaction based authentication as required by OAuth2
|
* Asks the user if they would like to do the interaction based authentication as required by OAuth2
|
||||||
* @param tenant
|
* @param tenant
|
||||||
|
|||||||
@@ -78,6 +78,19 @@ export const LocalCacheSuffix = '.local';
|
|||||||
|
|
||||||
export const LockFileSuffix = '.lockfile';
|
export const LockFileSuffix = '.lockfile';
|
||||||
|
|
||||||
|
/////// MSAL ERROR CODES, ref: https://learn.microsoft.com/en-us/azure/active-directory/develop/reference-aadsts-error-codes
|
||||||
|
/**
|
||||||
|
* The refresh token has expired or is invalid due to sign-in frequency checks by conditional access.
|
||||||
|
* The token was issued on {issueDate} and the maximum allowed lifetime for this request is {time}.
|
||||||
|
*/
|
||||||
|
export const AADSTS70043 = 'AADSTS70043';
|
||||||
|
/**
|
||||||
|
* FreshTokenNeeded - The provided grant has expired due to it being revoked, and a fresh auth token is needed.
|
||||||
|
* Either an admin or a user revoked the tokens for this user, causing subsequent token refreshes to fail and
|
||||||
|
* require reauthentication. Have the user sign in again.
|
||||||
|
*/
|
||||||
|
export const AADSTS50173 = 'AADSTS50173';
|
||||||
|
|
||||||
export enum BuiltInCommands {
|
export enum BuiltInCommands {
|
||||||
SetContext = 'setContext'
|
SetContext = 'setContext'
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user