Autentisera mot Cosmos DB i Microsoft Fabric från Fabric Notebooks

Cosmos DB i Microsoft Fabric förlitar sig uteslutande på Microsoft Entra ID-autentisering och inbyggda dataplansroller för att hantera autentisering och auktorisering. I den här guiden använder du Microsoft Entra-ID och ditt inloggade konto för att ansluta till en Cosmos DB-artefakt i Microsoft Fabric.

Förutsättningar

  • En identitet med behörighet att läsa för databasen i Fabric

Hämta Cosmos DB-slutpunkt

Hämta först slutpunkten för Cosmos DB-databasen i Infrastrukturresurser. Den här slutpunkten krävs för att ansluta med hjälp av Azure SDK.

  1. Öppna Fabric-portalen (https://app.fabric.microsoft.com).

  2. Gå till din befintliga Cosmos DB-databas.

  3. Välj alternativet Inställningar i menyraden för databasen.

    Skärmbild av menyradsalternativet Inställningar för en databas i Infrastrukturportalen.

  4. I dialogrutan Inställningar navigerar du till avsnittet Anslutning . Kopiera sedan värdet för fältet Slutpunkt för Cosmos DB NoSQL-databas . Du använder det här värdet i senare steg.

    Skärmbild av avsnittet

Autentisera från en anteckningsbok

Fabric-notebooks kan inte skapa ett giltigt Azure-autentiseringsuppgift som används av Azure-tjänster. Användare autentiserar med Fabric NotebookUtils autentiseringsverktyg som kräver autentiseringsomfånget för Cosmos DB och genererar en token i strängformat. Detta kräver viss anpassad kod för att skapa ett giltigt Azure-autentiseringsobjekt.

Här är ett notebook-exempel som visar hur du gör detta.

Cell [1]:

#Install packages
%pip install azure-cosmos

Cell [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}'

Innehållet i Cell 3 skapar ett FabricTokenCredential()-objekt och innehåller den kod som krävs för att skapa ett giltigt autentiseringsobjekt för Cosmos DB SDK från tokensträngen som genereras av autentiseringsverktyget Fabric NotebookUtils som krävs för att autentisera en användare.

Cell [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) 

Cell [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)