mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-12-24 03:11:32 +00:00
Compare commits
54 Commits
documentdb
...
users/sind
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a6473adf40 | ||
|
|
451316cad4 | ||
|
|
b456e53b2f | ||
|
|
de5ba041e9 | ||
|
|
ae7184f7ea | ||
|
|
3a6769280b | ||
|
|
4768ba3642 | ||
|
|
bd564c665b | ||
|
|
7e5c6420ad | ||
|
|
89a3a040d8 | ||
|
|
ec3afa0526 | ||
|
|
4176a8a9a9 | ||
|
|
311cf9aa5a | ||
|
|
bc8094f44f | ||
|
|
9203276a24 | ||
|
|
d7825f4f78 | ||
|
|
e51c28c634 | ||
|
|
3b86a9477f | ||
|
|
521ff39eb0 | ||
|
|
2e2db3c2a9 | ||
|
|
2b84af60f4 | ||
|
|
40283ff7f1 | ||
|
|
29a1a819c3 | ||
|
|
5a16eec29d | ||
|
|
2b11e0e52b | ||
|
|
89374a16ba | ||
|
|
dc289ece75 | ||
|
|
1ddd372c6d | ||
|
|
2740657b4a | ||
|
|
8c888a751c | ||
|
|
8140f0edb1 | ||
|
|
ab5239df09 | ||
|
|
3e48393fbb | ||
|
|
0079a9147f | ||
|
|
912688dc14 | ||
|
|
8849526fab | ||
|
|
24af64a66d | ||
|
|
be871737ad | ||
|
|
4d8bb5c3ea | ||
|
|
10a8505b9a | ||
|
|
ef7c2fe2f7 | ||
|
|
4c7aca95e1 | ||
|
|
2243ad895a | ||
|
|
b2d5f91fe1 | ||
|
|
a712193477 | ||
|
|
5ee411693c | ||
|
|
16c7b2567b | ||
|
|
78d9a0cd8d | ||
|
|
c6ad538559 | ||
|
|
2bc09a6efe | ||
|
|
d3a3033b25 | ||
|
|
6bdc714e11 | ||
|
|
5042f28229 | ||
|
|
e1430fd06f |
@@ -8,11 +8,13 @@ import { AuthType } from "../AuthType";
|
|||||||
import { BackendApi, PriorityLevel } from "../Common/Constants";
|
import { BackendApi, PriorityLevel } from "../Common/Constants";
|
||||||
import * as Logger from "../Common/Logger";
|
import * as Logger from "../Common/Logger";
|
||||||
import { Platform, configContext } from "../ConfigContext";
|
import { Platform, configContext } from "../ConfigContext";
|
||||||
import { userContext } from "../UserContext";
|
import { updateUserContext, userContext } from "../UserContext";
|
||||||
import { logConsoleError } from "../Utils/NotificationConsoleUtils";
|
import { logConsoleError } from "../Utils/NotificationConsoleUtils";
|
||||||
import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils";
|
import * as PriorityBasedExecutionUtils from "../Utils/PriorityBasedExecutionUtils";
|
||||||
import { EmulatorMasterKey, HttpHeaders } from "./Constants";
|
import { EmulatorMasterKey, HttpHeaders } from "./Constants";
|
||||||
import { getErrorMessage } from "./ErrorHandlingUtils";
|
import { getErrorMessage } from "./ErrorHandlingUtils";
|
||||||
|
import { runCommand } from "hooks/useDatabaseAccounts";
|
||||||
|
import { acquireTokenWithMsal, getMsalInstance } from "Utils/AuthorizationUtils";
|
||||||
|
|
||||||
const _global = typeof self === "undefined" ? window : self;
|
const _global = typeof self === "undefined" ? window : self;
|
||||||
|
|
||||||
@@ -32,7 +34,42 @@ export const tokenProvider = async (requestInfo: Cosmos.RequestInfo) => {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
const AUTH_PREFIX = `type=aad&ver=1.0&sig=`;
|
const AUTH_PREFIX = `type=aad&ver=1.0&sig=`;
|
||||||
const authorizationToken = `${AUTH_PREFIX}${userContext.aadToken}`;
|
let authorizationToken;
|
||||||
|
|
||||||
|
try {
|
||||||
|
authorizationToken = `${AUTH_PREFIX}${userContext.aadToken}`;
|
||||||
|
} catch (error) {
|
||||||
|
if (error.code === "ExpiredAuthenticationToken") {
|
||||||
|
// Renew the AAD token using runCommand
|
||||||
|
const newToken = await runCommand(async () => {
|
||||||
|
// Implement the logic to acquire a new AAD token
|
||||||
|
const msalInstance = await getMsalInstance();
|
||||||
|
const cachedAccount = msalInstance.getAllAccounts()?.[0];
|
||||||
|
const cachedTenantId = localStorage.getItem("cachedTenantId");
|
||||||
|
|
||||||
|
msalInstance.setActiveAccount(cachedAccount);
|
||||||
|
const newAccessToken = await acquireTokenWithMsal(msalInstance, {
|
||||||
|
authority: `${configContext.AAD_ENDPOINT}${cachedTenantId}`,
|
||||||
|
scopes: [`${configContext.ARM_ENDPOINT}/.default`],
|
||||||
|
});
|
||||||
|
|
||||||
|
// Update user context with the new token
|
||||||
|
updateUserContext({ aadToken: newAccessToken });
|
||||||
|
authorizationToken = `${AUTH_PREFIX}${userContext.aadToken}`;
|
||||||
|
return newAccessToken;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Retry getting the token after renewing
|
||||||
|
const retryResult = await getTokenFromAuthService(verb, resourceType, resourceId);
|
||||||
|
headers[HttpHeaders.msDate] = retryResult.XDate;
|
||||||
|
return decodeURIComponent(retryResult.PrimaryReadWriteToken);
|
||||||
|
} else {
|
||||||
|
console.error('An error occurred:', error.message);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return authorizationToken;
|
return authorizationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {
|
|||||||
MongoProxyEndpoints,
|
MongoProxyEndpoints,
|
||||||
PortalBackendEndpoints,
|
PortalBackendEndpoints,
|
||||||
} from "Common/Constants";
|
} from "Common/Constants";
|
||||||
|
import { userContext } from "UserContext";
|
||||||
import {
|
import {
|
||||||
allowedAadEndpoints,
|
allowedAadEndpoints,
|
||||||
allowedArcadiaEndpoints,
|
allowedArcadiaEndpoints,
|
||||||
@@ -38,6 +39,7 @@ export interface ConfigContext {
|
|||||||
gitSha?: string;
|
gitSha?: string;
|
||||||
proxyPath?: string;
|
proxyPath?: string;
|
||||||
AAD_ENDPOINT: string;
|
AAD_ENDPOINT: string;
|
||||||
|
ENVIRONMENT: string;
|
||||||
ARM_AUTH_AREA: string;
|
ARM_AUTH_AREA: string;
|
||||||
ARM_ENDPOINT: string;
|
ARM_ENDPOINT: string;
|
||||||
EMULATOR_ENDPOINT?: string;
|
EMULATOR_ENDPOINT?: string;
|
||||||
@@ -93,7 +95,7 @@ let configContext: Readonly<ConfigContext> = {
|
|||||||
], // Webpack injects this at build time
|
], // Webpack injects this at build time
|
||||||
gitSha: process.env.GIT_SHA,
|
gitSha: process.env.GIT_SHA,
|
||||||
hostedExplorerURL: "https://cosmos.azure.com/",
|
hostedExplorerURL: "https://cosmos.azure.com/",
|
||||||
AAD_ENDPOINT: "https://login.microsoftonline.com/",
|
AAD_ENDPOINT: "",
|
||||||
ARM_AUTH_AREA: "https://management.azure.com/",
|
ARM_AUTH_AREA: "https://management.azure.com/",
|
||||||
ARM_ENDPOINT: "https://management.azure.com/",
|
ARM_ENDPOINT: "https://management.azure.com/",
|
||||||
ARM_API_VERSION: "2016-06-01",
|
ARM_API_VERSION: "2016-06-01",
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ export interface UserContext {
|
|||||||
readonly endpoint?: string;
|
readonly endpoint?: string;
|
||||||
readonly aadToken?: string;
|
readonly aadToken?: string;
|
||||||
readonly accessToken?: string;
|
readonly accessToken?: string;
|
||||||
|
readonly armToken?: string;
|
||||||
readonly authorizationToken?: string;
|
readonly authorizationToken?: string;
|
||||||
readonly resourceToken?: string;
|
readonly resourceToken?: string;
|
||||||
readonly subscriptionType?: SubscriptionType;
|
readonly subscriptionType?: SubscriptionType;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { useBoolean } from "@fluentui/react-hooks";
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { configContext } from "../ConfigContext";
|
import { configContext } from "../ConfigContext";
|
||||||
import { acquireTokenWithMsal, getMsalInstance } from "../Utils/AuthorizationUtils";
|
import { acquireTokenWithMsal, getMsalInstance } from "../Utils/AuthorizationUtils";
|
||||||
|
import { updateUserContext } from "UserContext";
|
||||||
|
|
||||||
const msalInstance = await getMsalInstance();
|
const msalInstance = await getMsalInstance();
|
||||||
|
|
||||||
@@ -79,7 +80,7 @@ export function useAADAuth(): ReturnType {
|
|||||||
authority: `${configContext.AAD_ENDPOINT}${tenantId}`,
|
authority: `${configContext.AAD_ENDPOINT}${tenantId}`,
|
||||||
scopes: [`${configContext.ARM_ENDPOINT}/.default`],
|
scopes: [`${configContext.ARM_ENDPOINT}/.default`],
|
||||||
});
|
});
|
||||||
|
updateUserContext({ armToken: armToken});
|
||||||
setArmToken(armToken);
|
setArmToken(armToken);
|
||||||
setAuthFailure(null);
|
setAuthFailure(null);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { HttpHeaders } from "Common/Constants";
|
import { HttpHeaders } from "Common/Constants";
|
||||||
import { QueryRequestOptions, QueryResponse } from "Contracts/AzureResourceGraph";
|
|
||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
import { configContext } from "../ConfigContext";
|
import { acquireTokenWithMsal, getMsalInstance } from "Utils/AuthorizationUtils";
|
||||||
import { DatabaseAccount } from "../Contracts/DataModels";
|
import React from "react";
|
||||||
|
import { updateUserContext, userContext } from "UserContext";
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
|
||||||
interface AccountListResult {
|
interface AccountListResult {
|
||||||
@@ -34,11 +34,10 @@ export async function fetchDatabaseAccounts(subscriptionId: string, accessToken:
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function fetchDatabaseAccountsFromGraph(
|
export async function fetchDatabaseAccountsFromGraph(
|
||||||
subscriptionId: string,
|
subscriptionId: string
|
||||||
accessToken: string,
|
|
||||||
): Promise<DatabaseAccount[]> {
|
): Promise<DatabaseAccount[]> {
|
||||||
const headers = new Headers();
|
const headers = new Headers();
|
||||||
const bearer = `Bearer ${accessToken}`;
|
const bearer = `Bearer ${userContext.armToken}`;
|
||||||
|
|
||||||
headers.append("Authorization", bearer);
|
headers.append("Authorization", bearer);
|
||||||
headers.append(HttpHeaders.contentType, "application/json");
|
headers.append(HttpHeaders.contentType, "application/json");
|
||||||
@@ -46,8 +45,9 @@ export async function fetchDatabaseAccountsFromGraph(
|
|||||||
const apiVersion = "2021-03-01";
|
const apiVersion = "2021-03-01";
|
||||||
const managementResourceGraphAPIURL = `${configContext.ARM_ENDPOINT}providers/Microsoft.ResourceGraph/resources?api-version=${apiVersion}`;
|
const managementResourceGraphAPIURL = `${configContext.ARM_ENDPOINT}providers/Microsoft.ResourceGraph/resources?api-version=${apiVersion}`;
|
||||||
|
|
||||||
const databaseAccounts: DatabaseAccount[] = [];
|
let databaseAccounts: DatabaseAccount[] = [];
|
||||||
let skipToken: string;
|
let skipToken: string;
|
||||||
|
console.log("Old ARM Token", userContext.armToken);
|
||||||
do {
|
do {
|
||||||
const body = {
|
const body = {
|
||||||
query: databaseAccountsQuery,
|
query: databaseAccountsQuery,
|
||||||
@@ -74,21 +74,166 @@ export async function fetchDatabaseAccountsFromGraph(
|
|||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(await response.text());
|
throw new Error(await response.text());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const queryResponse: QueryResponse = (await response.json()) as QueryResponse;
|
const queryResponse: QueryResponse = (await response.json()) as QueryResponse;
|
||||||
skipToken = queryResponse.$skipToken;
|
skipToken = queryResponse.$skipToken;
|
||||||
queryResponse.data?.map((databaseAccount: any) => {
|
queryResponse.data?.map((databaseAccount: any) => {
|
||||||
databaseAccounts.push(databaseAccount as DatabaseAccount);
|
databaseAccounts.push(databaseAccount as DatabaseAccount);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// else {
|
||||||
|
// try{
|
||||||
|
// console.log("Token expired");
|
||||||
|
// databaseAccounts = await acquireNewTokenAndRetry(body);
|
||||||
|
// }
|
||||||
|
// catch (error) {
|
||||||
|
// throw new Error(error);
|
||||||
|
// }
|
||||||
|
|
||||||
|
//}
|
||||||
} while (skipToken);
|
} while (skipToken);
|
||||||
|
|
||||||
return databaseAccounts.sort((a, b) => a.name.localeCompare(b.name));
|
return databaseAccounts.sort((a, b) => a.name.localeCompare(b.name));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useDatabaseAccounts(subscriptionId: string, armToken: string): DatabaseAccount[] | undefined {
|
export function useDatabaseAccounts(subscriptionId: string): DatabaseAccount[] | undefined {
|
||||||
const { data } = useSWR(
|
const { data } = useSWR(
|
||||||
() => (armToken && subscriptionId ? ["databaseAccounts", subscriptionId, armToken] : undefined),
|
() => ( subscriptionId ? ["databaseAccounts", subscriptionId] : undefined),
|
||||||
(_, subscriptionId, armToken) => fetchDatabaseAccountsFromGraph(subscriptionId, armToken),
|
(_, subscriptionId) => runCommand(fetchDatabaseAccountsFromGraph, subscriptionId),
|
||||||
);
|
);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Define the types for your responses
|
||||||
|
interface DatabaseAccount {
|
||||||
|
name: string;
|
||||||
|
id: string;
|
||||||
|
// Add other relevant fields as per your use case
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Subscription {
|
||||||
|
displayName: string;
|
||||||
|
subscriptionId: string;
|
||||||
|
state: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface QueryRequestOptions {
|
||||||
|
$top?: number;
|
||||||
|
$skipToken?: string;
|
||||||
|
$allowPartialScopes?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Define the configuration context and headers if not already defined
|
||||||
|
const configContext = {
|
||||||
|
ARM_ENDPOINT: 'https://management.azure.com/',
|
||||||
|
AAD_ENDPOINT: 'https://login.microsoftonline.com/'
|
||||||
|
};
|
||||||
|
|
||||||
|
interface QueryResponse {
|
||||||
|
data?: any[];
|
||||||
|
$skipToken?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function runCommand<T>(
|
||||||
|
fn: (...args: any[]) => Promise<T>,
|
||||||
|
...args: any[]
|
||||||
|
): Promise<T> {
|
||||||
|
try {
|
||||||
|
// Attempt to execute the function passed as an argument
|
||||||
|
const result = await fn(...args);
|
||||||
|
console.log('Successfully executed function:', result);
|
||||||
|
return result;
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
// Handle any error that is thrown during the execution of the function
|
||||||
|
//(error.code === "ExpiredAuthenticationToken")
|
||||||
|
if(error) {
|
||||||
|
console.log('Creating new token');
|
||||||
|
const msalInstance = await getMsalInstance();
|
||||||
|
|
||||||
|
const cachedAccount = msalInstance.getAllAccounts()?.[0];
|
||||||
|
const cachedTenantId = localStorage.getItem("cachedTenantId");
|
||||||
|
|
||||||
|
|
||||||
|
msalInstance.setActiveAccount(cachedAccount);
|
||||||
|
|
||||||
|
const newAccessToken = await acquireTokenWithMsal(msalInstance, {
|
||||||
|
authority: `${configContext.AAD_ENDPOINT}${cachedTenantId}`,
|
||||||
|
scopes: [`${configContext.ARM_ENDPOINT}/.default`],
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Latest ARM Token", userContext.armToken);
|
||||||
|
updateUserContext({armToken: newAccessToken});
|
||||||
|
const result = await fn(...args);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.error('An error occurred:', error.message);
|
||||||
|
throw new error;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Running the functions using runCommand
|
||||||
|
|
||||||
|
const accessToken = 'your-access-token';
|
||||||
|
const subscriptionId = 'your-subscription-id';
|
||||||
|
|
||||||
|
//runCommand(fetchDatabaseAccountsFromGraph, subscriptionId, accessToken);
|
||||||
|
//runCommand(fetchSubscriptionsFromGraph, accessToken);
|
||||||
|
|
||||||
|
async function acquireNewTokenAndRetry(body: any) : Promise<DatabaseAccount[]> {
|
||||||
|
try {
|
||||||
|
const msalInstance = await getMsalInstance();
|
||||||
|
|
||||||
|
const cachedAccount = msalInstance.getAllAccounts()?.[0];
|
||||||
|
const cachedTenantId = localStorage.getItem("cachedTenantId");
|
||||||
|
|
||||||
|
// const [tenantId, setTenantId] = React.useState<string>(cachedTenantId);
|
||||||
|
|
||||||
|
|
||||||
|
msalInstance.setActiveAccount(cachedAccount);
|
||||||
|
|
||||||
|
const newAccessToken = await acquireTokenWithMsal(msalInstance, {
|
||||||
|
authority: `${configContext.AAD_ENDPOINT}${cachedTenantId}`,
|
||||||
|
scopes: [`${configContext.ARM_ENDPOINT}/.default`],
|
||||||
|
});
|
||||||
|
console.log("New ARM Token", newAccessToken);
|
||||||
|
const newBearer = `Bearer ${newAccessToken}`;
|
||||||
|
const newHeaders = new Headers();
|
||||||
|
newHeaders.append("Authorization", newBearer);
|
||||||
|
newHeaders.append(HttpHeaders.contentType, "application/json");
|
||||||
|
const apiVersion = "2021-03-01";
|
||||||
|
const managementResourceGraphAPIURL = `${configContext.ARM_ENDPOINT}providers/Microsoft.ResourceGraph/resources?api-version=${apiVersion}`;
|
||||||
|
|
||||||
|
const databaseAccounts: DatabaseAccount[] = [];
|
||||||
|
let skipToken: string;
|
||||||
|
|
||||||
|
|
||||||
|
// Retry the request with the new token
|
||||||
|
const response = await fetch(managementResourceGraphAPIURL, {
|
||||||
|
method: "POST",
|
||||||
|
headers: newHeaders,
|
||||||
|
body: JSON.stringify(body),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
// Handle successful response with new token
|
||||||
|
const queryResponse: QueryResponse = await response.json();
|
||||||
|
skipToken = queryResponse.$skipToken;
|
||||||
|
queryResponse.data?.forEach((databaseAccount: any) => {
|
||||||
|
databaseAccounts.push(databaseAccount as DatabaseAccount);
|
||||||
|
});
|
||||||
|
return databaseAccounts;
|
||||||
|
} else {
|
||||||
|
throw new Error(`Failed to fetch data after acquiring new token. Status: ${response.status}, ${await response.text()}`);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error acquiring new token and retrying:", error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { FabricMessageTypes } from "Contracts/FabricMessageTypes";
|
|||||||
import { FABRIC_RPC_VERSION, FabricMessageV2 } from "Contracts/FabricMessagesContract";
|
import { FABRIC_RPC_VERSION, FabricMessageV2 } from "Contracts/FabricMessagesContract";
|
||||||
import Explorer from "Explorer/Explorer";
|
import Explorer from "Explorer/Explorer";
|
||||||
import { useDataPlaneRbac } from "Explorer/Panes/SettingsPane/SettingsPane";
|
import { useDataPlaneRbac } from "Explorer/Panes/SettingsPane/SettingsPane";
|
||||||
|
import { useDataPlaneRbac } from "Explorer/Panes/SettingsPane/SettingsPane";
|
||||||
import { useSelectedNode } from "Explorer/useSelectedNode";
|
import { useSelectedNode } from "Explorer/useSelectedNode";
|
||||||
import { scheduleRefreshDatabaseResourceToken } from "Platform/Fabric/FabricUtil";
|
import { scheduleRefreshDatabaseResourceToken } from "Platform/Fabric/FabricUtil";
|
||||||
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";
|
import { LocalStorageUtility, StorageKey } from "Shared/StorageUtility";
|
||||||
@@ -18,6 +19,7 @@ import { AuthType } from "../AuthType";
|
|||||||
import { AccountKind, Flights } from "../Common/Constants";
|
import { AccountKind, Flights } from "../Common/Constants";
|
||||||
import { normalizeArmEndpoint } from "../Common/EnvironmentUtility";
|
import { normalizeArmEndpoint } from "../Common/EnvironmentUtility";
|
||||||
import * as Logger from "../Common/Logger";
|
import * as Logger from "../Common/Logger";
|
||||||
|
import * as Logger from "../Common/Logger";
|
||||||
import { handleCachedDataMessage, sendMessage, sendReadyMessage } from "../Common/MessageHandler";
|
import { handleCachedDataMessage, sendMessage, sendReadyMessage } from "../Common/MessageHandler";
|
||||||
import { Platform, configContext, updateConfigContext } from "../ConfigContext";
|
import { Platform, configContext, updateConfigContext } from "../ConfigContext";
|
||||||
import { ActionType, DataExplorerAction, TabKind } from "../Contracts/ActionContracts";
|
import { ActionType, DataExplorerAction, TabKind } from "../Contracts/ActionContracts";
|
||||||
@@ -464,6 +466,7 @@ export async function fetchAndUpdateKeys(subscriptionId: string, resourceGroup:
|
|||||||
Logger.logInfo(`Fetching keys for ${userContext.apiType} account ${account}`, "Explorer/fetchAndUpdateKeys");
|
Logger.logInfo(`Fetching keys for ${userContext.apiType} account ${account}`, "Explorer/fetchAndUpdateKeys");
|
||||||
let keys;
|
let keys;
|
||||||
try {
|
try {
|
||||||
|
keys = await listKeys(subscriptionId, resourceGroup, account);
|
||||||
keys = await listKeys(subscriptionId, resourceGroup, account);
|
keys = await listKeys(subscriptionId, resourceGroup, account);
|
||||||
Logger.logInfo(`Keys fetched for ${userContext.apiType} account ${account}`, "Explorer/fetchAndUpdateKeys");
|
Logger.logInfo(`Keys fetched for ${userContext.apiType} account ${account}`, "Explorer/fetchAndUpdateKeys");
|
||||||
updateUserContext({
|
updateUserContext({
|
||||||
@@ -487,6 +490,23 @@ export async function fetchAndUpdateKeys(subscriptionId: string, resourceGroup:
|
|||||||
);
|
);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
if (error.code === "AuthorizationFailed") {
|
||||||
|
keys = await getReadOnlyKeys(subscriptionId, resourceGroup, account);
|
||||||
|
Logger.logInfo(
|
||||||
|
`Read only Keys fetched for ${userContext.apiType} account ${account}`,
|
||||||
|
"Explorer/fetchAndUpdateKeys",
|
||||||
|
);
|
||||||
|
updateUserContext({
|
||||||
|
masterKey: keys.primaryReadonlyMasterKey,
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
logConsoleError(`Error occurred fetching keys for the account." ${error.message}`);
|
||||||
|
Logger.logError(
|
||||||
|
`Error during fetching keys or updating user context: ${error} for ${userContext.apiType} account ${account}`,
|
||||||
|
"Explorer/fetchAndUpdateKeys",
|
||||||
|
);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -814,4 +834,4 @@ async function updateContextForSampleData(explorer: Explorer): Promise<void> {
|
|||||||
|
|
||||||
interface SampledataconnectionResponse {
|
interface SampledataconnectionResponse {
|
||||||
connectionString: string;
|
connectionString: string;
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ import { QueryRequestOptions, QueryResponse } from "Contracts/AzureResourceGraph
|
|||||||
import useSWR from "swr";
|
import useSWR from "swr";
|
||||||
import { configContext } from "../ConfigContext";
|
import { configContext } from "../ConfigContext";
|
||||||
import { Subscription } from "../Contracts/DataModels";
|
import { Subscription } from "../Contracts/DataModels";
|
||||||
|
import { acquireTokenWithMsal, getMsalInstance } from "Utils/AuthorizationUtils";
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
|
|
||||||
interface SubscriptionListResult {
|
interface SubscriptionListResult {
|
||||||
@@ -92,3 +93,5 @@ export function useSubscriptions(armToken: string): Subscription[] | undefined {
|
|||||||
);
|
);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user