From 09b725078071c5527c7bd721b4e27c1d9956c919 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:17:22 -0800 Subject: [PATCH 01/38] Add changes for resources-api --- api/src/auth/README.md | 74 +++++++++++ .../AzureResourcesApiRequestContext.ts | 29 +++++ api/src/auth/apiRequest/apiRequest.ts | 120 ++++++++++++++++++ api/src/auth/apiRequest/apiRequestErrors.ts | 50 ++++++++ .../AzExtCredentialManager.ts | 16 +++ .../AzExtUUIDCredentialManager.ts | 35 +++++ api/src/extensionApi.ts | 8 ++ api/src/index.ts | 5 +- api/src/utils/apiUtils.ts | 21 +-- api/src/utils/maskValue.ts | 15 +++ 10 files changed, 362 insertions(+), 11 deletions(-) create mode 100644 api/src/auth/README.md create mode 100644 api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts create mode 100644 api/src/auth/apiRequest/apiRequest.ts create mode 100644 api/src/auth/apiRequest/apiRequestErrors.ts create mode 100644 api/src/auth/credentialManager/AzExtCredentialManager.ts create mode 100644 api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts create mode 100644 api/src/utils/maskValue.ts diff --git a/api/src/auth/README.md b/api/src/auth/README.md new file mode 100644 index 000000000..b6d70f609 --- /dev/null +++ b/api/src/auth/README.md @@ -0,0 +1,74 @@ +# Azure Resources Authentication and API Retrieval + +This guide covers the Azure Resources authentication handshake required for API retrieval by client extensions. It also provides information on the tools available to help client extensions quickly onboard to the new flow. + +## The Authentication Handshake + +### Overview + +Azure Resources APIs are protected behind the new v4 authentication layer. This layer exposes two methods that client extensions must use to gain access: `createAzureResourcesApiSession` and `getAzureResourcesApis`. During activation, client extensions are expected to export an API including a receiver method called `receiveAzureResourcesApiSession` before initiating the API request handshake. + +### Steps + +1. On activation, the client extension should export its API and initiate the handshake by calling `createAzureResourcesApiSession`. The client extension should provide its own verification credential as part of this request (more on this later). +1. The Azure Resources host extension verifies that the requesting extension is on its approved list. If approved, Azure Resources does not respond directly. Instead, it retrieves the extension's API from VS Code directly using the approved extension ID, then delivers the session credential via the `receiveAzureResourcesApiSession` receiver method. This ensures the credential reaches the approved recipient, even if a malicious actor tried to initiate the request. Azure Resources also returns the original client credential so the client extension can verify that it is communicating with the genuine Azure Resources extension and not a pretend actor. +1. The client extension should then use the credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. + +### Diagram + +![Azure Resources Handshake Diagram](../../docs/media/auth/azure-resources-handshake.png) + +## Automating the Handshake + +To simplify the handshake process and reduce boilerplate code, the following tools are made available and outlined below. + +### The API Request + +Create your extension's API (`AzureExtensionApi`) and pass it along with the requisite request context (`AzureResourcesApiRequestContext`). We'll explore how to populate this context in the section that follows. + +The `prepareAzureResourcesApiRequest` tool that we provide performs two key operations: + +1. **Prepares client extension API** - Returns your modified client extension API with the required `receiveAzureResourcesApiSession` receiver method added. +2. **Provides handshake initializer** - Returns a function that initiates the Resources API request handshake when called. Call this before exporting your API during extension activation. + +```ts +const containerAppsApi: api.AzureContainerAppsExtensionApi = { + apiVersion: '1.0.0', + deployImage: deployImageApi, + deployWorkspaceProject: deployWorkspaceProjectApi, +}; + +const { clientApi, requestResourcesApis } = prepareAzureResourcesApiRequest(context, containerAppsApi); +requestResourcesApis(); +return createApiProvider([clientApi]); +``` + +### The API Request Context + +The following example shows how to configure the context when preparing for an Azure Resources API handshake request. + +```ts +const context: AzureResourcesApiRequestContext = { + azureResourcesApiVersions: ['2.0.0'], + clientExtensionId: ext.context.extension.id, + onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | undefined)[]) => { + const [rgApiV2] = azureResourcesApis; + if (!rgApiV2) { + throw new Error(localize('failedHostIntegration', 'Failed to integrate with the Azure Resources host.')); + } + ext.rgApiV2 = rgApiV2; + ext.rgApiV2.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ContainerAppsEnvironment, ext.branchDataProvider); + }, + // Optional - use for special error handling or telemetry logging + onHandshakeError: (error: AzureResourcesHandshakeError) => { + switch (true) { + case error.code === AzureResourcesHandshakeErrors.CLIENT_FAILED_CREATE_CREDENTIAL.code: + case error.code === AzureResourcesHandshakeErrors.HOST_CREATE_SESSION_FAILED.code: + case error.code === AzureResourcesHandshakeErrors.CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS.code: + case error.code === AzureResourcesHandshakeErrors.CLIENT_CREDENTIAL_FAILED_VERIFICATION.code: + case error.code === AzureResourcesHandshakeErrors.HOST_API_PROVISIONING_FAILED.code: + default: + } + }, +}; +``` diff --git a/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts b/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts new file mode 100644 index 000000000..de7b06460 --- /dev/null +++ b/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { AzureResourcesExtensionApi } from "../../extensionApi"; +import { AzureExtensionApi } from "../../utils/apiUtils"; +import { AzureResourcesApiRequestError } from "./apiRequestErrors"; + +export interface AzureResourcesApiRequestContext { + clientExtensionId: string; + azureResourcesApiVersions: string[]; + + /** + * Callback invoked when Azure Resource APIs are successfully obtained through the authentication handshake. + * + * @param azureResourcesApis - Array of APIs corresponding to the requested versions. APIs are returned in the same + * order as provided in this request context. If a requested version is not + * available or does not match, `undefined` will be returned at that position. + */ + onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | AzureExtensionApi | undefined)[]) => void | Promise; + + /** + * Optional callback invoked when an error occurs during the Azure Resources API handshake process. + * + * @param error - The error that occurred during the handshake, containing an error code and message. + */ + onApiRequestError?: (error: AzureResourcesApiRequestError) => void | Promise; +} diff --git a/api/src/auth/apiRequest/apiRequest.ts b/api/src/auth/apiRequest/apiRequest.ts new file mode 100644 index 000000000..2a6beca51 --- /dev/null +++ b/api/src/auth/apiRequest/apiRequest.ts @@ -0,0 +1,120 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { l10n } from "vscode"; +import { AzureResourcesExtensionAuthApi } from "../../extensionApi"; +import { apiUtils, AzureExtensionApi } from "../../utils/apiUtils"; +import { AzExtCredentialManager } from "../credentialManager/AzExtCredentialManager"; +import { AzExtUUIDCredentialManager } from "../credentialManager/AzExtUUIDCredentialManager"; +import { AzureResourcesApiRequestContext } from "./AzureResourcesApiRequestContext"; +import { AzureResourcesApiRequestErrors } from "./apiRequestErrors"; + +const azureResourcesAuthApiVersion: string = '4.0.0'; +const azureResourcesExtId = 'ms-azuretools.vscode-azureresourcegroups'; + +export type AzureResourcesApiRequestPrep = { + /** + * The modified client extension API. Ensures the required handshake receiver method has been added. + */ + clientApi: T & Required>; + + /** + * Initiates the authentication handshake required to obtain the Azure Resources API. + */ + requestResourcesApis: () => void; +}; + +/** + * Prepares a client extension for the Azure Resources authentication handshake. + * + * @param context - Prerequisite configuration and handlers to prepare the request + * @param clientExtensionApi - The base extension API to be modified + * @returns The modified client extension API (with the required receiver method added), and a method to initiate the handshake + */ +export function prepareAzureResourcesApiRequest(context: AzureResourcesApiRequestContext, clientExtensionApi: T): AzureResourcesApiRequestPrep { + if (!context.azureResourcesApiVersions.length) { + throw new Error('You must specify at least one Azure Resources API version.'); + } + + const clientCredentialManager: AzExtCredentialManager = new AzExtUUIDCredentialManager(); + + if (!clientExtensionApi.receiveAzureResourcesApiSession) { + clientExtensionApi.receiveAzureResourcesApiSession = createReceiveAzureResourcesApiSession(context, clientCredentialManager); + } + + return { + clientApi: clientExtensionApi as T & Required>, + requestResourcesApis: () => void requestAzureResourcesSession(context, clientCredentialManager, clientExtensionApi.apiVersion), + }; +} + +async function requestAzureResourcesSession(context: AzureResourcesApiRequestContext, clientCredentialManager: AzExtCredentialManager, clientApiVersion: string): Promise { + let clientCredential: string; + try { + clientCredential = await clientCredentialManager.createCredential(context.clientExtensionId); + } catch (err) { + if (err instanceof Error) { + await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.CLIENT_FAILED_CREATE_CREDENTIAL.code, message: clientCredentialManager.maskCredentials(err.message) }) + } + return; + } + + try { + const resourcesApi = await getClientExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); + await resourcesApi.createAzureResourcesApiSession(context.clientExtensionId, clientApiVersion, clientCredential); + } catch (err) { + if (err instanceof Error) { + await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.HOST_CREATE_SESSION_FAILED.code, message: clientCredentialManager.maskCredentials(err.message) }); + } + return; + } +} + +function createReceiveAzureResourcesApiSession(context: AzureResourcesApiRequestContext, clientCredentialManager: AzExtCredentialManager): AzureExtensionApi['receiveAzureResourcesApiSession'] { + return async function (azureResourcesCredential: string, clientCredential: string): Promise { + if (!azureResourcesCredential || !clientCredential) { + await context.onApiRequestError?.(AzureResourcesApiRequestErrors.CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS); + return; + } + + try { + const verified = await clientCredentialManager.verifyCredential(clientCredential, context.clientExtensionId); + if (!verified) { + throw new Error('Client credential returned did not pass verification.'); + } + } catch (err) { + if (err instanceof Error) { + await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.CLIENT_CREDENTIAL_FAILED_VERIFICATION.code, message: clientCredentialManager.maskCredentials(err.message) }); + } + return; + } + + try { + const resourcesAuthApi = await getClientExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); + const resourcesApis = await resourcesAuthApi.getAzureResourcesApi(context.clientExtensionId, azureResourcesCredential, context.azureResourcesApiVersions) ?? []; + + if (!resourcesApis.length) { + throw new Error('Azure Resources responded with no available APIs.'); + } + + await context.onDidReceiveAzureResourcesApis(resourcesApis); + + } catch (err) { + if (err instanceof Error) { + await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.HOST_API_PROVISIONING_FAILED.code, message: clientCredentialManager.maskCredentials(err.message) }); + } + return; + } + } +} + +async function getClientExtensionApi(clientExtensionId: string, clientExtensionVersion: string): Promise { + const extensionProvider = await apiUtils.getExtensionExports(clientExtensionId); + if (extensionProvider) { + return extensionProvider.getApi(clientExtensionVersion); + } else { + throw new Error(l10n.t('Could not find Azure extension API for extension "{0}".', clientExtensionId)); + } +} diff --git a/api/src/auth/apiRequest/apiRequestErrors.ts b/api/src/auth/apiRequest/apiRequestErrors.ts new file mode 100644 index 000000000..969799f97 --- /dev/null +++ b/api/src/auth/apiRequest/apiRequestErrors.ts @@ -0,0 +1,50 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * List of errors that could occur during the authentication handshake between client extension and Azure Resources host extension. + */ +export const AzureResourcesApiRequestErrors = { + + /** + * An error occurred while the client extension was creating its verification credential for the Azure Resources host extension. + */ + CLIENT_FAILED_CREATE_CREDENTIAL: { code: 'ERR_CLIENT_FAILED_CREATE_CREDENTIAL' }, + + /** + * An error occurred while the Azure Resources host extension was trying to create an API session. + */ + HOST_CREATE_SESSION_FAILED: { code: 'ERR_HOST_CREATE_SESSION_FAILED' }, + + /** + * An error occurred because the client's receiver method was provided incomplete or missing credentials. + */ + CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS: { + code: 'ERR_CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS', + message: 'Insufficient credentials were provided back to the client.', + }, + + /** + * The client's receiver method was provided a client credential that failed verification. + * + * This may occur when: + * - An untrusted extension pretends to be the Azure Resources host extension and tries to pass a fake credential + * - There is a faulty behavior in the client's verification process + */ + CLIENT_CREDENTIAL_FAILED_VERIFICATION: { code: 'ERR_CLIENT_CREDENTIAL_FAILED_VERIFICATION' }, + + /** + * An error occurred while asking the Azure Resources host extension to provision the specified APIs. + * + * This may occur when: + * - The Azure Resources extension cannot verify the issued credential that was passed back + * - The requesting extension is not on the Azure Resources allow list + * - The host extension encounters an internal error during API provisioning + */ + HOST_API_PROVISIONING_FAILED: { code: 'ERR_HOST_API_PROVISIONING_FAILED' }, + +} as const; + +export type AzureResourcesApiRequestError = Omit & { message: string }; diff --git a/api/src/auth/credentialManager/AzExtCredentialManager.ts b/api/src/auth/credentialManager/AzExtCredentialManager.ts new file mode 100644 index 000000000..3a126e430 --- /dev/null +++ b/api/src/auth/credentialManager/AzExtCredentialManager.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface AzExtCredentialManager { + createCredential(extensionId: string): string | Promise; + verifyCredential(credential: string, extensionId?: string): boolean | Promise; + + /** + * Masks sensitive information from a given string to ensure private credential management keys from the manager are not exposed. + * @param data - The string to be processed. + * @returns The same string stripped of any sensitive credentials. + */ + maskCredentials(data: string): string; +} diff --git a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts new file mode 100644 index 000000000..b5c6eb67e --- /dev/null +++ b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as crypto from "crypto"; +import { maskValue } from "../../utils/maskValue"; +import { AzExtCredentialManager } from "./AzExtCredentialManager"; + +/** + * A simple, light-weight credential manager that issues and tracks randomly generated UUIDs for extension verification. + */ +export class AzExtUUIDCredentialManager implements AzExtCredentialManager { + private _uuidMap: Map = new Map(); + + createCredential(extensionId: string): string { + const uuid: string = crypto.randomUUID(); + this._uuidMap.set(extensionId, uuid); + return uuid; + } + + verifyCredential(credential: string, extensionId: string): boolean { + if (!credential || !extensionId) { + return false; + } + return credential === this._uuidMap.get(extensionId); + } + + maskCredentials(data: string): string { + for (const uuid of this._uuidMap.values()) { + data = maskValue(data, uuid); + } + return data; + } +} diff --git a/api/src/extensionApi.ts b/api/src/extensionApi.ts index b4738eb92..d0f29ddb5 100644 --- a/api/src/extensionApi.ts +++ b/api/src/extensionApi.ts @@ -12,3 +12,11 @@ import { AzureExtensionApi } from "./utils/apiUtils"; export interface AzureResourcesExtensionApi extends AzureExtensionApi { resources: ResourcesApi; } + +/** + * The authentication layer (v4) protecting the core Azure Resources extension API. + */ +export interface AzureResourcesExtensionAuthApi extends AzureExtensionApi { + getAzureResourcesApi(clientExtensionId: string, azureResourcesCredential: string, azureResourceApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[] | undefined>; + createAzureResourcesApiSession(clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise; +} diff --git a/api/src/index.ts b/api/src/index.ts index 00542d7b5..a5d0cb8bd 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -3,13 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +export * from './auth/apiRequest/apiRequest'; +export * from './auth/apiRequest/apiRequestErrors'; +export * from './auth/apiRequest/AzureResourcesApiRequestContext'; export * from './AzExtResourceType'; export * from './extensionApi'; export * from './getAzExtResourceType'; export * from './resources/azure'; export * from './resources/base'; -export * from './resources/resourcesApi'; export * from './resources/workspace'; export * from './utils/apiUtils'; export * from './utils/getApi'; export * from './utils/wrapper'; + diff --git a/api/src/utils/apiUtils.ts b/api/src/utils/apiUtils.ts index d5e9910a3..f0223e0ad 100644 --- a/api/src/utils/apiUtils.ts +++ b/api/src/utils/apiUtils.ts @@ -10,6 +10,15 @@ export interface AzureExtensionApi { * The API version for this extension. It should be versioned separately from the extension and ideally remains backwards compatible. */ apiVersion: string; + /** + * Optional endpoint that Azure client extensions should implement in order to receive Azure Resources API sessions. + * Todo: Add reference to auth readme + * + * @param azureResourcesCredential - The credential to use when requesting the Azure Resources API + * @param clientCredential - The client verification credential initially generated by the client and passed to the Azure Resources API when requesting for a new session. + * This token is used to verify that the real Azure Resources extension is the one providing the session credential. + */ + receiveAzureResourcesApiSession?(azureResourcesCredential: string, clientCredential: string): void | Promise; } export interface GetApiOptions { @@ -61,20 +70,12 @@ export namespace apiUtils { } /** - * Get extension exports for the extension with the given id. Activates extension first if needed. + * Activates an extension and returns its exports. * * @returns `undefined` if the extension is not installed */ export async function getExtensionExports(extensionId: string): Promise { const extension: vscode.Extension | undefined = vscode.extensions.getExtension(extensionId); - if (extension) { - if (!extension.isActive) { - await extension.activate(); - } - - return extension.exports; - } - - return undefined; + return await extension?.activate(); } } diff --git a/api/src/utils/maskValue.ts b/api/src/utils/maskValue.ts new file mode 100644 index 000000000..8cdc172cd --- /dev/null +++ b/api/src/utils/maskValue.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// Sourced from the utils shared package +export function maskValue(data: string, valueToMask: string | undefined): string { + if (valueToMask) { + const formsOfValue: string[] = [valueToMask, encodeURIComponent(valueToMask)]; + for (const v of formsOfValue) { + data = data.replace(new RegExp(escape(v), 'gi'), '---'); + } + } + return data; +} From 37147d34463985f15864ceb3e0b88b82ed1c34e3 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:39:01 -0800 Subject: [PATCH 02/38] Add changes to Azure Resources --- api/src/index.ts | 1 + package-lock.json | 8 +- package.json | 2 +- src/api/auth/authApiInternal.ts | 68 +++++++++++ .../createAzureResourcesAuthApiFactory.ts | 60 ++++++++++ src/extension.ts | 109 ++++++++++-------- src/hostapi.v2.internal.ts | 5 + src/hostapi.v4.internal.ts | 8 ++ 8 files changed, 211 insertions(+), 50 deletions(-) create mode 100644 src/api/auth/authApiInternal.ts create mode 100644 src/api/auth/createAzureResourcesAuthApiFactory.ts create mode 100644 src/hostapi.v4.internal.ts diff --git a/api/src/index.ts b/api/src/index.ts index a5d0cb8bd..83e9eb443 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -11,6 +11,7 @@ export * from './extensionApi'; export * from './getAzExtResourceType'; export * from './resources/azure'; export * from './resources/base'; +export * from './resources/resourcesApi'; export * from './resources/workspace'; export * from './utils/apiUtils'; export * from './utils/getApi'; diff --git a/package-lock.json b/package-lock.json index 2a905869b..f66d40304 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "@azure/arm-resources-profile-2020-09-01-hybrid": "^2.1.0", "@microsoft/vscode-azext-azureauth": "^5.1.1", "@microsoft/vscode-azext-azureutils": "^4.0.0", - "@microsoft/vscode-azext-utils": "^4.0.0", + "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-4.0.1.tgz", "buffer": "^6.0.3", "form-data": "^4.0.4", "fs-extra": "^11.3.0", @@ -1068,9 +1068,9 @@ } }, "node_modules/@microsoft/vscode-azext-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@microsoft/vscode-azext-utils/-/vscode-azext-utils-4.0.0.tgz", - "integrity": "sha512-c5e4LD8Xkir6KqAVzIF0f+u1w/QDH7b3AFgYYcWqPyYN0HVp+YCvI97zP1uqb/YzZFTYjr2NbO54xgtftsePAA==", + "version": "4.0.1", + "resolved": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-4.0.1.tgz", + "integrity": "sha512-X8E/8aVwyVvUVe5QB/u0I9sXw4q7+WaDPUZ1nqAP3Gb5zHJNJi1F51sZbGzhq6J2GAitZfC61HLDqtyXr5iSsA==", "license": "MIT", "dependencies": { "@microsoft/vscode-azureresources-api": "^3.0.0", diff --git a/package.json b/package.json index db85557d4..bdc3d74c2 100644 --- a/package.json +++ b/package.json @@ -946,7 +946,7 @@ "@azure/arm-resources-profile-2020-09-01-hybrid": "^2.1.0", "@microsoft/vscode-azext-azureauth": "^5.1.1", "@microsoft/vscode-azext-azureutils": "^4.0.0", - "@microsoft/vscode-azext-utils": "^4.0.0", + "@microsoft/vscode-azext-utils": "file:../vscode-azuretools/utils/microsoft-vscode-azext-utils-4.0.1.tgz", "buffer": "^6.0.3", "form-data": "^4.0.4", "fs-extra": "^11.3.0", diff --git a/src/api/auth/authApiInternal.ts b/src/api/auth/authApiInternal.ts new file mode 100644 index 000000000..6036655cb --- /dev/null +++ b/src/api/auth/authApiInternal.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IActionContext, IParsedError, maskUserInfo, parseError } from '@microsoft/vscode-azext-utils'; +import { l10n } from 'vscode'; +import { AzExtCredentialManager } from '../../../api/src/auth/credentialManager/AzExtCredentialManager'; +import { apiUtils } from '../../../api/src/utils/apiUtils'; +import { ext } from '../../extensionVariables'; +import { localize } from '../../utils/localize'; + +const allowedExtensionIds = [ + // Todo: Add remainder of extension ids + 'ms-azuretools.vscode-azurefunctions', + 'ms-azuretools.vscode-azurecontainerapps', +]; + +export async function createAzureResourcesApiSessionInternal(context: IActionContext, credentialManager: AzExtCredentialManager, clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise { + context.telemetry.properties.clientExtensionId = clientExtensionId; + context.telemetry.properties.clientExtensionVersion = clientExtensionVersion; + + if (!allowedExtensionIds.includes(clientExtensionId)) { + context.telemetry.properties.allowedExtension = 'false'; + ext.outputChannel.warn(localize('createResourcesApiSession.denied', 'Azure Resources API session denied for extension "{0}".', clientExtensionId)); + throw new Error('🧙 No, thank you! We don\'t want any more visitors, well-wishers, or distant relations! 🧝🦶'); + } + + context.telemetry.properties.allowedExtension = 'true'; + + try { + const clientApi = await apiUtils.getAzureExtensionApi(ext.context, clientExtensionId, clientExtensionVersion); + await clientApi.receiveAzureResourcesApiSession?.(await credentialManager.createCredential(clientExtensionId), clientExtensionCredential); + } catch (err) { + const failed: string = localize('createResourcesApiSession.failed', 'Failed to create Azure Resources API session for extension "{0}".', clientExtensionId); + ext.outputChannel.error(failed); + + const perr: IParsedError = parseError(err); + const perrMessage: string = credentialManager.maskCredentials(perr.message); + context.telemetry.properties.createResourcesApiSessionError = maskUserInfo(perrMessage, []); + ext.outputChannel.error(perrMessage); + throw new Error(failed); + } +} + +export async function verifyAzureResourcesApiSessionInternal(context: IActionContext, credentialManager: AzExtCredentialManager, clientExtensionId: string, azureResourcesCredential: string): Promise { + const getApiVerifyError: string = `${clientExtensionId || 'Unknown Extension'} - 🧙 YOU SHALL NOT PASS! 🔥`; + + if (!clientExtensionId || !azureResourcesCredential) { + context.telemetry.properties.deniedReason = 'missingDetails'; + throw new Error(getApiVerifyError); + } + + context.telemetry.properties.clientExtensionId = clientExtensionId; + + let verified: boolean | undefined; + try { + verified = await credentialManager.verifyCredential(azureResourcesCredential, clientExtensionId); + } catch { /** Skip; handle below */ } + + if (!verified) { + context.telemetry.properties.deniedReason = 'failedVerification'; + ext.outputChannel.warn(l10n.t('Extension claiming to be "{0}" provided an access token that failed verification.', clientExtensionId)); + throw new Error(getApiVerifyError); + } + + return verified; +} diff --git a/src/api/auth/createAzureResourcesAuthApiFactory.ts b/src/api/auth/createAzureResourcesAuthApiFactory.ts new file mode 100644 index 000000000..c74b3fdea --- /dev/null +++ b/src/api/auth/createAzureResourcesAuthApiFactory.ts @@ -0,0 +1,60 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { apiUtils, AzureExtensionApiFactory, callWithTelemetryAndErrorHandling, GetApiOptions, IActionContext } from '@microsoft/vscode-azext-utils'; +import { AzExtCredentialManager } from '../../../api/src/auth/credentialManager/AzExtCredentialManager'; +import { AzExtUUIDCredentialManager } from '../../../api/src/auth/credentialManager/AzExtUUIDCredentialManager'; +import { AzureResourcesAuthApiInternal } from '../../hostapi.v4.internal'; +import { createAzureResourcesApiSessionInternal, verifyAzureResourcesApiSessionInternal } from './authApiInternal'; + +const v4: string = '4.0.0'; + +export function createAzureResourcesAuthApiFactory(coreApiProvider: apiUtils.AzureExtensionApiProvider): AzureExtensionApiFactory { + const credentialManager: AzExtCredentialManager = new AzExtUUIDCredentialManager(); + + return { + apiVersion: v4, + createApi: (options?: GetApiOptions) => { + return { + apiVersion: v4, + getAzureResourcesApi: async (clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]) => { + return await callWithTelemetryAndErrorHandling('api.getAzureResourcesApi', async (context: IActionContext) => { + addTelemetryAndErrorHandling(context, options?.extensionId); + + const verified: boolean = await verifyAzureResourcesApiSessionInternal(context, credentialManager, clientExtensionId, azureResourcesCredential); + if (!verified) { + return []; + } + + return azureResourcesApiVersions + .map((apiVersion) => { + try { + return coreApiProvider.getApi(apiVersion, options); + } catch { + return undefined; + } + }); + + }) ?? []; + }, + createAzureResourcesApiSession: async (clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string) => { + return await callWithTelemetryAndErrorHandling('api.createAzureResourcesApiSession', async (context: IActionContext) => { + addTelemetryAndErrorHandling(context, options?.extensionId); + return await createAzureResourcesApiSessionInternal(context, credentialManager, clientExtensionId, clientExtensionVersion, clientExtensionCredential); + }); + }, + }; + }, + }; +} + +function addTelemetryAndErrorHandling(context: IActionContext, extensionId?: string): void { + context.telemetry.properties.callingExtensionId = extensionId; + context.telemetry.properties.isActivationEvent = 'true'; + context.telemetry.properties.apiVersion = v4; + context.errorHandling.rethrow = true; + context.errorHandling.suppressDisplay = true; + context.errorHandling.suppressReportIssue = true; +} diff --git a/src/extension.ts b/src/extension.ts index d54299e38..e92316d25 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -14,6 +14,7 @@ import { AzExtResourceType } from '../api/src/AzExtResourceType'; import { DefaultAzureResourceProvider } from './api/DefaultAzureResourceProvider'; import { ResourceGroupsExtensionManager } from './api/ResourceGroupsExtensionManager'; import { ActivityLogResourceProviderManager, AzureResourceProviderManager, TenantResourceProviderManager, WorkspaceResourceProviderManager } from './api/ResourceProviderManagers'; +import { createAzureResourcesAuthApiFactory } from './api/auth/createAzureResourcesAuthApiFactory'; import { InternalAzureResourceGroupsExtensionApi } from './api/compatibility/AzureResourceGroupsExtensionApi'; import { CompatibleAzExtTreeDataProvider } from './api/compatibility/CompatibleAzExtTreeDataProvider'; import { createCompatibilityPickAppResource } from './api/compatibility/pickAppResource'; @@ -117,6 +118,9 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo registerLMTools(); }); + const v2: string = '2.0.0'; + const v3: string = '3.0.0'; + const extensionManager = new ResourceGroupsExtensionManager() const azureResourceBranchDataProviderManager = new AzureResourceBranchDataProviderManager( @@ -175,12 +179,12 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo refreshEvent: refreshActivityLogTreeEmitter.event }); - const v2ApiFactory: AzureExtensionApiFactory = { - apiVersion: '2.0.0', + const azureResourcesV2ApiFactory: AzureExtensionApiFactory = { + apiVersion: v2, createApi: (options?: GetApiOptions) => { return createWrappedAzureResourcesExtensionApi( { - apiVersion: '2.0.0', + apiVersion: v2, resources: createAzureResourcesHostApi( azureResourceProviderManager, azureResourceBranchDataProviderManager, @@ -198,7 +202,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo } }; - ext.v2.api = v2ApiFactory.createApi({ extensionId: 'ms-azuretools.vscode-azureresourcegroups' }); + ext.v2.api = azureResourcesV2ApiFactory.createApi({ extensionId: 'ms-azuretools.vscode-azureresourcegroups' }); ext.managedIdentityBranchDataProvider = new ManagedIdentityBranchDataProvider(); ext.v2.api.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ManagedIdentityUserAssignedIdentities, ext.managedIdentityBranchDataProvider); @@ -211,49 +215,64 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo const getSubscriptions: (filter: boolean) => Promise = async (filter: boolean) => { return await (await ext.subscriptionProviderFactory()).getSubscriptions(filter) }; + const azureResourcesInternalApiFactory: AzureExtensionApiFactory = { + apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, + createApi: () => new InternalAzureResourceGroupsExtensionApi({ + apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, + appResourceTree: ext.appResourceTree, + appResourceTreeView: ext.appResourceTreeView, + workspaceResourceTree: ext.workspaceTree, + workspaceResourceTreeView: ext.workspaceTreeView, + registerApplicationResourceResolver, + registerWorkspaceResourceProvider, + registerActivity, + pickAppResource: createCompatibilityPickAppResource(), + getSubscriptions, + }), + }; + + /** + * This is a temporary API and will be removed in a future version once the staged introduction + * of the "DocumentDB for VS Code" extension is complete. + * + * The 3.0.0 API is *NOT* backward-compatible with 2.0.0 on purpose to prevent API users from upgrading to this + * temporary API. + * + * Its primary purpose is to support the user migration from the Azure Databases extension to the Azure DocumentDB extension. + * It provides a feature flag that allows dependent extensions (e.g., `vscode-cosmosdb`, `vscode-documentdb`) to detect + * when this new functionality is available. + * + * This API-based signal is necessary due to a staged rollout, allowing users time to upgrade. + * Dependent extensions should rely on this API signal rather than the extension version. + * + * This temporary API will be removed in a future version once the migration is complete. + * See: https://github.com/microsoft/vscode-azureresourcegroups/pull/1223 + */ + const azureResourcesV3ApiFactory: AzureExtensionApiFactory = { + apiVersion: v3, + createApi: () => { + return { + apiVersion: v3, + isDocumentDbExtensionSupportEnabled: () => true, + }; + }, + }; + + const coreApiProvider: apiUtils.AzureExtensionApiProvider = createApiProvider([ + azureResourcesInternalApiFactory, + azureResourcesV2ApiFactory, + azureResourcesV3ApiFactory, + ]); + return createApiProvider( [ - { - apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, - createApi: () => new InternalAzureResourceGroupsExtensionApi({ - apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, - appResourceTree: ext.appResourceTree, - appResourceTreeView: ext.appResourceTreeView, - workspaceResourceTree: ext.workspaceTree, - workspaceResourceTreeView: ext.workspaceTreeView, - registerApplicationResourceResolver, - registerWorkspaceResourceProvider, - registerActivity, - pickAppResource: createCompatibilityPickAppResource(), - getSubscriptions, - }), - }, - v2ApiFactory, - /** - * This is a temporary API and will be removed in a future version once the staged introduction - * of the "DocumentDB for VS Code" extension is complete. - * - * The 3.0.0 API is *NOT* backward-compatible with 2.0.0 on purpose to prevent API users from upgrading to this - * temporary API. - * - * Its primary purpose is to support the user migration from the Azure Databases extension to the Azure DocumentDB extension. - * It provides a feature flag that allows dependent extensions (e.g., `vscode-cosmosdb`, `vscode-documentdb`) to detect - * when this new functionality is available. - * - * This API-based signal is necessary due to a staged rollout, allowing users time to upgrade. - * Dependent extensions should rely on this API signal rather than the extension version. - * - * This temporary API will be removed in a future version once the migration is complete. - */ - { - apiVersion: "3.0.0", - createApi: () => { - return { - apiVersion: "3.0.0", - isDocumentDbExtensionSupportEnabled: () => true, - }; - }, - } as AzureExtensionApi + // Todo: Remove once extension clients finish migrating + azureResourcesInternalApiFactory, + azureResourcesV2ApiFactory, + azureResourcesV3ApiFactory, + + // This will eventually be the only part of the API exposed publically + createAzureResourcesAuthApiFactory(coreApiProvider), ] ); } diff --git a/src/hostapi.v2.internal.ts b/src/hostapi.v2.internal.ts index d0f409886..fd55855cb 100644 --- a/src/hostapi.v2.internal.ts +++ b/src/hostapi.v2.internal.ts @@ -1,3 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + import { ActivityApi } from '@microsoft/vscode-azext-utils/activity'; import * as vscode from 'vscode'; import { AzureResource, AzureResourcesExtensionApi, AzureSubscription, ResourceProvider, ResourcesApi } from "../api/src/index"; diff --git a/src/hostapi.v4.internal.ts b/src/hostapi.v4.internal.ts new file mode 100644 index 000000000..cd0a0fb1d --- /dev/null +++ b/src/hostapi.v4.internal.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { AzureResourcesExtensionAuthApi } from "../api/src/index"; + +export type AzureResourcesAuthApiInternal = AzureResourcesExtensionAuthApi; From 9920f418b85300a65f04ccf014135e3177355434 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:45:43 -0800 Subject: [PATCH 03/38] Add todo --- api/src/auth/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/auth/README.md b/api/src/auth/README.md index b6d70f609..300c21085 100644 --- a/api/src/auth/README.md +++ b/api/src/auth/README.md @@ -15,7 +15,7 @@ Azure Resources APIs are protected behind the new v4 authentication layer. This 1. The client extension should then use the credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. ### Diagram - + ![Azure Resources Handshake Diagram](../../docs/media/auth/azure-resources-handshake.png) ## Automating the Handshake From 611ab51f554b6b2ca5af54710bb8b08201a787c4 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:56:23 -0800 Subject: [PATCH 04/38] Some nits --- api/src/extensionApi.ts | 2 +- api/src/utils/maskValue.ts | 2 +- src/api/auth/createAzureResourcesAuthApiFactory.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/src/extensionApi.ts b/api/src/extensionApi.ts index d0f29ddb5..7030d6496 100644 --- a/api/src/extensionApi.ts +++ b/api/src/extensionApi.ts @@ -17,6 +17,6 @@ export interface AzureResourcesExtensionApi extends AzureExtensionApi { * The authentication layer (v4) protecting the core Azure Resources extension API. */ export interface AzureResourcesExtensionAuthApi extends AzureExtensionApi { - getAzureResourcesApi(clientExtensionId: string, azureResourcesCredential: string, azureResourceApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[] | undefined>; + getAzureResourcesApi(clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[] | undefined>; createAzureResourcesApiSession(clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise; } diff --git a/api/src/utils/maskValue.ts b/api/src/utils/maskValue.ts index 8cdc172cd..7cd96f1f8 100644 --- a/api/src/utils/maskValue.ts +++ b/api/src/utils/maskValue.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// Sourced from the utils shared package +// Sourced from @microsoft/vscode-azext-utils export function maskValue(data: string, valueToMask: string | undefined): string { if (valueToMask) { const formsOfValue: string[] = [valueToMask, encodeURIComponent(valueToMask)]; diff --git a/src/api/auth/createAzureResourcesAuthApiFactory.ts b/src/api/auth/createAzureResourcesAuthApiFactory.ts index c74b3fdea..f82b724fc 100644 --- a/src/api/auth/createAzureResourcesAuthApiFactory.ts +++ b/src/api/auth/createAzureResourcesAuthApiFactory.ts @@ -21,7 +21,7 @@ export function createAzureResourcesAuthApiFactory(coreApiProvider: apiUtils.Azu apiVersion: v4, getAzureResourcesApi: async (clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]) => { return await callWithTelemetryAndErrorHandling('api.getAzureResourcesApi', async (context: IActionContext) => { - addTelemetryAndErrorHandling(context, options?.extensionId); + setTelemetryAndErrorHandling(context, options?.extensionId); const verified: boolean = await verifyAzureResourcesApiSessionInternal(context, credentialManager, clientExtensionId, azureResourcesCredential); if (!verified) { @@ -41,7 +41,7 @@ export function createAzureResourcesAuthApiFactory(coreApiProvider: apiUtils.Azu }, createAzureResourcesApiSession: async (clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string) => { return await callWithTelemetryAndErrorHandling('api.createAzureResourcesApiSession', async (context: IActionContext) => { - addTelemetryAndErrorHandling(context, options?.extensionId); + setTelemetryAndErrorHandling(context, options?.extensionId); return await createAzureResourcesApiSessionInternal(context, credentialManager, clientExtensionId, clientExtensionVersion, clientExtensionCredential); }); }, @@ -50,7 +50,7 @@ export function createAzureResourcesAuthApiFactory(coreApiProvider: apiUtils.Azu }; } -function addTelemetryAndErrorHandling(context: IActionContext, extensionId?: string): void { +function setTelemetryAndErrorHandling(context: IActionContext, extensionId?: string): void { context.telemetry.properties.callingExtensionId = extensionId; context.telemetry.properties.isActivationEvent = 'true'; context.telemetry.properties.apiVersion = v4; From 2f5d1462849e1523936c1dcb8f91949d19cefbb5 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:53:30 -0800 Subject: [PATCH 05/38] Misc changes --- api/README.md | 3 ++- api/docs/media/api-request-handshake.png | Bin 0 -> 146830 bytes api/src/auth/README.md | 12 ++++++++---- api/src/auth/apiRequest/apiRequest.ts | 2 +- api/src/utils/getApi.ts | 4 ++++ src/azureExtensions.ts | 14 +++++++++++++- 6 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 api/docs/media/api-request-handshake.png diff --git a/api/README.md b/api/README.md index 2d72af3a6..22c3c3cc7 100644 --- a/api/README.md +++ b/api/README.md @@ -221,7 +221,8 @@ This extension declares that it registers a BranchDataProvider for the `Function ## Getting started -On activation, client extensions can fetch an instance of the Azure Resources API using the `getAzureResourcesExtensionApi` utility provided by the [`@microsoft/vscode-azureresources-api`](https://www.npmjs.com/package/@microsoft/vscode-azureresources-api) package. +On activation, client extensions can fetch an instance of the Azure Resources API using utilities provided by the [`@microsoft/vscode-azureresources-api`](https://www.npmjs.com/package/@microsoft/vscode-azureresources-api) package. +For more information on fetching through the Azure Resources authentication layer, please consult this [guide](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md). ```ts import { getAzureResourcesExtensionApi } from '@microsoft/vscode-azureresources-api'; diff --git a/api/docs/media/api-request-handshake.png b/api/docs/media/api-request-handshake.png new file mode 100644 index 0000000000000000000000000000000000000000..701cf921a170d3d55708668e9b3984198a929ec9 GIT binary patch literal 146830 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 z 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

