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:
Amir Omidi
2020-04-02 09:02:04 -07:00
committed by GitHub
parent 41d21d799c
commit 223aa3fe0e
2 changed files with 37 additions and 12 deletions

View File

@@ -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;
} }

View File

@@ -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));