Autorizzazione personalizzata con funzioni dati utente per un'API GraphQL (anteprima)

Authorizer User-Defined Functions (UDF) consente di eseguire la logica di autorizzazione personalizzata prima dell'elaborazione di una richiesta api GraphQL. Questa funzionalità consente ai proprietari delle API di applicare regole di accesso specifiche dell'azienda che vanno oltre le assegnazioni di ruolo statiche. Con una Funzione Autorizzatore UDF, è possibile valutare le informazioni dalla richiesta autenticata, come ad esempio le rivendicazioni in un token JWT (JSON Web Token), e decidere se la richiesta deve essere consentita. La logica viene implementata come funzione e richiamata automaticamente per le chiamate API in ingresso.

Casi d'uso

Usare una funzione dati utente di autorizzazione quando è necessario:

  • Applicare la logica di business personalizzata prima dell'esecuzione dell'API
  • Limitare l'accesso in base alle attestazioni di identità utente o token
  • Convalidare il principale del servizio separatamente dagli account utente

Funzionamento della funzionalità di autorizzazione

Quando l'autorizzazione personalizzata è abilitata con una funzione dati utente:

  • Una funzione viene eseguita prima dell'esecuzione dell'API GraphQL.
  • Riceve il contesto dalla richiesta autenticata.
  • La logica personalizzata controlla l'autorizzazione.
  • La richiesta API procede se l'autorizzazione ha esito positivo; in caso contrario, viene negata.
  • Il risultato viene ottenuto più velocemente per le richieste future.

Creare una funzione dati utente

Una funzione di autorizzazione all'interno di una funzione dati utente Fabric richiede un formato specifico.

  1. Il nome della funzione può essere definito dall'utente. Non dispone di restrizioni specifiche di GraphQL e deve essere definita in base ai vincoli delle funzioni dei dati utente.
  2. Il nome dell'argomento/parametro della funzione deve essere richiesto e deve essere di tipo dizionario. Quando il servizio GraphQL richiama una funzione, invia un payload contenente un dizionario denominato request con i campi seguenti:
    • tokenClaims (dizionario): coppie chiave-valore contenenti attestazioni di token estratte dal token utente in ingresso.
    • query(string): stringa di query passata quando viene chiamata l'API GraphQL.
    • variables(dictionary): coppie chiave-valore contenenti variabili passate quando viene chiamata l'API GraphQL.
    • Tipo restituito(dizionario): La funzione restituisce isAuthorized e roles. roles è facoltativo e deve essere inviato quando la funzionalità controllo degli accessi in base al ruolo è abilitata.

Example

Creare una funzione dati utente in Fabric portal. Aggiornare il codice della funzione con questa funzione di autorizzazione di esempio.

from typing import TYPE_CHECKING
import fabric.functions as fn
import logging

user data function = fn.UserDataFunctions()

@user data function.function()
def invokeauthudf(request: dict) -> dict:
    
    token_claims: dict = request.get("tokenClaims", {})
    query: str = request.get("query", "")
    variables: dict = request.get("variables", {})
    domain = "onmicrosoft.com"
    spn = "<SPN-ID>"

    # Extract claims from token_claims dictionary
    tid_claim = token_claims.get("tid")
    upn_claim = token_claims.get("upn")
    appid_claim = token_claims.get("appid")
    logging.info(f"Query: {query}");
    logging.info(f"Claims: {token_claims}");
    logging.info(f"Tenant: {tid_claim}");
    logging.info(f"UPN: {upn_claim}");
    logging.info(f"SPN: {appid_claim}");

    # Authorization logic
    ## Optional: Do role-based access check
    roles = []

    if upn_claim is not None:
        is_authorized = domain in upn_claim
        roles = ["Default"]
    else:
        is_authorized =  spn in appid_claim
        roles = ["SPN"]

    logging.info(f"Authorized: {is_authorized}")
    logging.info(f"Roles: {roles}")
    logging.info(f"SPN: {spn}")
    logging.info(f"App ID: {appid_claim}")
    return {

            "isAuthorized": is_authorized,
            "roles": roles
    }

Che cosa fa questa funzione?

  • Questa funzione di dati utente di Authorizer viene eseguita prima dell'esecuzione di una richiesta GraphQL, legge le attestazioni di identità (UPN, ID app) dal token JSON Web Token (JWT) del chiamante e registra i dettagli della richiesta.
  • Autorizza gli utenti verificando se il loro indirizzo email (UPN) appartiene a un dominio specifico e autorizza i principali del servizio confrontando un ID app noto.
  • In base al risultato, restituisce isAuthorized.

Aggiungere una connessione alla funzione Dati utente

Prima di abilitare la funzionalità, è necessario aggiungere una connessione per un tipo di funzione dati utente.

  1. In Impostazioni selezionare Gestisci connessioni e gateway.
  2. Nella scheda Connessioni selezionare Nuovo.
  3. Nella pagina Nuova connessione selezionare Cloud, specificare un nome per la connessione e selezionare Funzione dati utente come tipo di connessione. Usare il metodo OAUth e aggiornare le credenziali per l'autenticazione. Non è necessario selezionare "Consenti l'uso di questa connessione con gateway dati locali o gateway dati di rete virtuale" durante la creazione di questa connessione.

Abilitare la funzionalità di autorizzazione

Abilitare la funzionalità di autorizzazione dopo aver configurato la funzione e la connessione per questo tipo di funzione dati utente. Sono necessarie autorizzazioni di scrittura per abilitare o disabilitare questa funzionalità.

  1. Aprire l'api per l'elemento GraphQL e selezionare Impostazioni.
  2. Selezionare Autorizzazione (anteprima) e abilitare la funzionalità.
  3. Specificare l'elemento della funzione dati utente e la funzione di autenticazione da usare.

Limitazioni e comportamenti

Category dettagli
Authentication È supportato solo OAuth
Supporto B2B Non disponibile per gli utenti guest a causa di limitazioni di connessione
Permissions Scrittura richiesta per la configurazione; Esecuzione necessaria per le chiamate API
Configurazioni non supportate SPN con identificatore di oggetto (OID) non supportato
Caching L'applicazione delle modifiche può richiedere fino a 15 minuti
Dipendenza dell'area UDF e GraphQL devono trovarsi nella stessa area
Collegamento privato Non supportato con accesso pubblico bloccato
Errori di autorizzazione Le richieste hanno esito negativo quando isAuthorized è false o quando il controllo degli accessi in base al ruolo è abilitato e i ruoli restituiti mancano o non corrispondono a un ruolo configurato.
Gestione dei ruoli Quando RBAC è abilitato, la funzione deve restituire i ruoli. Si applica solo il primo ruolo corrispondente.

Passaggi successivi