Udostępnij przez


Uwierzytelnianie w usłudze Cosmos DB na platformie Microsoft Fabric z użyciem notesów Fabric

Usługa Cosmos DB w Microsoft Fabric korzysta wyłącznie z uwierzytelniania za pomocą Microsoft Entra ID i wbudowanych ról poziomu danych do zarządzania uwierzytelnianiem i autoryzacją. W tym przewodniku użyjesz Microsoft Entra ID i zalogowanego konta, aby połączyć się z artefaktem Cosmos DB w Microsoft Fabric.

Wymagania wstępne

  • Tożsamość z uprawnieniem Odczyt dla bazy danych w Fabric

    • Aby uzyskać więcej informacji na temat uprawnień Fabric, zobacz kontrola dostępu.

Pobierz punkt końcowy usługi Cosmos DB

Najpierw uzyskaj punkt końcowy dla bazy danych Cosmos DB w Fabric. Ten punkt końcowy jest wymagany do nawiązania połączenia przy użyciu zestawu Azure SDK.

  1. Otwórz portal Fabric (https://app.fabric.microsoft.com).

  2. Przejdź do istniejącej bazy danych Cosmos DB.

  3. Wybierz opcję Ustawienia na pasku menu bazy danych.

    Zrzut ekranu przedstawiający opcję paska menu

  4. W oknie dialogowym ustawień przejdź do sekcji Połączenie . Następnie skopiuj wartość pola Punkt końcowy dla bazy danych NoSQL usługi Cosmos DB . Ta wartość jest używana w późniejszym kroku lub krokach.

    Zrzut ekranu przedstawiający sekcję

Uwierzytelnianie z notesu

Notatniki Fabric nie mają możliwości utworzenia prawidłowego obiektu poświadczeń Azure używanego przez usługi Azure. Użytkownicy uwierzytelniają się przy użyciu narzędzi poświadczeń Fabric NotebookUtils , które wymagają zakresu uwierzytelniania dla usługi Cosmos DB i generują token w formacie ciągu. Wymaga to wykonania kodu niestandardowego w celu utworzenia prawidłowego obiektu poświadczeń platformy Azure.

Oto przykładowy notes, który pokazuje, jak to zrobić.

Komórka [1]:

#Install packages
%pip install azure-cosmos

Komórka [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}'

Zawartość komórki 3 tworzy obiekt FabricTokenCredential() i zawiera kod niezbędny do utworzenia prawidłowego obiektu poświadczeń dla zestawu SDK usługi Cosmos DB z ciągu tokenu wygenerowanego przez narzędzia poświadczeń Fabric NotebookUtils wymagane do uwierzytelnienia użytkownika.

Komórka [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) 

Komórka [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)