From 9db06af5520f0191569c4c68652171c49f218060 Mon Sep 17 00:00:00 2001 From: Laurent Nguyen Date: Fri, 6 Oct 2023 14:33:46 +0000 Subject: [PATCH] For Fabric, send message to get Authorization token from iframe parent --- src/Common/CosmosClient.ts | 19 +++++++---- src/Common/MessageHandler.ts | 2 +- src/Contracts/ExplorerContracts.ts | 43 ++---------------------- src/Contracts/FabricContract.ts | 54 +++++++++++++++++++++--------- src/Contracts/MessageTypes.ts | 48 ++++++++++++++++++++++++++ src/hooks/useKnockoutExplorer.ts | 6 +++- 6 files changed, 107 insertions(+), 65 deletions(-) create mode 100644 src/Contracts/MessageTypes.ts diff --git a/src/Common/CosmosClient.ts b/src/Common/CosmosClient.ts index 84d80b0e2..b06f68f95 100644 --- a/src/Common/CosmosClient.ts +++ b/src/Common/CosmosClient.ts @@ -1,13 +1,14 @@ import * as Cosmos from "@azure/cosmos"; -import { configContext, Platform } from "../ConfigContext"; +import { sendCachedDataMessage } from "Common/MessageHandler"; +import { AuthorizationToken, MessageTypes } from "Contracts/MessageTypes"; +import { AuthType } from "../AuthType"; +import { PriorityLevel } from "../Common/Constants"; +import { Platform, configContext } from "../ConfigContext"; import { userContext } from "../UserContext"; import { logConsoleError } from "../Utils/NotificationConsoleUtils"; +import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils"; import { EmulatorMasterKey, HttpHeaders } from "./Constants"; import { getErrorMessage } from "./ErrorHandlingUtils"; -import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility"; -import { PriorityLevel } from "../Common/Constants"; -import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils"; -import { AuthType } from "../AuthType"; const _global = typeof self === "undefined" ? window : self; @@ -26,6 +27,12 @@ export const tokenProvider = async (requestInfo: Cosmos.RequestInfo) => { return decodeURIComponent(headers.authorization); } + if (configContext.platform === Platform.Fabric) { + const authorizationToken = await sendCachedDataMessage(MessageTypes.GetAuthorizationToken, [requestInfo]); + console.log('Response from Fabric: ', authorizationToken); + return authorizationToken; + } + if (userContext.masterKey) { // TODO This SDK method mutates the headers object. Find a better one or fix the SDK. await Cosmos.setAuthorizationTokenHeaderUsingMasterKey(verb, resourceId, resourceType, headers, EmulatorMasterKey); @@ -56,7 +63,7 @@ export const endpoint = () => { return userContext.endpoint || userContext?.databaseAccount?.properties?.documentEndpoint; }; -export async function getTokenFromAuthService(verb: string, resourceType: string, resourceId?: string): Promise { +export async function getTokenFromAuthService(verb: string, resourceType: string, resourceId?: string): Promise { try { const host = configContext.BACKEND_ENDPOINT; const response = await _global.fetch(host + "/api/guest/runtimeproxy/authorizationTokens", { diff --git a/src/Common/MessageHandler.ts b/src/Common/MessageHandler.ts index 834e2d7b5..e32b31d6c 100644 --- a/src/Common/MessageHandler.ts +++ b/src/Common/MessageHandler.ts @@ -22,7 +22,7 @@ export function handleCachedDataMessage(message: any): void { if (messageContent.error != null) { cachedDataPromise.deferred.reject(messageContent.error); } else { - cachedDataPromise.deferred.resolve(JSON.parse(messageContent.data)); + cachedDataPromise.deferred.resolve(messageContent.data); } runGarbageCollector(); } diff --git a/src/Contracts/ExplorerContracts.ts b/src/Contracts/ExplorerContracts.ts index fa286f1fc..8fc230f2d 100644 --- a/src/Contracts/ExplorerContracts.ts +++ b/src/Contracts/ExplorerContracts.ts @@ -1,46 +1,7 @@ +import { MessageTypes } from "Contracts/MessageTypes"; import * as ActionContracts from "./ActionContracts"; import * as Diagnostics from "./Diagnostics"; import * as Versions from "./Versions"; -/** - * Messaging types used with Data Explorer <-> Portal communication - * and Hosted <-> Explorer communication - */ -export enum MessageTypes { - TelemetryInfo, - LogInfo, - RefreshResources, - AllDatabases, - CollectionsForDatabase, - RefreshOffers, - AllOffers, - UpdateLocationHash, - SingleOffer, - RefreshOffer, - UpdateAccountName, - ForbiddenError, - AadSignIn, - GetAccessAadRequest, - GetAccessAadResponse, - UpdateAccountSwitch, - UpdateDirectoryControl, - SwitchAccount, - SendNotification, - ClearNotification, - ExplorerClickEvent, - LoadingStatus, - GetArcadiaToken, - CreateWorkspace, - CreateSparkPool, - RefreshDatabaseAccount, - CloseTab, - OpenQuickstartBlade, - OpenPostgreSQLPasswordReset, - OpenPostgresNetworkingBlade, - OpenCosmosDBNetworkingBlade, - DisplayNPSSurvey, - OpenVCoreMongoNetworkingBlade, - OpenVCoreMongoConnectionStringsBlade, -} +export { ActionContracts, Diagnostics, MessageTypes, Versions }; -export { ActionContracts, Diagnostics, Versions }; diff --git a/src/Contracts/FabricContract.ts b/src/Contracts/FabricContract.ts index 61f5c0bdb..8ae6e93f6 100644 --- a/src/Contracts/FabricContract.ts +++ b/src/Contracts/FabricContract.ts @@ -1,25 +1,47 @@ +import { AuthorizationToken, MessageTypes } from "./MessageTypes"; + export type FabricMessage = | { - type: "newContainer"; - databaseName: string; - } + type: "newContainer"; + databaseName: string; + } | { - type: "initialize"; - connectionString: string | undefined; - } + type: "initialize"; + connectionString: string | undefined; + } | { - type: "openTab"; - databaseName: string; - collectionName: string | undefined; - }; + type: "openTab"; + databaseName: string; + collectionName: string | undefined; + } + | { + type: "authorizationToken"; + message: { + id: string; + error: string | undefined; + data: AuthorizationToken; + } + }; export type DataExploreMessage = | "ready" | { - type: number; - data: { - action: "LoadDatabases"; - actionModifier: "success" | "start"; - defaultExperience: "SQL"; - }; + type: MessageTypes.TelemetryInfo; + data: { + action: "LoadDatabases"; + actionModifier: "success" | "start"; + defaultExperience: "SQL"; }; + } + | { + type: MessageTypes.GetAuthorizationToken; + id: string; + params: [{ + verb: string; + resourceId: string; + resourceType: string; + headers: { + [key: string]: string; + } + }]; + }; diff --git a/src/Contracts/MessageTypes.ts b/src/Contracts/MessageTypes.ts new file mode 100644 index 000000000..e9c3ed5a5 --- /dev/null +++ b/src/Contracts/MessageTypes.ts @@ -0,0 +1,48 @@ +/** + * Messaging types used with Data Explorer <-> Portal communication, + * Hosted <-> Explorer communication and Data Explorer -> Fabric communication. + */ +export enum MessageTypes { + TelemetryInfo, + LogInfo, + RefreshResources, + AllDatabases, + CollectionsForDatabase, + RefreshOffers, + AllOffers, + UpdateLocationHash, + SingleOffer, + RefreshOffer, + UpdateAccountName, + ForbiddenError, + AadSignIn, + GetAccessAadRequest, + GetAccessAadResponse, + UpdateAccountSwitch, + UpdateDirectoryControl, + SwitchAccount, + SendNotification, + ClearNotification, + ExplorerClickEvent, + LoadingStatus, + GetArcadiaToken, + CreateWorkspace, + CreateSparkPool, + RefreshDatabaseAccount, + CloseTab, + OpenQuickstartBlade, + OpenPostgreSQLPasswordReset, + OpenPostgresNetworkingBlade, + OpenCosmosDBNetworkingBlade, + DisplayNPSSurvey, + OpenVCoreMongoNetworkingBlade, + OpenVCoreMongoConnectionStringsBlade, + + // Data Explorer -> Fabric communication + GetAuthorizationToken, +} + +export interface AuthorizationToken { + XDate: string; + PrimaryReadWriteToken: string; +} \ No newline at end of file diff --git a/src/hooks/useKnockoutExplorer.ts b/src/hooks/useKnockoutExplorer.ts index 16d044105..715c85869 100644 --- a/src/hooks/useKnockoutExplorer.ts +++ b/src/hooks/useKnockoutExplorer.ts @@ -10,7 +10,7 @@ import { useEffect, useState } from "react"; import { AuthType } from "../AuthType"; import { AccountKind, Flights } from "../Common/Constants"; import { normalizeArmEndpoint } from "../Common/EnvironmentUtility"; -import { sendMessage, sendReadyMessage } from "../Common/MessageHandler"; +import { handleCachedDataMessage, sendMessage, sendReadyMessage } from "../Common/MessageHandler"; import { Platform, configContext, updateConfigContext } from "../ConfigContext"; import { ActionType, DataExplorerAction, TabKind } from "../Contracts/ActionContracts"; import { MessageTypes } from "../Contracts/ExplorerContracts"; @@ -166,6 +166,10 @@ async function configureFabric(): Promise { break; } + case "authorizationToken": { + handleCachedDataMessage(data); + break; + } default: console.error(`Unknown Fabric message type: ${JSON.stringify(data)}`); break;