Condividi tramite


Effettuare l'autenticazione su Cosmos DB in Microsoft Fabric dai Fabric Notebooks

Cosmos DB in Microsoft Fabric si basa esclusivamente sull'autenticazione di Microsoft Entra ID e sui ruoli predefiniti del piano dati per gestire l'autenticazione e l'autorizzazione. In questa guida, utilizzerai l'ID Microsoft Entra e l'account con cui sei connesso per collegarti a un artefatto di Cosmos DB in Microsoft Fabric.

Prerequisiti

  • Identità con l'autorizzazione lettura per il database in Fabric

Recuperare l'endpoint di Cosmos DB

Ottenere prima di tutto l'endpoint per il database Cosmos DB in Fabric. Questo endpoint è necessario per connettersi usando Azure SDK.

  1. Apri il portale Fabric (https://app.fabric.microsoft.com).

  2. Navigare al database Cosmos DB esistente.

  3. Selezionare l'opzione Impostazioni nella barra dei menu per il database.

    Screenshot dell'opzione della barra dei menu

  4. Nella finestra di dialogo impostazioni passare alla sezione Connessione . Copia poi il valore del campo Endpoint del database NoSQL per Cosmos DB. Questo valore viene usato nei passaggi successivi.

    Screenshot della sezione

Eseguire l'autenticazione da un notebook

I notebook di Fabric non hanno un modo per creare un oggetto credenziali di Azure valido usato dai servizi di Azure. Gli utenti eseguono l'autenticazione usando le utilità delle credenziali di Fabric NotebookUtils che richiedono l'ambito di autenticazione per Cosmos DB e producono un token in formato stringa. Questo richiede codice personalizzato per creare un oggetto credenziali di Azure valido.

Ecco un esempio di notebook che illustra come eseguire questa operazione.

Cella [1]:

#Install packages
%pip install azure-cosmos

Cella [2]:

#Imports and config values
import logging

from azure.cosmos.aio import CosmosClient
from azure.cosmos.exceptions import CosmosHttpResponseError

COSMOS_ENDPOINT = 'https://my-cosmos-endpoint.cosmos.fabric.microsoft.com:443/'
COSMOS_DATABASE_NAME = '{your-cosmos-artifact-name}'
COSMOS_CONTAINER_NAME = '{your-container-name}'

Il contenuto di Cell 3 crea un oggetto FabricTokenCredential() e contiene il codice necessario per produrre un oggetto credenziale valido per Cosmos DB SDK dalla stringa di token generata dalle utilità credenziali NotebookUtils di Fabric necessarie per autenticare un utente.

Cella [3]:

# Custom TokenCredential implementation for Fabric authentication in a notebook
%pip install azure-core
from azure.core.credentials import TokenCredential, AccessToken
import base64
import json
import notebookutils
from datetime import datetime, timezone

class FabricTokenCredential(TokenCredential):

    def get_token(self, *scopes: str, claims: Optional[str] = None, tenant_id: Optional[str] = None,
                  enable_cae: bool = False, **kwargs: Any) -> AccessToken:
        access_token = notebookutils.credentials.getToken("https://cosmos.azure.com/")
        parts = access_token.split(".")
        if len(parts) < 2:
            raise ValueError("Invalid JWT format")
        payload_b64 = parts[1]
        # Fix padding
        padding = (-len(payload_b64)) % 4
        if padding:
            payload_b64 += "=" * padding
        payload_json = base64.urlsafe_b64decode(payload_b64.encode("utf-8")).decode("utf-8")
        payload = json.loads(payload_json)
        exp = payload.get("exp")
        if exp is None:
            raise ValueError("exp claim missing in token")
        return AccessToken(token=access_token, expires_on=exp) 

Cella [4]:

# Create a Cosmos client with the FabricTokenCredential() and run a query
async with CosmosClient(endpoint, credential=FabricTokenCredential()) as client:
    container = client.get_database_client(COSMOS_DATABASE_NAME).get_container_client(COSMOS_CONTAINER_NAME)

    query_text = "SELECT * FROM c"

    results = container.query_items(query=query_text)

    items = []
    async for item in results:
        items.append(item)

    for item in items:
        print(item)