Partilhar via


Referência da API JavaScript de autenticação

O Fabric Extensibility Toolkit fornece uma API JavaScript para adquirir tokens de autenticação que podem ser usados para aceder a APIs Fabric, serviços Azure e qualquer aplicação protegida pelo Entra. Este artigo fornece exemplos abrangentes de referência e utilização de APIs.

Sugestão

Para um guia rápido de início, consulte Adquirir tokens Microsoft Entra.

Referência da API

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

export interface AcquireFrontendAccessTokenParams {
    scopes: string[];
}

export interface AccessToken {
    token: string;
}

Observação

A implementação atual do toolkit de extensibilidade suporta aquisição básica de tokens com escopos. Funcionalidades avançadas como solicitação de consentimento total e tratamento de acesso condicional ainda não estão disponíveis, mas poderão ser adicionadas em versões futuras.

A API devolve um AccessToken objeto que contém:

  • token: A cadeia de tokens JWT a usar nos cabeçalhos de Autorização

Utilização básica

Aquisição simples de tokens

// 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 com oscilações específicas

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

Exemplos de utilização de tokens

Acesso à API de Fabric

O token pode ser usado diretamente com APIs REST do Fabric:

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

Use os escopos para especificar os serviços Azure a que precisa de acesso:

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();
}

Acesso a aplicações personalizadas

Aceda às suas próprias aplicações protegidas pela 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();
}

Referência do parâmetro

scopes

Um conjunto de cadeias de escopo que especificam as permissões que o seu token precisa.

Common Azure service scopes:

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

Exemplo de uso:

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

Arranjo de osciloscópios vazios: Use um array vazio para obter um token com permissões padrão do Fabric:

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

O Extensibility Toolkit gere automaticamente os fluxos de trabalho de consentimento:

  • Pedido inicial: Se faltar consentimento, abre-se uma janela pop-up
  • Interação do utilizador: O utilizador concede ou nega permissões
  • Fecho automático: O popup fecha automaticamente após a ação do utilizador
  • Entrega do token: Se for bem-sucedida, o token é devolvido à sua aplicação

O toolkit gere automaticamente os pop-ups de consentimento, mas pode personalizar o comportamento do URI de redirecionamento. Crie uma página de redirecionamento que trate da resposta de consentimento:

// 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();
}

Para aceder a recursos entre diferentes inquilinos:

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

Tratamento de erros

Cenários de erro comuns

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

Gestão da expiração do 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;
  }
}

Melhores práticas

Cache e reutilização de tokens

  • Tokens de cache: Armazenar tokens na memória até à expiração
  • Atualização automática: Implementar atualização automática do token antes do vencimento
  • Armazenamento seguro: Nunca persista tokens para armazenamento local ou cookies

Gestão do âmbito

  • Âmbito mínimo: Solicite apenas as permissões de que precisa
  • Consentimento progressivo: Solicitar escopos adicionais à medida que as funcionalidades forem utilizadas
  • Validação de escopo: Os tokens de verificação incluem os escopos necessários antes das chamadas API

Tratamento avançado de erros

  • Degradação graciosa: Fornecer funcionalidade de recuo quando a autenticação falha
  • Mensagens do utilizador: Explique claramente porque são necessárias permissões
  • Lógica de retentativa: Implementar mecanismos de retentativa apropriados para falhas transitórias

Otimização do desempenho

  • Pedidos paralelos: Adquirir tokens para múltiplos serviços em paralelo sempre que possível
  • Operações em lote: Chamadas de API de grupo para minimizar a sobrecarga de aquisição de tokens
  • Gestão de cache: Implementar estratégias eficientes de cache de tokens