Riferimento API JavaScript di autenticazione

Il Fabric Extensibility Toolkit fornisce un'API JavaScript per acquisire token di autenticazione che possono essere utilizzati per accedere alle API Fabric, ai servizi Azure e a qualsiasi applicazione protetta da Entra. Questo articolo fornisce esempi completi di riferimento e utilizzo delle API.

Suggerimento

Per una guida iniziale rapida, consulta Acquisisci i token Microsoft Entra.

Informazioni di riferimento sulle API

acquireFrontendAccessToken(params: AcquireFrontendAccessTokenParams): Promise<AccessToken>;

export interface AcquireFrontendAccessTokenParams {
    scopes: string[];
}

export interface AccessToken {
    token: string;
}

Annotazioni

L'attuale implementazione del toolkit di estensibilità supporta l'acquisizione di token di base con ambitivi. Funzionalità avanzate come il consenso completo e la gestione dell'accesso condizionato non sono ancora disponibili, ma potrebbero essere aggiunte in future versioni.

L'API restituisce un AccessToken oggetto che contiene:

  • token: La stringa di token JWT da utilizzare nelle intestazioni di autorizzazione

Utilizzo di base

Semplice acquisizione dei token

// Acquire a token with default Fabric permissions
const token = await workloadClient.auth.acquireFrontendAccessToken({ scopes: [] });

// Use the token in API calls
const response = await fetch('https://api.fabric.microsoft.com/v1/workspaces', {
  headers: {
    'Authorization': `Bearer ${token.token}`,
    'Content-Type': 'application/json'
  }
});

Token con telescopi specifici

// Request specific scopes for Azure Storage
const token = await workloadClient.auth.acquireFrontendAccessToken({
  scopes: ['https://storage.azure.com/user_impersonation']
});

Esempi di utilizzo dei token

Accesso API Fabric

Il token può essere utilizzato direttamente con le API Fabric REST:

async function listWorkspaces() {
  const token = await workloadClient.auth.acquireFrontendAccessToken({ scopes: [] });
  
  const response = await fetch('https://api.fabric.microsoft.com/v1/workspaces', {
    headers: {
      'Authorization': `Bearer ${token.token}`
    }
  });
  
  return await response.json();
}

Azure service access

Usa gli scope per specificare i servizi Azure a cui hai bisogno di accesso:

async function readFromStorage(accountName, containerName, blobName) {
  const token = await workloadClient.auth.acquireFrontendAccessToken({
    scopes: ['https://storage.azure.com/user_impersonation']
  });
  
  const url = `https://${accountName}.blob.core.windows.net/${containerName}/${blobName}`;
  const response = await fetch(url, {
    headers: {
      'Authorization': `Bearer ${token.token}`,
      'x-ms-version': '2021-12-02'
    }
  });
  
  return await response.text();
}

Accesso alle applicazioni personalizzate

Accedi alle tue applicazioni protette da Entra:

async function callCustomAPI() {
  const token = await workloadClient.auth.acquireFrontendAccessToken({
    scopes: ['https://myapp.contoso.com/data.read']
  });
  
  const response = await fetch('https://myapp.contoso.com/api/data', {
    headers: {
      'Authorization': `Bearer ${token.token}`
    }
  });
  
  return await response.json();
}

Riferimento ai parametri

scopes

Una serie di stringhe di scope che specificano i permessi di cui il tuo token ha bisogno.

Ambiti di servizio Azure comuni:

  • https://storage.azure.com/user_impersonation - Azure Storage
  • https://vault.azure.net/user_impersonation - Vault Azure Key
  • https://management.azure.com/user_impersonation - Azure Resource Manager
  • https://graph.microsoft.com/User.Read - Microsoft Graph

Esempio di utilizzo:

const token = await workloadClient.auth.acquireFrontendAccessToken({
  scopes: [
    'https://storage.azure.com/user_impersonation'
  ]
});

Matrice di scope vuoti: Usa un array vuoto per ottenere un token con i permessi Fabric predefiniti:

const token = await workloadClient.auth.acquireFrontendAccessToken({ scopes: [] });

L'Extensibility Toolkit gestisce automaticamente i flussi di lavoro di consenso:

  • Richiesta iniziale: Se manca il consenso, si apre una finestra pop-up
  • Interazione dell'utente: l'utente concede o nega permessi
  • Chiusura automatica: il popup si chiude automaticamente dopo l'azione dell'utente
  • Consegna del token: Se ha successo, il token viene restituito alla tua applicazione

Il toolkit gestisce automaticamente i pop-up di consenso, ma puoi personalizzare il comportamento dell'URI di reindirizzamento. Crea una pagina di reindirizzamento che gestisca la risposta di consenso:

// redirect.js - Handle consent redirect
const redirectUriPath = '/close';
const url = new URL(window.location.href);

if (url.pathname?.startsWith(redirectUriPath)) {
  // Handle consent errors
  if (url?.hash?.includes("error")) {
    // Extract error information
    const errorMatch = url.hash.match(/error=([^&]+)/);
    const errorDescription = url.hash.match(/error_description=([^&]+)/);
    
    // Handle specific errors
    if (url.hash.includes("AADSTS650052")) {
      console.error("Service principal not configured");
    } else if (url.hash.includes("AADSTS65004")) {
      console.error("User declined consent");
    }
  }
  
  // Always close the popup immediately
  window.close();
}

Per accedere alle risorse tra diversi tenant:

// Request consent for cross-tenant access
const token = await workloadClient.auth.acquireAccessToken({
  additionalScopesToConsent: ['https://api.partner-app.com/data.read']
});

Gestione degli errori

Scenari di errore comuni

async function robustTokenAcquisition() {
  try {
    return await workloadClient.auth.acquireAccessToken();
  } catch (error) {
    switch (error.code) {
      case 'user_cancelled':
        console.log('User cancelled the consent dialog');
        break;
      case 'consent_required':
        console.log('Additional consent required');
        break;
      case 'interaction_required':
        console.log('User interaction required');
        break;
      default:
        console.error('Authentication error:', error.message);
    }
    throw error;
  }
}

Gestione della scadenza dei token

class TokenManager {
  private currentToken: AccessToken | null = null;
  
  async getValidToken(): Promise<AccessToken> {
    if (!this.currentToken || this.isTokenExpired(this.currentToken)) {
      this.currentToken = await workloadClient.auth.acquireAccessToken();
    }
    return this.currentToken;
  }
  
  private isTokenExpired(token: AccessToken): boolean {
    // Add buffer time to prevent requests with almost-expired tokens
    const bufferMinutes = 5;
    const expirationWithBuffer = new Date(token.expiresOn.getTime() - (bufferMinutes * 60 * 1000));
    return new Date() >= expirationWithBuffer;
  }
}

Procedure consigliate

Cache e riutilizzo dei token

  • Token cache: Conservare i token in memoria fino alla scadenza
  • Aggiornamento automatico: implementare l'aggiornamento automatico del token prima della scadenza
  • Archiviazione sicura: Non far mai persistere i token nello storage locale o nei cookie

Gestione dell'ambito

  • Ambiti minimi: richiedi solo i permessi necessari
  • Consenso progressivo: richiedere ulteriori ambiti man mano che vengono utilizzate funzionalità
  • Validazione dell'ambito: I token di verifica includono gli scope richiesti prima delle chiamate API

Gestione avanzata degli errori

  • Degrado graduale: fornire funzionalità di riserva quando l'autenticazione fallisce
  • Messaggistica utente: Spiega chiaramente perché sono necessari i permessi
  • Logica dei ritenti: Implementare meccanismi di ritentazione appropriati per i fallimenti transitori.

Ottimizzazione delle prestazioni

  • Richieste parallele: acquisire token per più servizi in parallelo quando possibile
  • Operazioni batch: Chiamate API di gruppo per minimizzare il sovraccarico di acquisizione dei token
  • Gestione della cache: Implementare strategie efficienti di cache dei token