P(A+ 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: vscode.ExtensionContext, extensionId: string, apiVersionRange: string, options?: GetApiOptions): Promise; /** - * Activates an extension and returns its exports. + * Get extension exports for the extension with the given id. Activates extension first if needed. * * @returns `undefined` if the extension is not installed */ @@ -124,12 +124,12 @@ export declare interface AzureAuthentication { /** * Gets a VS Code authentication session for an Azure subscription. * - * @param scopeListOrRequest - The scopes for which the authentication is needed. Use AuthenticationWwwAuthenticateRequest for supporting challenge requests. - * Note: use of AuthenticationWwwAuthenticateRequest requires VS Code v1.105.0 + * @param scopes - The scopes for which the authentication is needed. Use AuthenticationWwwAuthenticateRequest for supporting challenge requests. + * Note: use of AuthenticationWwwAuthenticateRequest requires VS Code v1.104 * * @returns A VS Code authentication session or undefined, if none could be obtained. */ - getSessionWithScopes(scopeListOrRequest: string[] | vscode.AuthenticationWwwAuthenticateRequest): vscode.ProviderResult; + getSessionWithScopes(scopes: string[] | vscode.AuthenticationWwwAuthenticateRequest): vscode.ProviderResult; } export declare interface AzureExtensionApi { @@ -137,15 +137,6 @@ export declare interface AzureExtensionApi { * The API version for this extension. It should be versioned separately from the extension and ideally remains backwards compatible. */ apiVersion: string; - /** - * Optional endpoint which Azure client extensions should implement in order to receive an Azure Resources API session. - * See: https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md - * - * @param azureResourcesCredential - The credential to use when requesting the Azure Resources API - * @param clientCredential - The client verification credential initially generated by the client and passed to the Azure Resources API when requesting a new session. - * This credential is used to verify that the real Azure Resources extension is the one providing back the session credential. - */ - receiveAzureResourcesApiSession?(azureResourcesCredential: string, clientCredential: string): void | Promise; } /** @@ -211,94 +202,13 @@ export declare interface AzureResourceModel extends ResourceModelBase { readonly viewProperties?: ViewPropertiesModel; } -export declare interface AzureResourcesApiRequestContext { - clientExtensionId: string; - azureResourcesApiVersions: string[]; - /** - * Callback invoked when Azure Resource APIs are successfully obtained through the authentication handshake. - * - * @param azureResourcesApis - Array of APIs corresponding to the requested versions. APIs are returned in the same - * order as provided in this request context. If a requested version is not - * available or does not match, `undefined` will be returned at that position. - */ - onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | AzureExtensionApi | undefined)[]) => void | Promise; - /** - * Optional callback invoked when an error occurs during the Azure Resources API handshake process. - * - * @remarks Errors thrown during execution of this callback may be part of a separate process and may not bubble up to users. - * If you wish to surface specific errors to users, please consider logging them or using the VS Code API to display them through UI. - * - * @param error - The error that occurred during the handshake, containing an error code and message. - */ - onApiRequestError?: (error: AzureResourcesApiRequestError) => void | Promise; -} - -export declare type AzureResourcesApiRequestError = { - code: AzureResourcesApiRequestErrorCode; - message: string; -}; - -/** - * Codes for errors that could appear during the API request handshake between client extension and Azure Resources host extension. - */ -export declare enum AzureResourcesApiRequestErrorCode { - /** - * An error occurred while the client extension was creating its verification credential for the Azure Resources host extension. - */ - ClientFailedCreateCredential = "ERR_CLIENT_FAILED_CREATE_CREDENTIAL", - /** - * An error occurred while the Azure Resources host extension was trying to create an API session. - */ - HostCreateSessionFailed = "ERR_HOST_CREATE_SESSION_FAILED", - /** - * An error occurred because the client's receiver method was provided incomplete or missing credentials. - */ - ClientReceivedInsufficientCredentials = "ERR_CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS", - /** - * The client's receiver method was provided a client credential that failed verification. - * - * This may occur when: - * - An untrusted extension pretends to be the Azure Resources host extension and tries to pass a fake credential - * - There is a faulty behavior in the client's verification process - */ - ClientCredentialFailedVerification = "ERR_CLIENT_CREDENTIAL_FAILED_VERIFICATION", - /** - * An error occurred while asking the Azure Resources host extension to provision the specified APIs. - * - * This may occur when: - * - The Azure Resources extension cannot verify the issued credential that was passed back - * - The requesting extension is not on the Azure Resources allow list - * - The host extension encounters an internal error during API provisioning - */ - HostApiProvisioningFailed = "ERR_HOST_API_PROVISIONING_FAILED" -} - -export declare type AzureResourcesApiRequestPrep = { - /** - * The modified client extension API. Ensures the required handshake receiver method has been added. - */ - clientApi: T & Required>; - /** - * Initiates the authentication handshake required to obtain the Azure Resources API. - */ - requestResourcesApis: () => void; -}; - /** * The current (v2) Azure Resources extension API. */ -export declare interface AzureResourcesExtensionApi extends Omit { +export declare interface AzureResourcesExtensionApi extends AzureExtensionApi { resources: ResourcesApi; } -/** - * The authentication layer (v4) protecting the core Azure Resources extension API. - */ -export declare interface AzureResourcesExtensionAuthApi extends Omit { - getAzureResourcesApis(clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[]>; - createAzureResourcesApiSession(clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise; -} - /** * Represents a type of resource as designated by Azure. */ @@ -390,23 +300,10 @@ export declare function getAzExtResourceType(resource: { kind?: string; }): AzExtResourceType | undefined; -/** - * @deprecated The Azure Resources core API should be accessed through the new auth layer. - * See: https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md - * */ export declare function getAzureResourcesExtensionApi(extensionContext: vscode.ExtensionContext, apiVersionRange: '2.0.0', options?: GetApiOptions): Promise; export declare function isWrapper(maybeWrapper: unknown): maybeWrapper is Wrapper; -/** - * Prepares a client extension for the Azure Resources authentication handshake. - * - * @param context - Prerequisite configuration and handlers to prepare the request - * @param clientExtensionApi - The base extension API to be modified - * @returns The modified client extension API (with the required receiver method added), and a method to initiate the handshake - */ -export declare function prepareAzureResourcesApiRequest(context: AzureResourcesApiRequestContext, clientExtensionApi: T): AzureResourcesApiRequestPrep; - /** * Represents the base type for all Azure and workspace resources. */ @@ -598,4 +495,4 @@ export declare interface Wrapper { unwrap(): T; } -export { } +export { }; \ No newline at end of file diff --git a/api/src/auth/README.md b/api/src/auth/README.md deleted file mode 100644 index b4e6cdab1..000000000 --- a/api/src/auth/README.md +++ /dev/null @@ -1,85 +0,0 @@ -# Azure Resources Authentication and API Retrieval - -This guide covers the Azure Resources authentication handshake required for API retrieval by client extensions. It also provides information on the tools available to help client extensions quickly onboard to the new flow. - -## The Authentication Handshake - -### Overview - -Azure Resources APIs are protected behind the new v4 authentication layer. This layer exposes two methods that client extensions must use to gain access: `createAzureResourcesApiSession` and `getAzureResourcesApis`. During activation, client extensions are expected to export an API including a receiver method called `receiveAzureResourcesApiSession` before initiating the API request handshake. - -### Steps - -1. On activation, the client extension should export its API and initiate the handshake by calling `createAzureResourcesApiSession`. The client extension should provide its own verification credential as part of this request (more on this later). - -1. The Azure Resources host extension verifies that the requesting extension is on its approved list. If approved, Azure Resources does not respond directly. Instead, it retrieves the extension's API from VS Code directly using the approved extension ID, then delivers the session credential via the `receiveAzureResourcesApiSession` receiver method. This ensures the credential reaches the approved recipient, even if a malicious actor tried to initiate the request. Azure Resources also returns the original client credential so the client extension can verify that it is communicating with the genuine Azure Resources extension. - -1. The client extension should then use the Azure Resources credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. - -### Diagram -![Azure Resources API Request Handshake](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/docs/media/api-request-handshake.png) - -## Automating the Handshake - -To simplify the handshake process, the following tools are made available and outlined below. - -### The API Request - -Create your extension's API (`AzureExtensionApi`) and pass it along with the requisite request context (`AzureResourcesApiRequestContext`). We'll explore how to populate this context in the section that follows. - -The `prepareAzureResourcesApiRequest` tool that we provide performs two key operations: - -1. **Prepares client extension API** - Returns your modified client extension API with the required `receiveAzureResourcesApiSession` receiver method added. -2. **Provides handshake initializer** - Returns a function that initiates the Resources API request handshake when called. Call this before exporting your API during extension activation. - -```ts -const containerAppsApi: AzureExtensionApi = { - apiVersion: '1.0.0', -}; - -const { clientApi, requestResourcesApis } = prepareAzureResourcesApiRequest(context, containerAppsApi); -requestResourcesApis(); -return createApiProvider([clientApi]); -``` - -### The API Request Context - -The following example shows how to configure the context when preparing for an Azure Resources API handshake request. - -```ts -const v2: string = '^2.0.0'; - -const context: AzureResourcesApiRequestContext = { - azureResourcesApiVersions: [v2], - clientExtensionId: 'ms-azuretools.vscode-azurecontainerapps', - - // Successful retrieval of Azure Resources APIs will be returned here - onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | undefined)[]) => { - const [rgApiV2] = azureResourcesApis; - if (!rgApiV2) { - throw new Error(l10n.t('Failed to find a matching Azure Resources API for version "{0}".', v2)); - } - ext.rgApiV2 = rgApiV2; - ext.rgApiV2.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ContainerAppsEnvironment, ext.branchDataProvider); - }, - - // OPTIONAL: Can use for special error handling & telemetry - // NOTE: Errors thrown during execution of this callback may be part of a separate process and may not bubble up to users. - // If you wish to surface specific errors to users, please consider logging them or using the VS Code API to display them through UI. - onApiRequestError: async (error: AzureResourcesApiRequestError) => { - switch (true) { - case error.code === AzureResourcesApiRequestErrorCode.ClientFailedCreateCredential: - case error.code === AzureResourcesApiRequestErrorCode.HostCreateSessionFailed: - case error.code === AzureResourcesApiRequestErrorCode.ClientReceivedInsufficientCredentials: - case error.code === AzureResourcesApiRequestErrorCode.ClientCredentialFailedVerification: - case error.code === AzureResourcesApiRequestErrorCode.HostApiProvisioningFailed: - default: - } - }, - -}; -``` - ---- - -[Back to README](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/README.md) diff --git a/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts b/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts deleted file mode 100644 index a346bf632..000000000 --- a/api/src/auth/apiRequest/AzureResourcesApiRequestContext.ts +++ /dev/null @@ -1,32 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { AzureResourcesExtensionApi } from "../../extensionApi"; -import { AzureExtensionApi } from "../../utils/apiUtils"; -import { AzureResourcesApiRequestError } from "./apiRequestErrors"; - -export interface AzureResourcesApiRequestContext { - clientExtensionId: string; - azureResourcesApiVersions: string[]; - - /** - * Callback invoked when Azure Resource APIs are successfully obtained through the authentication handshake. - * - * @param azureResourcesApis - Array of APIs corresponding to the requested versions. APIs are returned in the same - * order as provided in this request context. If a requested version is not - * available or does not match, `undefined` will be returned at that position. - */ - onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | AzureExtensionApi | undefined)[]) => void | Promise; - - /** - * Optional callback invoked when an error occurs during the Azure Resources API handshake process. - * - * @remarks Errors thrown during execution of this callback may be part of a separate process and may not bubble up to users. - * If you wish to surface specific errors to users, please consider logging them or using the VS Code API to display them through UI. - * - * @param error - The error that occurred during the handshake, containing an error code and message. - */ - onApiRequestError?: (error: AzureResourcesApiRequestError) => void | Promise; -} diff --git a/api/src/auth/apiRequest/apiRequest.ts b/api/src/auth/apiRequest/apiRequest.ts deleted file mode 100644 index 71e849204..000000000 --- a/api/src/auth/apiRequest/apiRequest.ts +++ /dev/null @@ -1,114 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { l10n } from "vscode"; -import { AzureResourcesExtensionAuthApi } from "../../extensionApi"; -import { apiUtils, AzureExtensionApi } from "../../utils/apiUtils"; -import { AzExtCredentialManager } from "../credentialManager/AzExtCredentialManager"; -import { AzExtUUIDCredentialManager } from "../credentialManager/AzExtUUIDCredentialManager"; -import { AzureResourcesApiRequestContext } from "./AzureResourcesApiRequestContext"; -import { AzureResourcesApiRequestErrorCode } from "./apiRequestErrors"; - -const azureResourcesAuthApiVersion: string = '^4.0.0'; -const azureResourcesExtId = 'ms-azuretools.vscode-azureresourcegroups'; - -export type AzureResourcesApiRequestPrep = { - /** - * The modified client extension API. Ensures the required handshake receiver method has been added. - */ - clientApi: T & Required>; - - /** - * Initiates the authentication handshake required to obtain the Azure Resources API. - */ - requestResourcesApis: () => void; -}; - -/** - * Prepares a client extension for the Azure Resources authentication handshake. - * - * @param context - Prerequisite configuration and handlers to prepare the request - * @param clientExtensionApi - The base extension API to be modified - * @returns The modified client extension API (with the required receiver method added), and a method to initiate the handshake - */ -export function prepareAzureResourcesApiRequest(context: AzureResourcesApiRequestContext, clientExtensionApi: T): AzureResourcesApiRequestPrep { - if (!context.azureResourcesApiVersions.length) { - throw new Error('You must specify at least one Azure Resources API version.'); - } - - const clientCredentialManager: AzExtCredentialManager = new AzExtUUIDCredentialManager(); - - if (!clientExtensionApi.receiveAzureResourcesApiSession) { - clientExtensionApi.receiveAzureResourcesApiSession = createReceiveAzureResourcesApiSession(context, clientCredentialManager); - } - - return { - clientApi: clientExtensionApi as T & Required>, - requestResourcesApis: () => void requestAzureResourcesSession(context, clientCredentialManager, clientExtensionApi.apiVersion), - }; -} - -async function requestAzureResourcesSession(context: AzureResourcesApiRequestContext, clientCredentialManager: AzExtCredentialManager, clientApiVersion: string): Promise { - let clientCredential: string; - try { - clientCredential = await clientCredentialManager.createCredential(context.clientExtensionId); - } catch (err) { - if (err instanceof Error) { - void context.onApiRequestError?.({ code: AzureResourcesApiRequestErrorCode.ClientFailedCreateCredential, message: clientCredentialManager.maskCredentials(err.message) }) - } - return; - } - - try { - const resourcesAuthApi = await getExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); - await resourcesAuthApi.createAzureResourcesApiSession(context.clientExtensionId, clientApiVersion, clientCredential); - } catch (err) { - if (err instanceof Error) { - void context.onApiRequestError?.({ code: AzureResourcesApiRequestErrorCode.HostCreateSessionFailed, message: clientCredentialManager.maskCredentials(err.message) }); - } - return; - } -} - -function createReceiveAzureResourcesApiSession(context: AzureResourcesApiRequestContext, clientCredentialManager: AzExtCredentialManager): AzureExtensionApi['receiveAzureResourcesApiSession'] { - return async function (azureResourcesCredential: string, clientCredential: string): Promise { - if (!azureResourcesCredential || !clientCredential) { - void context.onApiRequestError?.({ code: AzureResourcesApiRequestErrorCode.ClientReceivedInsufficientCredentials, message: 'Insufficient credentials were provided back to the client.' }); - return; - } - - try { - const verified = await clientCredentialManager.verifyCredential(clientCredential, context.clientExtensionId); - if (!verified) { - throw new Error('Client credential returned did not pass verification.'); - } - } catch (err) { - if (err instanceof Error) { - void context.onApiRequestError?.({ code: AzureResourcesApiRequestErrorCode.ClientCredentialFailedVerification, message: clientCredentialManager.maskCredentials(err.message) }); - } - return; - } - - try { - const resourcesAuthApi = await getExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); - const resourcesApis = await resourcesAuthApi.getAzureResourcesApis(context.clientExtensionId, azureResourcesCredential, context.azureResourcesApiVersions); - void context.onDidReceiveAzureResourcesApis(resourcesApis); - } catch (err) { - if (err instanceof Error) { - void context.onApiRequestError?.({ code: AzureResourcesApiRequestErrorCode.HostApiProvisioningFailed, message: clientCredentialManager.maskCredentials(err.message) }); - } - return; - } - } -} - -async function getExtensionApi(extensionId: string, extensionVersion: string): Promise { - const extensionProvider = await apiUtils.getExtensionExports(extensionId); - if (extensionProvider) { - return extensionProvider.getApi(extensionVersion); - } else { - throw new Error(l10n.t('Could not find Azure extension API for extension "{0}".', extensionId)); - } -} diff --git a/api/src/auth/apiRequest/apiRequestErrors.ts b/api/src/auth/apiRequest/apiRequestErrors.ts deleted file mode 100644 index e061c5ff7..000000000 --- a/api/src/auth/apiRequest/apiRequestErrors.ts +++ /dev/null @@ -1,45 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -/** - * Codes for errors that could appear during the API request handshake between client extension and Azure Resources host extension. - */ -export enum AzureResourcesApiRequestErrorCode { - /** - * An error occurred while the client extension was creating its verification credential for the Azure Resources host extension. - */ - ClientFailedCreateCredential = 'ERR_CLIENT_FAILED_CREATE_CREDENTIAL', - - /** - * An error occurred while the Azure Resources host extension was trying to create an API session. - */ - HostCreateSessionFailed = 'ERR_HOST_CREATE_SESSION_FAILED', - - /** - * An error occurred because the client's receiver method was provided incomplete or missing credentials. - */ - ClientReceivedInsufficientCredentials = 'ERR_CLIENT_RECEIVED_INSUFFICIENT_CREDENTIALS', - - /** - * The client's receiver method was provided a client credential that failed verification. - * - * This may occur when: - * - An untrusted extension pretends to be the Azure Resources host extension and tries to pass a fake credential - * - There is a faulty behavior in the client's verification process - */ - ClientCredentialFailedVerification = 'ERR_CLIENT_CREDENTIAL_FAILED_VERIFICATION', - - /** - * An error occurred while asking the Azure Resources host extension to provision the specified APIs. - * - * This may occur when: - * - The Azure Resources extension cannot verify the issued credential that was passed back - * - The requesting extension is not on the Azure Resources allow list - * - The host extension encounters an internal error during API provisioning - */ - HostApiProvisioningFailed = 'ERR_HOST_API_PROVISIONING_FAILED', -} - -export type AzureResourcesApiRequestError = { code: AzureResourcesApiRequestErrorCode, message: string }; diff --git a/api/src/auth/credentialManager/AzExtCredentialManager.ts b/api/src/auth/credentialManager/AzExtCredentialManager.ts deleted file mode 100644 index 3a126e430..000000000 --- a/api/src/auth/credentialManager/AzExtCredentialManager.ts +++ /dev/null @@ -1,16 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -export interface AzExtCredentialManager { - createCredential(extensionId: string): string | Promise; - verifyCredential(credential: string, extensionId?: string): boolean | Promise; - - /** - * Masks sensitive information from a given string to ensure private credential management keys from the manager are not exposed. - * @param data - The string to be processed. - * @returns The same string stripped of any sensitive credentials. - */ - maskCredentials(data: string): string; -} diff --git a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts deleted file mode 100644 index fb5c43a13..000000000 --- a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts +++ /dev/null @@ -1,35 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import * as crypto from "crypto"; -import { maskValue } from "../../utils/maskValue"; -import { AzExtCredentialManager } from "./AzExtCredentialManager"; - -/** - * A simple, light-weight credential manager that issues and tracks randomly generated UUIDs for extension verification. - */ -export class AzExtUUIDCredentialManager implements AzExtCredentialManager { - #uuidMap: Map = new Map(); - - createCredential(extensionId: string): string { - const uuid: string = crypto.randomUUID(); - this.#uuidMap.set(extensionId, uuid); - return uuid; - } - - verifyCredential(credential: string, extensionId: string): boolean { - if (!credential || !extensionId) { - return false; - } - return credential === this.#uuidMap.get(extensionId); - } - - maskCredentials(data: string): string { - for (const uuid of this.#uuidMap.values()) { - data = maskValue(data, uuid); - } - return data; - } -} diff --git a/api/src/index.ts b/api/src/index.ts index 83e9eb443..00542d7b5 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -3,9 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export * from './auth/apiRequest/apiRequest'; -export * from './auth/apiRequest/apiRequestErrors'; -export * from './auth/apiRequest/AzureResourcesApiRequestContext'; export * from './AzExtResourceType'; export * from './extensionApi'; export * from './getAzExtResourceType'; @@ -16,4 +13,3 @@ export * from './resources/workspace'; export * from './utils/apiUtils'; export * from './utils/getApi'; export * from './utils/wrapper'; - diff --git a/api/src/utils/maskValue.ts b/api/src/utils/maskValue.ts deleted file mode 100644 index 7cd96f1f8..000000000 --- a/api/src/utils/maskValue.ts +++ /dev/null @@ -1,15 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -// Sourced from @microsoft/vscode-azext-utils -export function maskValue(data: string, valueToMask: string | undefined): string { - if (valueToMask) { - const formsOfValue: string[] = [valueToMask, encodeURIComponent(valueToMask)]; - for (const v of formsOfValue) { - data = data.replace(new RegExp(escape(v), 'gi'), '---'); - } - } - return data; -} From 5a1ad774f5282b465203e0be199e6bfc4a73a357 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:17:15 -0800 Subject: [PATCH 33/38] Add back in some missing files that were moved --- .../AzExtCredentialManager.ts | 16 +++++++++ .../AzExtUUIDCredentialManager.ts | 35 +++++++++++++++++++ api/src/utils/maskValue.ts | 15 ++++++++ 3 files changed, 66 insertions(+) create mode 100644 api/src/auth/credentialManager/AzExtCredentialManager.ts create mode 100644 api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts create mode 100644 api/src/utils/maskValue.ts diff --git a/api/src/auth/credentialManager/AzExtCredentialManager.ts b/api/src/auth/credentialManager/AzExtCredentialManager.ts new file mode 100644 index 000000000..3a126e430 --- /dev/null +++ b/api/src/auth/credentialManager/AzExtCredentialManager.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export interface AzExtCredentialManager { + createCredential(extensionId: string): string | Promise; + verifyCredential(credential: string, extensionId?: string): boolean | Promise; + + /** + * Masks sensitive information from a given string to ensure private credential management keys from the manager are not exposed. + * @param data - The string to be processed. + * @returns The same string stripped of any sensitive credentials. + */ + maskCredentials(data: string): string; +} diff --git a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts new file mode 100644 index 000000000..fb5c43a13 --- /dev/null +++ b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as crypto from "crypto"; +import { maskValue } from "../../utils/maskValue"; +import { AzExtCredentialManager } from "./AzExtCredentialManager"; + +/** + * A simple, light-weight credential manager that issues and tracks randomly generated UUIDs for extension verification. + */ +export class AzExtUUIDCredentialManager implements AzExtCredentialManager { + #uuidMap: Map = new Map(); + + createCredential(extensionId: string): string { + const uuid: string = crypto.randomUUID(); + this.#uuidMap.set(extensionId, uuid); + return uuid; + } + + verifyCredential(credential: string, extensionId: string): boolean { + if (!credential || !extensionId) { + return false; + } + return credential === this.#uuidMap.get(extensionId); + } + + maskCredentials(data: string): string { + for (const uuid of this.#uuidMap.values()) { + data = maskValue(data, uuid); + } + return data; + } +} diff --git a/api/src/utils/maskValue.ts b/api/src/utils/maskValue.ts new file mode 100644 index 000000000..7cd96f1f8 --- /dev/null +++ b/api/src/utils/maskValue.ts @@ -0,0 +1,15 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +// Sourced from @microsoft/vscode-azext-utils +export function maskValue(data: string, valueToMask: string | undefined): string { + if (valueToMask) { + const formsOfValue: string[] = [valueToMask, encodeURIComponent(valueToMask)]; + for (const v of formsOfValue) { + data = data.replace(new RegExp(escape(v), 'gi'), '---'); + } + } + return data; +} From 2580b09d5dca18f312cccc842607286d5a4cdd20 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:35:20 -0800 Subject: [PATCH 34/38] Remove a var --- src/extension.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 588fc5734..c3ae1f439 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -118,9 +118,6 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo registerLMTools(); }); - const v2: string = '2.0.0'; - const v3: string = '3.0.0'; - const extensionManager = new ResourceGroupsExtensionManager() const azureResourceBranchDataProviderManager = new AzureResourceBranchDataProviderManager( @@ -180,11 +177,11 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo }); const v2ApiFactory: AzureExtensionApiFactory = { - apiVersion: v2, + apiVersion: '2.0.0', createApi: (options?: GetApiOptions) => { return createWrappedAzureResourcesExtensionApi( { - apiVersion: v2, + apiVersion: '2.0.0', resources: createAzureResourcesHostApi( azureResourceProviderManager, azureResourceBranchDataProviderManager, @@ -249,10 +246,10 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo * See: https://github.com/microsoft/vscode-azureresourcegroups/pull/1223 */ const v3ApiFactory: AzureExtensionApiFactory = { - apiVersion: v3, + apiVersion: '3.0.0', createApi: () => { return { - apiVersion: v3, + apiVersion: '3.0.0', isDocumentDbExtensionSupportEnabled: () => true, }; }, From c9ce482ccd3f446190e93ba3c698cd8ddfbe468a Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:36:25 -0800 Subject: [PATCH 35/38] Semicolon --- src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extension.ts b/src/extension.ts index c3ae1f439..2af591e35 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -118,7 +118,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo registerLMTools(); }); - const extensionManager = new ResourceGroupsExtensionManager() + const extensionManager = new ResourceGroupsExtensionManager(); const azureResourceBranchDataProviderManager = new AzureResourceBranchDataProviderManager( new DefaultAzureResourceBranchDataProvider(), From 54299f9e62139ed67739ff79642042558f83b26b Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:40:59 -0800 Subject: [PATCH 36/38] Preserve merge formatting --- src/extension.ts | 84 +++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index 2af591e35..03556a94f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -212,53 +212,49 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo const getSubscriptions: (filter: boolean) => Promise = async (filter: boolean) => { return await (await ext.subscriptionProviderFactory()).getSubscriptions(filter); }; - const internalApiFactory: AzureExtensionApiFactory = { - apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, - createApi: () => new InternalAzureResourceGroupsExtensionApi({ + const coreApiFactories: AzureExtensionApiFactory[] = [ + { apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, - appResourceTree: ext.appResourceTree, - appResourceTreeView: ext.appResourceTreeView, - workspaceResourceTree: ext.workspaceTree, - workspaceResourceTreeView: ext.workspaceTreeView, - registerApplicationResourceResolver, - registerWorkspaceResourceProvider, - registerActivity, - pickAppResource: createCompatibilityPickAppResource(), - getSubscriptions, - }), - }; - - /** - * This is a temporary API and will be removed in a future version once the staged introduction - * of the "DocumentDB for VS Code" extension is complete. - * - * The 3.0.0 API is *NOT* backward-compatible with 2.0.0 on purpose to prevent API users from upgrading to this - * temporary API. - * - * Its primary purpose is to support the user migration from the Azure Databases extension to the Azure DocumentDB extension. - * It provides a feature flag that allows dependent extensions (e.g., `vscode-cosmosdb`, `vscode-documentdb`) to detect - * when this new functionality is available. - * - * This API-based signal is necessary due to a staged rollout, allowing users time to upgrade. - * Dependent extensions should rely on this API signal rather than the extension version. - * - * This temporary API will be removed in a future version once the migration is complete. - * See: https://github.com/microsoft/vscode-azureresourcegroups/pull/1223 - */ - const v3ApiFactory: AzureExtensionApiFactory = { - apiVersion: '3.0.0', - createApi: () => { - return { - apiVersion: '3.0.0', - isDocumentDbExtensionSupportEnabled: () => true, - }; + createApi: () => new InternalAzureResourceGroupsExtensionApi({ + apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, + appResourceTree: ext.appResourceTree, + appResourceTreeView: ext.appResourceTreeView, + workspaceResourceTree: ext.workspaceTree, + workspaceResourceTreeView: ext.workspaceTreeView, + registerApplicationResourceResolver, + registerWorkspaceResourceProvider, + registerActivity, + pickAppResource: createCompatibilityPickAppResource(), + getSubscriptions, + }), }, - }; - - const coreApiFactories: AzureExtensionApiFactory[] = [ - internalApiFactory, v2ApiFactory, - v3ApiFactory, + /** + * This is a temporary API and will be removed in a future version once the staged introduction + * of the "DocumentDB for VS Code" extension is complete. + * + * The 3.0.0 API is *NOT* backward-compatible with 2.0.0 on purpose to prevent API users from upgrading to this + * temporary API. + * + * Its primary purpose is to support the user migration from the Azure Databases extension to the Azure DocumentDB extension. + * It provides a feature flag that allows dependent extensions (e.g., `vscode-cosmosdb`, `vscode-documentdb`) to detect + * when this new functionality is available. + * + * This API-based signal is necessary due to a staged rollout, allowing users time to upgrade. + * Dependent extensions should rely on this API signal rather than the extension version. + * + * This temporary API will be removed in a future version once the migration is complete. + * See: https://github.com/microsoft/vscode-azureresourcegroups/pull/1223 + */ + { + apiVersion: "3.0.0", + createApi: () => { + return { + apiVersion: "3.0.0", + isDocumentDbExtensionSupportEnabled: () => true, + }; + }, + } as AzureExtensionApiFactory ]; // Add test API when running tests From 16ba61a2382aeaeb975209c86fd6e7f1affc0022 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 12:45:00 -0800 Subject: [PATCH 37/38] Fix lint warning --- .../auth/credentialManager/AzExtUUIDCredentialManager.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts index fb5c43a13..115298181 100644 --- a/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts +++ b/api/src/auth/credentialManager/AzExtUUIDCredentialManager.ts @@ -11,7 +11,11 @@ import { AzExtCredentialManager } from "./AzExtCredentialManager"; * A simple, light-weight credential manager that issues and tracks randomly generated UUIDs for extension verification. */ export class AzExtUUIDCredentialManager implements AzExtCredentialManager { - #uuidMap: Map = new Map(); + #uuidMap: Map; + + constructor() { + this.#uuidMap = new Map(); + } createCredential(extensionId: string): string { const uuid: string = crypto.randomUUID(); From 08b7d9421b8f50df49d6742dfcbd661f8e5fe52d Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:33:29 -0800 Subject: [PATCH 38/38] Revert unnecessary formats --- api/README.md | 2 +- api/docs/vscode-azureresources-api.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/README.md b/api/README.md index d1c3d903e..2d72af3a6 100644 --- a/api/README.md +++ b/api/README.md @@ -359,4 +359,4 @@ Azure Resources - Add display info in src/utils/azureUtils.ts - Add extension to src/azureExtensions.ts - --> \ No newline at end of file + --> diff --git a/api/docs/vscode-azureresources-api.d.ts b/api/docs/vscode-azureresources-api.d.ts index 37300dd96..0c28dd447 100644 --- a/api/docs/vscode-azureresources-api.d.ts +++ b/api/docs/vscode-azureresources-api.d.ts @@ -495,4 +495,4 @@ export declare interface Wrapper { unwrap(): T; } -export { }; \ No newline at end of file +export { };

P(A+ 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 -![Azure Resources Handshake Diagram](../../docs/media/auth/azure-resources-handshake.png) +![Azure Resources API Request Handshake](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/docs/media/api-request-handshake.png) ## Automating the Handshake @@ -48,13 +47,14 @@ return createApiProvider([clientApi]); The following example shows how to configure the context when preparing for an Azure Resources API handshake request. ```ts +const v2: string = '^2.0.0'; const context: AzureResourcesApiRequestContext = { - azureResourcesApiVersions: ['2.0.0'], + azureResourcesApiVersions: [v2], clientExtensionId: ext.context.extension.id, onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | undefined)[]) => { const [rgApiV2] = azureResourcesApis; if (!rgApiV2) { - throw new Error(localize('failedHostIntegration', 'Failed to integrate with the Azure Resources host.')); + throw new Error(l10n.t('Failed to find a matching Azure Resources API for version "{0}".', v2)); } ext.rgApiV2 = rgApiV2; ext.rgApiV2.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ContainerAppsEnvironment, ext.branchDataProvider); @@ -72,3 +72,7 @@ const context: AzureResourcesApiRequestContext = { }, }; ``` + +--- + +[Back to README](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/README.md) diff --git a/api/src/auth/apiRequest/apiRequest.ts b/api/src/auth/apiRequest/apiRequest.ts index 2a6beca51..094f558a3 100644 --- a/api/src/auth/apiRequest/apiRequest.ts +++ b/api/src/auth/apiRequest/apiRequest.ts @@ -11,7 +11,7 @@ import { AzExtUUIDCredentialManager } from "../credentialManager/AzExtUUIDCreden import { AzureResourcesApiRequestContext } from "./AzureResourcesApiRequestContext"; import { AzureResourcesApiRequestErrors } from "./apiRequestErrors"; -const azureResourcesAuthApiVersion: string = '4.0.0'; +const azureResourcesAuthApiVersion: string = '^4.0.0'; const azureResourcesExtId = 'ms-azuretools.vscode-azureresourcegroups'; export type AzureResourcesApiRequestPrep = { diff --git a/api/src/utils/getApi.ts b/api/src/utils/getApi.ts index 7ed99e4dd..718aa9534 100644 --- a/api/src/utils/getApi.ts +++ b/api/src/utils/getApi.ts @@ -7,6 +7,10 @@ import * as vscode from 'vscode'; import type { AzureResourcesExtensionApi } from '../extensionApi'; import { apiUtils, GetApiOptions } from "./apiUtils"; +/** + * @deprecated The Azure Resources core API should be accessed through the new auth layer. + * See: https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md + * */ export async function getAzureResourcesExtensionApi(extensionContext: vscode.ExtensionContext, apiVersionRange: '2.0.0', options?: GetApiOptions): Promise { return apiUtils.getAzureExtensionApi(extensionContext, 'ms-azuretools.vscode-azureresourcegroups', apiVersionRange, options); } diff --git a/src/azureExtensions.ts b/src/azureExtensions.ts index 37bc9c05e..478c9afff 100644 --- a/src/azureExtensions.ts +++ b/src/azureExtensions.ts @@ -10,6 +10,7 @@ import { localize } from "./utils/localize"; export const azureExtensions: IAzExtMetadata[] = [ { name: 'vscode-azurefunctions', + publisher: 'ms-azuretools', label: 'Functions', resourceTypes: [ AzExtResourceType.DurableTaskScheduler, @@ -23,6 +24,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azureappservice', + publisher: 'ms-azuretools', label: 'App Service', resourceTypes: [ AzExtResourceType.AppServices @@ -35,6 +37,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azurearcenabledmachines', + publisher: 'ms-azuretools', label: 'Azure Arc-enabled machines', resourceTypes: [ AzExtResourceType.ArcEnabledMachines @@ -43,6 +46,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azurestaticwebapps', + publisher: 'ms-azuretools', label: 'Static Web Apps', resourceTypes: [ AzExtResourceType.StaticWebApps @@ -55,12 +59,14 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azureresourcegroups', + publisher: 'ms-azuretools', label: 'Resource Groups', resourceTypes: [], reportIssueCommandId: 'azureResourceGroups.reportIssue' }, { name: 'vscode-azurestorage', + publisher: 'ms-azuretools', label: 'Storage', resourceTypes: [ AzExtResourceType.StorageAccounts @@ -69,6 +75,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azurevirtualmachines', + publisher: 'ms-azuretools', label: 'Virtual Machines', resourceTypes: [ AzExtResourceType.VirtualMachines @@ -77,6 +84,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-cosmosdb', + publisher: 'ms-azuretools', label: 'Databases', resourceTypes: [ AzExtResourceType.AzureCosmosDb, @@ -87,6 +95,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-documentdb', + publisher: 'ms-azuretools', label: 'Databases', resourceTypes: [ AzExtResourceType.AzureCosmosDbForMongoDbRu, @@ -95,6 +104,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azurecontainerapps', + publisher: 'ms-azuretools', label: 'Container Apps', resourceTypes: [ AzExtResourceType.ContainerAppsEnvironment, @@ -125,6 +135,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azurewebpubsub', + publisher: 'ms-azuretools', label: 'Web PubSub', resourceTypes: [ AzExtResourceType.WebPubSub @@ -133,6 +144,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-azureresourcegroups', + publisher: 'ms-azuretools', label: 'Managed Identity', resourceTypes: [ AzExtResourceType.ManagedIdentityUserAssignedIdentities @@ -140,7 +152,7 @@ export const azureExtensions: IAzExtMetadata[] = [ }, { name: 'vscode-ai-foundry', - publisher: 'TeamsDevApp', + publisher: 'teamsdevapp', label: 'Azure AI Foundry', resourceTypes: [AzExtResourceType.AiFoundry], reportIssueCommandId: 'azure-ai-foundry.reportIssue' From bb212abd9b670f16e04d401bf4501492a4606406 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:22:29 -0800 Subject: [PATCH 06/38] Update error messages and readme --- api/src/auth/README.md | 4 ++-- src/api/auth/authApiInternal.ts | 8 +++++--- src/api/auth/createAzureResourcesAuthApiFactory.ts | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/api/src/auth/README.md b/api/src/auth/README.md index 392655980..cc7d9d4a3 100644 --- a/api/src/auth/README.md +++ b/api/src/auth/README.md @@ -11,8 +11,8 @@ Azure Resources APIs are protected behind the new v4 authentication layer. This ### Steps 1. On activation, the client extension should export its API and initiate the handshake by calling `createAzureResourcesApiSession`. The client extension should provide its own verification credential as part of this request (more on this later). -1. The Azure Resources host extension verifies that the requesting extension is on its approved list. If approved, Azure Resources does not respond directly. Instead, it retrieves the extension's API from VS Code directly using the approved extension ID, then delivers the session credential via the `receiveAzureResourcesApiSession` receiver method. This ensures the credential reaches the approved recipient, even if a malicious actor tried to initiate the request. Azure Resources also returns the original client credential so the client extension can verify that it is communicating with the genuine Azure Resources extension and not a pretend actor. -1. The client extension should then use the credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. +1. The Azure Resources host extension verifies that the requesting extension is on its approved list. If approved, Azure Resources does not respond directly. Instead, it retrieves the extension's API from VS Code directly using the approved extension ID, then delivers the session credential via the `receiveAzureResourcesApiSession` receiver method. This ensures the credential reaches the approved recipient, even if a malicious actor tried to initiate the request. Azure Resources also returns the original client credential so the client extension can verify that it is communicating with the genuine Azure Resources extension. +1. The client extension should then use the Azure Resources credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. ### Diagram ![Azure Resources API Request Handshake](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/docs/media/api-request-handshake.png) diff --git a/src/api/auth/authApiInternal.ts b/src/api/auth/authApiInternal.ts index 6036655cb..64327b131 100644 --- a/src/api/auth/authApiInternal.ts +++ b/src/api/auth/authApiInternal.ts @@ -43,12 +43,14 @@ export async function createAzureResourcesApiSessionInternal(context: IActionCon } } +export const getApiVerifyError = (clientExtensionId?: string) => `${clientExtensionId || 'Unknown Extension'} - 🧙 YOU SHALL NOT PASS! 🔥`; + export async function verifyAzureResourcesApiSessionInternal(context: IActionContext, credentialManager: AzExtCredentialManager, clientExtensionId: string, azureResourcesCredential: string): Promise { - const getApiVerifyError: string = `${clientExtensionId || 'Unknown Extension'} - 🧙 YOU SHALL NOT PASS! 🔥`; + const apiVerifyError: string = getApiVerifyError(clientExtensionId); if (!clientExtensionId || !azureResourcesCredential) { context.telemetry.properties.deniedReason = 'missingDetails'; - throw new Error(getApiVerifyError); + throw new Error(apiVerifyError); } context.telemetry.properties.clientExtensionId = clientExtensionId; @@ -61,7 +63,7 @@ export async function verifyAzureResourcesApiSessionInternal(context: IActionCon if (!verified) { context.telemetry.properties.deniedReason = 'failedVerification'; ext.outputChannel.warn(l10n.t('Extension claiming to be "{0}" provided an access token that failed verification.', clientExtensionId)); - throw new Error(getApiVerifyError); + throw new Error(apiVerifyError); } return verified; diff --git a/src/api/auth/createAzureResourcesAuthApiFactory.ts b/src/api/auth/createAzureResourcesAuthApiFactory.ts index f82b724fc..427bd158b 100644 --- a/src/api/auth/createAzureResourcesAuthApiFactory.ts +++ b/src/api/auth/createAzureResourcesAuthApiFactory.ts @@ -7,7 +7,7 @@ import { apiUtils, AzureExtensionApiFactory, callWithTelemetryAndErrorHandling, import { AzExtCredentialManager } from '../../../api/src/auth/credentialManager/AzExtCredentialManager'; import { AzExtUUIDCredentialManager } from '../../../api/src/auth/credentialManager/AzExtUUIDCredentialManager'; import { AzureResourcesAuthApiInternal } from '../../hostapi.v4.internal'; -import { createAzureResourcesApiSessionInternal, verifyAzureResourcesApiSessionInternal } from './authApiInternal'; +import { createAzureResourcesApiSessionInternal, getApiVerifyError, verifyAzureResourcesApiSessionInternal } from './authApiInternal'; const v4: string = '4.0.0'; @@ -25,7 +25,7 @@ export function createAzureResourcesAuthApiFactory(coreApiProvider: apiUtils.Azu const verified: boolean = await verifyAzureResourcesApiSessionInternal(context, credentialManager, clientExtensionId, azureResourcesCredential); if (!verified) { - return []; + throw new Error(getApiVerifyError(clientExtensionId)); } return azureResourcesApiVersions From a8d2e0969a455d076237c4e72998245f29bb7e3c Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:42:42 -0800 Subject: [PATCH 07/38] More updates to readme --- api/src/auth/README.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/api/src/auth/README.md b/api/src/auth/README.md index cc7d9d4a3..27edfdfbe 100644 --- a/api/src/auth/README.md +++ b/api/src/auth/README.md @@ -11,7 +11,9 @@ Azure Resources APIs are protected behind the new v4 authentication layer. This ### Steps 1. On activation, the client extension should export its API and initiate the handshake by calling `createAzureResourcesApiSession`. The client extension should provide its own verification credential as part of this request (more on this later). + 1. The Azure Resources host extension verifies that the requesting extension is on its approved list. If approved, Azure Resources does not respond directly. Instead, it retrieves the extension's API from VS Code directly using the approved extension ID, then delivers the session credential via the `receiveAzureResourcesApiSession` receiver method. This ensures the credential reaches the approved recipient, even if a malicious actor tried to initiate the request. Azure Resources also returns the original client credential so the client extension can verify that it is communicating with the genuine Azure Resources extension. + 1. The client extension should then use the Azure Resources credential to retrieve the Azure Resources APIs by calling `getAzureResourcesApis`. ### Diagram @@ -19,7 +21,7 @@ Azure Resources APIs are protected behind the new v4 authentication layer. This ## Automating the Handshake -To simplify the handshake process and reduce boilerplate code, the following tools are made available and outlined below. +To simplify the handshake process, the following tools are made available and outlined below. ### The API Request @@ -48,9 +50,12 @@ The following example shows how to configure the context when preparing for an A ```ts const v2: string = '^2.0.0'; + const context: AzureResourcesApiRequestContext = { azureResourcesApiVersions: [v2], - clientExtensionId: ext.context.extension.id, + clientExtensionId: 'ms-azuretools.vscode-azurecontainerapps', + + // Successful retrieval of Azure Resources APIs will be returned here onDidReceiveAzureResourcesApis: (azureResourcesApis: (AzureResourcesExtensionApi | undefined)[]) => { const [rgApiV2] = azureResourcesApis; if (!rgApiV2) { @@ -59,8 +64,9 @@ const context: AzureResourcesApiRequestContext = { ext.rgApiV2 = rgApiV2; ext.rgApiV2.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ContainerAppsEnvironment, ext.branchDataProvider); }, - // Optional - use for special error handling or telemetry logging - onHandshakeError: (error: AzureResourcesHandshakeError) => { + + // Optional + onApiRequestError: async (error: AzureResourcesApiRequestError) => { switch (true) { case error.code === AzureResourcesHandshakeErrors.CLIENT_FAILED_CREATE_CREDENTIAL.code: case error.code === AzureResourcesHandshakeErrors.HOST_CREATE_SESSION_FAILED.code: @@ -70,6 +76,7 @@ const context: AzureResourcesApiRequestContext = { default: } }, + }; ``` From 39e1b697475be323f301b9f67e6b7c49a2456d39 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:48:21 -0800 Subject: [PATCH 08/38] Update getAzureResourcesApi function signature --- api/src/auth/apiRequest/apiRequest.ts | 8 +------- api/src/extensionApi.ts | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/api/src/auth/apiRequest/apiRequest.ts b/api/src/auth/apiRequest/apiRequest.ts index 094f558a3..84619d1a3 100644 --- a/api/src/auth/apiRequest/apiRequest.ts +++ b/api/src/auth/apiRequest/apiRequest.ts @@ -93,14 +93,8 @@ function createReceiveAzureResourcesApiSession(context: AzureResourcesApiRequest try { const resourcesAuthApi = await getClientExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); - const resourcesApis = await resourcesAuthApi.getAzureResourcesApi(context.clientExtensionId, azureResourcesCredential, context.azureResourcesApiVersions) ?? []; - - if (!resourcesApis.length) { - throw new Error('Azure Resources responded with no available APIs.'); - } - + const resourcesApis = await resourcesAuthApi.getAzureResourcesApi(context.clientExtensionId, azureResourcesCredential, context.azureResourcesApiVersions); await context.onDidReceiveAzureResourcesApis(resourcesApis); - } catch (err) { if (err instanceof Error) { await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.HOST_API_PROVISIONING_FAILED.code, message: clientCredentialManager.maskCredentials(err.message) }); diff --git a/api/src/extensionApi.ts b/api/src/extensionApi.ts index 7030d6496..04c0d8ce8 100644 --- a/api/src/extensionApi.ts +++ b/api/src/extensionApi.ts @@ -17,6 +17,6 @@ export interface AzureResourcesExtensionApi extends AzureExtensionApi { * The authentication layer (v4) protecting the core Azure Resources extension API. */ export interface AzureResourcesExtensionAuthApi extends AzureExtensionApi { - getAzureResourcesApi(clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[] | undefined>; + getAzureResourcesApi(clientExtensionId: string, azureResourcesCredential: string, azureResourcesApiVersions: string[]): Promise<(AzureExtensionApi | undefined)[]>; createAzureResourcesApiSession(clientExtensionId: string, clientExtensionVersion: string, clientExtensionCredential: string): Promise; } From 18dce26b3394de235718fd2f5b2bce3de8966d22 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:50:49 -0800 Subject: [PATCH 09/38] Void --- api/src/auth/apiRequest/apiRequest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/auth/apiRequest/apiRequest.ts b/api/src/auth/apiRequest/apiRequest.ts index 84619d1a3..18e817980 100644 --- a/api/src/auth/apiRequest/apiRequest.ts +++ b/api/src/auth/apiRequest/apiRequest.ts @@ -94,7 +94,7 @@ function createReceiveAzureResourcesApiSession(context: AzureResourcesApiRequest try { const resourcesAuthApi = await getClientExtensionApi(azureResourcesExtId, azureResourcesAuthApiVersion); const resourcesApis = await resourcesAuthApi.getAzureResourcesApi(context.clientExtensionId, azureResourcesCredential, context.azureResourcesApiVersions); - await context.onDidReceiveAzureResourcesApis(resourcesApis); + void context.onDidReceiveAzureResourcesApis(resourcesApis); } catch (err) { if (err instanceof Error) { await context.onApiRequestError?.({ code: AzureResourcesApiRequestErrors.HOST_API_PROVISIONING_FAILED.code, message: clientCredentialManager.maskCredentials(err.message) }); From 7d1dfdc639f04ae0f3935cf3ab6822c0e27ddea1 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 11:58:50 -0800 Subject: [PATCH 10/38] Clean up names some more --- api/src/utils/apiUtils.ts | 2 +- src/extension.ts | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/api/src/utils/apiUtils.ts b/api/src/utils/apiUtils.ts index f0223e0ad..1d41ef3d8 100644 --- a/api/src/utils/apiUtils.ts +++ b/api/src/utils/apiUtils.ts @@ -12,7 +12,7 @@ export interface AzureExtensionApi { apiVersion: string; /** * Optional endpoint that Azure client extensions should implement in order to receive Azure Resources API sessions. - * Todo: Add reference to auth readme + * See: https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md * * @param azureResourcesCredential - The credential to use when requesting the Azure Resources API * @param clientCredential - The client verification credential initially generated by the client and passed to the Azure Resources API when requesting for a new session. diff --git a/src/extension.ts b/src/extension.ts index e92316d25..5794e139a 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -179,7 +179,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo refreshEvent: refreshActivityLogTreeEmitter.event }); - const azureResourcesV2ApiFactory: AzureExtensionApiFactory = { + const v2ApiFactory: AzureExtensionApiFactory = { apiVersion: v2, createApi: (options?: GetApiOptions) => { return createWrappedAzureResourcesExtensionApi( @@ -202,7 +202,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo } }; - ext.v2.api = azureResourcesV2ApiFactory.createApi({ extensionId: 'ms-azuretools.vscode-azureresourcegroups' }); + ext.v2.api = v2ApiFactory.createApi({ extensionId: 'ms-azuretools.vscode-azureresourcegroups' }); ext.managedIdentityBranchDataProvider = new ManagedIdentityBranchDataProvider(); ext.v2.api.resources.registerAzureResourceBranchDataProvider(AzExtResourceType.ManagedIdentityUserAssignedIdentities, ext.managedIdentityBranchDataProvider); @@ -215,7 +215,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo const getSubscriptions: (filter: boolean) => Promise = async (filter: boolean) => { return await (await ext.subscriptionProviderFactory()).getSubscriptions(filter) }; - const azureResourcesInternalApiFactory: AzureExtensionApiFactory = { + const internalApiFactory: AzureExtensionApiFactory = { apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, createApi: () => new InternalAzureResourceGroupsExtensionApi({ apiVersion: InternalAzureResourceGroupsExtensionApi.apiVersion, @@ -248,7 +248,7 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo * This temporary API will be removed in a future version once the migration is complete. * See: https://github.com/microsoft/vscode-azureresourcegroups/pull/1223 */ - const azureResourcesV3ApiFactory: AzureExtensionApiFactory = { + const v3ApiFactory: AzureExtensionApiFactory = { apiVersion: v3, createApi: () => { return { @@ -259,17 +259,17 @@ export async function activate(context: vscode.ExtensionContext, perfStats: { lo }; const coreApiProvider: apiUtils.AzureExtensionApiProvider = createApiProvider([ - azureResourcesInternalApiFactory, - azureResourcesV2ApiFactory, - azureResourcesV3ApiFactory, + internalApiFactory, + v2ApiFactory, + v3ApiFactory, ]); return createApiProvider( [ // Todo: Remove once extension clients finish migrating - azureResourcesInternalApiFactory, - azureResourcesV2ApiFactory, - azureResourcesV3ApiFactory, + internalApiFactory, + v2ApiFactory, + v3ApiFactory, // This will eventually be the only part of the API exposed publically createAzureResourcesAuthApiFactory(coreApiProvider), From f45cf0d78439267df0dbf48a3158ac39803bbbb9 Mon Sep 17 00:00:00 2001 From: MicroFish91 <40250218+MicroFish91@users.noreply.github.com> Date: Thu, 6 Nov 2025 12:47:39 -0800 Subject: [PATCH 11/38] More updates to documentation --- api/README.md | 11 +---------- api/src/utils/apiUtils.ts | 7 ++++--- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/api/README.md b/api/README.md index 22c3c3cc7..a6791594a 100644 --- a/api/README.md +++ b/api/README.md @@ -222,16 +222,7 @@ This extension declares that it registers a BranchDataProvider for the `Function ## Getting started On activation, client extensions can fetch an instance of the Azure Resources API using utilities provided by the [`@microsoft/vscode-azureresources-api`](https://www.npmjs.com/package/@microsoft/vscode-azureresources-api) package. -For more information on fetching through the Azure Resources authentication layer, please consult this [guide](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md). - -```ts -import { getAzureResourcesExtensionApi } from '@microsoft/vscode-azureresources-api'; - -export async function activate(context: vscode.ExtensionContext): Promise { - const azureResourcesApi = await getAzureResourcesExtensionApi(context, '2.0.0'); - // ...register providers -} -``` +A guide on fetching the API through the Azure Resources authentication layer can be found [here](https://github.com/microsoft/vscode-azureresourcegroups/blob/main/api/src/auth/README.md). + --> \ No newline at end of file diff --git a/api/docs/media/api-request-handshake.png b/api/docs/media/api-request-handshake.png deleted file mode 100644 index 701cf921a170d3d55708668e9b3984198a929ec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146830 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 z 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