Forbind funktioner til eksterne ressourcer

Deployerede funktioner kalder eksterne Azure- og Fabric-ressourcer som app-identitet ved brug af applikationsautentificering. Deklar de målgrupper, en funktion kræver, og brug platformleverede, ressource-scopede tokens gennem ctx.Tokens.

Udvikler-CLI-login-in og udstedelse af endpoint-opdagelse under authoring-tiden er adskilt fra deployeret runtime-adgang. Verificér tilladelserne til den deployerede app-identitet, selv når en udvikler kan få adgang til ressourcen.

Forudsætninger

  • En Fabric-app med initialiseret Functions. For opsætningsinstruktioner, se Brug funktioner i Fabric Apps.
  • services.functions.auth.type Sat til i applicationrayfin/rayfin.yml. For konfigurationsdetaljer, se Applikationsgodkendelse.
  • App-identiteten gav adgang til hver ekstern ressource, som Functions-koden kalder.

Deklarer en ekstern forbindelse

Deklarér publikum i annotationen RayfinContext , og læs derefter scoped token fra ctx.Tokens:

import {
  UserDataFunctions,
  AudienceType,
  type RayfinContext,
} from '@microsoft/fabric-user-data-functions';

const udf = new UserDataFunctions();

udf.func(
  'accessStorage',
  async (
    ctx: RayfinContext<AppSchema, AudienceType.Storage>,
  ): Promise<string> => {
    const token: string = ctx.Tokens.Storage;
    // Use the token with the resource SDK or REST API.
    return 'ok';
  },
  [],
);

Annotationen er erklæringen. At angive et publikum i RayfinContext<Schema, Audiences> registrerer forbindelsesbindingen. Behold det tredje argument som udf.func()[].

ctx.Tokens indsnævret til de målgrupper, du angiver. Et ikke-deklareret publikum forårsager en kompileringsfejl:

async (
  ctx: RayfinContext<AppSchema, AudienceType.Sql | AudienceType.Storage>,
) => {
  const sqlToken: string = ctx.Tokens.Sql;
  const storageToken: string = ctx.Tokens.Storage;
};

Tokenværdier har typen string . Deklaration af et publikum registrerer dets binding, men garanterer ikke token-tilgængelighed eller adgang til ressourcer. Hvis værten ikke leverer et erklæret token, giver læsning af dens ctx.Tokens egenskab en fejl.

Angiv skemaargumentet

RayfinContext Tag dit app-skema først. Brug det samme skema, som du sender til RayfinClient<AppSchema> , så dataklienten forbliver typet, når du tilføjer målgrupper:

async (ctx: RayfinContext<AppSchema, AudienceType.Sql>) => {
  const data = ctx.getDataClient();
  const token = ctx.Tokens.Sql;
};

Hvis en funktion har brug for audiences, men ikke har adgang til Rayfin DB, så giv standardskemaet eksplicit:

async (ctx: RayfinContext<Record<string, any>, AudienceType.Fabric>) => {
  const token = ctx.Tokens.Fabric;
};

Støttede publikum

AudienceType er kilden til sandhed for understøttede målgrupper:

Ekstern ressource AudienceType
Fabric lakehouse, warehouse, SQL-database i Fabric, spejlet database eller Azure SQL Database Sql
Fabric OneLake files, Azure Blob Storage, Azure Table Storage eller Azure Queue Storage Storage
Microsoft Fabric REST API Fabric
Azure AI Foundry AzureAI
Azure DevOps ADO

En Power BI semantisk model er ikke tilgængelig gennem ctx.Tokens. Brug i stedet stikket fabric-semanticmodel . For stikvejledning, se Connect to Fabric-data.

Forstå implementeringsmetadata

Typeargumenter slettes, før en funktion kører. Under npx rayfin up, løser TypeScript-kompilatoren de erklærede audiences og skriver unionen ind i deployment-metadata. Functions-arbejderen bruger den metadata til at binde forbindelserne.

Et typealias virker, når Functions-projektet har en tsconfig.json:

type SqlAccess = AudienceType.Sql;

async (ctx: RayfinContext<AppSchema, SqlAccess>) => {
  const token = ctx.Tokens.Sql;
};

Foretrækker bogstavelige AudienceType.X værdier. Hvis Functions-projektet ikke har , tsconfig.jsonkan CLI'en ikke bruge compileren, men læser i stedet annotationssyntaksen. I den tilstand opløses et alias til sit eget navn i stedet for det publikum, det repræsenterer. Behandl CLI-advarslen om denne fallback som en fejl, der skal rettes.

Kontekstparameteren skal have en eksplicit RayfinContext<...> annotation. Typegenerering identificerer kontekstparameteren ved hjælp af denne annotation. Uden den behandles parameteren som en request-body parameter.

Tildel ressourcetilladelser

For nuværende Fabric-apps er app-identiteten ejeren af Fabric-app-elementet. Eksterne forbindelser bruger denne identitet og dens tilladelser, ikke identiteten eller tilladelserne fra den app-bruger, der aktiverer funktionen.

Giv app-identiteten de tilladelser, som kræves af hver ressource og API, som Functions-koden kalder. Deklaration af et publikum og implementering af Functions registrerer en tokenbinding, men giver ikke tilladelser til den målrettede ressource.

Behold ressourcetokens på serveren. Returner dem aldrig som funktionsresultater eller send dem til frontend.

App-login og autorisation til at påkalde en funktion er adskilt fra app-identitetens adgang til eksterne ressourcer.

Rayfin DB-identitet

Rayfin DB bruger en separat autentificeringssti. ctx.getDataClient() bruger kaldets Rayfin-token, så databaseadgang bevarer kalderens identitet og databasetilladelser. Applikationsautentificering for Functions skifter ikke Rayfin DB-adgang til applikationsidentiteten.

Brug et token med et Azure SDK

Mange Azure SDK-klienter forventer en TokenCredential i stedet for en rå token-streng. Definér en adapter, der returnerer tokenet fra konteksten:

import type { TokenCredential, AccessToken } from '@azure/identity';

class ContextTokenCredential implements TokenCredential {
  constructor(private readonly token: string) {}

  async getToken(): Promise<AccessToken> {
    return {
      token: this.token,
      expiresOnTimestamp: Date.now() + 3600_000,
    };
  }
}

Giv eller overlad new ContextTokenCredential(ctx.Tokens.Storage) det relevante deklarerede token til en SDK-klient, der kræver en legitimationsformular. Installer resource SDK-pakker i rayfin/functions/package.json, ikke i projektets rod.

Udvikl lokalt

npx rayfin devog npx rayfin dev functions apply starte en lokal Azure Functions Core Tools-vært. I den lokale Functions-host bruger eksterne ressourcetokens identiteten og tilladelserne for den konto, som app-builderen bruger til at logge ind.

Deployerede funktioner bruger i stedet appens identitet. Et vellykket lokalt kald beviser derfor ikke, at den deployerede app-identitet har tilladelse til at tilgå ressourcen. Test den deployerede funktion efter at have givet appens identitet de nødvendige tilladelser.