mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
We can't authenticate to every subscription (#9826)
* We can't authenticate to every subscription * Refresh tenants and subs when the application starts
This commit is contained in:
@@ -138,29 +138,39 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
|
|
||||||
public dispose() { }
|
public dispose() { }
|
||||||
|
|
||||||
public async refreshAccess(account: azdata.Account): Promise<azdata.Account> {
|
public async refreshAccess(oldAccount: azdata.Account): Promise<azdata.Account> {
|
||||||
const response = await this.getCachedToken(account.key);
|
const response = await this.getCachedToken(oldAccount.key);
|
||||||
if (!response) {
|
if (!response) {
|
||||||
account.isStale = true;
|
oldAccount.isStale = true;
|
||||||
return account;
|
return oldAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
const refreshToken = response.refreshToken;
|
const refreshToken = response.refreshToken;
|
||||||
if (!refreshToken || !refreshToken.key) {
|
if (!refreshToken || !refreshToken.key) {
|
||||||
account.isStale = true;
|
oldAccount.isStale = true;
|
||||||
return account;
|
return oldAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.refreshAccessToken(account.key, refreshToken);
|
// Refresh the access token
|
||||||
|
const tokenResponse = await this.refreshAccessToken(oldAccount.key, refreshToken);
|
||||||
|
const tenants = await this.getTenants(tokenResponse.accessToken);
|
||||||
|
|
||||||
|
// Recreate account object
|
||||||
|
const newAccount = this.createAccount(tokenResponse.tokenClaims, tokenResponse.accessToken.key, tenants);
|
||||||
|
|
||||||
|
const subscriptions = await this.getSubscriptions(newAccount);
|
||||||
|
newAccount.properties.subscriptions = subscriptions;
|
||||||
|
|
||||||
|
return newAccount;
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
account.isStale = true;
|
oldAccount.isStale = true;
|
||||||
if (ex.message) {
|
if (ex.message) {
|
||||||
await vscode.window.showErrorMessage(ex.message);
|
await vscode.window.showErrorMessage(ex.message);
|
||||||
}
|
}
|
||||||
console.log(ex);
|
console.log(ex);
|
||||||
}
|
}
|
||||||
return account;
|
return oldAccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -375,7 +385,7 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async refreshAccessToken(account: azdata.AccountKey, rt: RefreshToken, tenant?: Tenant, resource?: Resource): Promise<void> {
|
private async refreshAccessToken(account: azdata.AccountKey, rt: RefreshToken, tenant?: Tenant, resource?: Resource): Promise<TokenRefreshResponse> {
|
||||||
const postData: { [key: string]: string } = {
|
const postData: { [key: string]: string } = {
|
||||||
grant_type: 'refresh_token',
|
grant_type: 'refresh_token',
|
||||||
refresh_token: rt.token,
|
refresh_token: rt.token,
|
||||||
@@ -387,7 +397,10 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
postData.resource = resource.endpoint;
|
postData.resource = resource.endpoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { accessToken, refreshToken } = await this.getToken(postData, tenant?.id, resource?.id);
|
const getTokenResponse = await this.getToken(postData, tenant?.id, resource?.id);
|
||||||
|
|
||||||
|
const accessToken = getTokenResponse?.accessToken;
|
||||||
|
const refreshToken = getTokenResponse?.refreshToken;
|
||||||
|
|
||||||
if (!accessToken || !refreshToken) {
|
if (!accessToken || !refreshToken) {
|
||||||
console.log('Access or refresh token were undefined');
|
console.log('Access or refresh token were undefined');
|
||||||
@@ -395,7 +408,9 @@ export abstract class AzureAuth implements vscode.Disposable {
|
|||||||
throw new Error(msg);
|
throw new Error(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.setCachedToken(account, accessToken, refreshToken, resource?.id, tenant?.id);
|
await this.setCachedToken(account, accessToken, refreshToken, resource?.id, tenant?.id);
|
||||||
|
|
||||||
|
return getTokenResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,16 @@ export class AzureResourceAccountTreeNode extends AzureResourceContainerTreeNode
|
|||||||
if (subscriptions.length === 0) {
|
if (subscriptions.length === 0) {
|
||||||
return [AzureResourceMessageTreeNode.create(AzureResourceAccountTreeNode.noSubscriptionsLabel, this)];
|
return [AzureResourceMessageTreeNode.create(AzureResourceAccountTreeNode.noSubscriptionsLabel, this)];
|
||||||
} else {
|
} else {
|
||||||
|
// Filter out everything that we can't authenticate to.
|
||||||
|
subscriptions = subscriptions.filter(s => {
|
||||||
|
const token = tokens[s.id];
|
||||||
|
if (!token) {
|
||||||
|
console.info(`Account does not have permissions to view subscription ${JSON.stringify(s)}.`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
let subTreeNodes = await Promise.all(subscriptions.map(async (subscription) => {
|
let subTreeNodes = await Promise.all(subscriptions.map(async (subscription) => {
|
||||||
const token = tokens[subscription.id];
|
const token = tokens[subscription.id];
|
||||||
const tenantId = await this._tenantService.getTenantId(subscription, this.account, new TokenCredentials(token.token, token.tokenType));
|
const tenantId = await this._tenantService.getTenantId(subscription, this.account, new TokenCredentials(token.token, token.tokenType));
|
||||||
|
|||||||
Reference in New Issue
Block a user