Sleutelloze verificatiemethoden
Hoe u verificatie van beheerde identiteiten configureert voor lokale Python-ontwikkeling, verschilt van de manier waarop u verificatie van beheerde identiteiten configureert voor door Azure gehoste Python-omgevingen.
Sleutelloze verificatie voor Azure OpenAI voor lokale Python-ontwikkeling
Voor lokale ontwikkeling in Python maakt sleutelloze verificatie voor Azure OpenAI Service gebruik van door Azure beheerde identiteiten en RBAC om ontwikkelaars efficiënt te verifiëren en te autoriseren. Zorg ervoor dat u roltoewijzingen in de vorige les hebt geconfigureerd. Zorg er ook voor dat u uw lokaal aangemelde Azure-account hebt geconfigureerd voor toegang tot de Azure OpenAI-doelresource.
Nadat de roltoewijzingen zijn geconfigureerd, kunnen Python-ontwikkelaars de Azure Identity-bibliotheek gebruiken om zich te verifiëren bij Azure OpenAI.
Sleutelloze verificatie met het OpenAI-pakket
In het volgende voorbeeld wordt sleutelloze verificatie geïmplementeerd voor het officiële openai
pakket:
import azure.identity
import openai
credential = azure.identity.DefaultAzureCredential()
token_provider = azure.identity.get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
client = openai.AzureOpenAI(
azure_endpoint=f"https://YOUR-AZURE-OPENAI-ENDPOINT.openai.azure.com",
azure_ad_token_provider=token_provider,
api_version="2024-06-01",
)
response = client.chat.completions.create(
model="YOUR-MODEL-DEPLOYMENT",
messages=[
{"role": "user", "content": "Write a haiku about a hungry cat"},
],
)
In de voorgaande code:
DefaultAzureCredential
is een referentieketen waarmee verificatie wordt uitgevoerd via een reeks specifieke referenties, zoalsAzureCliCredential
enAzureDeveloperCliCredential
. Dit gedrag kan handig zijn voor lokale ontwikkeling, omdat het u de flexibiliteit biedt om u aan te melden metaz login
,azd auth login
of een van de andere ondersteunde verificatiemethoden.U kunt deze klasse zo nodig vervangen door een specifieke referentieklasse. Er kunnen veel parameters worden doorgegeven om de werking ervan aan te passen.
azure.identity.get_bearer_token_provider()
retourneert een token dat een functie biedt voor het OAuth2-bereik. Het bereik dat hier wordt gegeven, komthttps://cognitiveservices.azure.com/.default
overeen met Azure OpenAI-resources. Deze tokenproviderfunctie wordt alleen aangeroepen wanneer er een werkelijke aanvraag wordt gedaan. De regel kan dus slagen, zelfs als de resourcemachtigingen niet juist zijn ingesteld.De
AzureOpenAI
client wordt geïnstantieerd met het Azure-eindpunt, de tokenprovider en de gewenste API-versie. Het is ook mogelijk om eenAsyncAzureOpenAI
client met dezelfde parameters te instantiëren. We raden u aan om deze te gebruiken binnen asynchrone frameworks, zoals FastAPI of Quart.client.chat.completions.create
verzendt een aanvraag naar de Azure OpenAI-implementatie. Wanneer u hetopenai
pakket met Azure gebruikt, mag de modelparameter niet de modelnaam zijn. Dit moet de implementatienaam zijn. Sommige ontwikkelaars kiezen ervoor om implementaties altijd dezelfde naam te geven als modellen voor het gemak, maar dat is niet altijd het geval.De functie tokenprovider wordt op dit moment aangeroepen. Er wordt een token geretourneerd voor de opgegeven referentie en het opgegeven bereik. Als de functie een autorisatiefout retourneert, is er een probleem met de lokaal gebruikte verificatiereferenties of de RBAC-machtigingen voor de resource.
Sleutelloze verificatie met andere pakketten
Als u Azure OpenAI aanroept via een ander pakket, zoals LangChain of LlamaIndex, raadpleegt u de verwijzing voor dat pakket om te bepalen hoe sleutelloze verificatie moet worden gebruikt. Zoek naar parameters zoals 'tokenprovider' (om het resultaat van aanroepen get_bearer_token_provider
door te geven) of 'referentie' (om de referentie zelf door te geven).
Sommige pakketten bieden mogelijk alleen de optie om een echt token door te geven. In dat geval kunt u een token genereren met behulp van de Azure Identity SDK:
credential = azure.identity.DefaultAzureCredential()
token = credential.get_token("https://cognitiveservices.azure.com/.default")
Het gegenereerde token heeft een korte levensduur. Het kan binnen een uur na de generatie verlopen. Vervolgens moet u een nieuw token genereren of logica voor het vernieuwen van tokens implementeren om verloopfouten van tokens van de API te voorkomen. Daarom raden we u aan een SDK te gebruiken die nieuwe tokens genereert voor elke aanvraag of logica voor het vernieuwen van tokens implementeert om dergelijke problemen te voorkomen.
Voorbeeldcode
Het azure-openai-keyless project maakt gebruik van sleutelloze verificatie met het openai
pakket. Het bevat ook infrastructure-as-code-bestanden (Bicep-bestanden) die de vereiste RBAC-rol voor de lokale ontwikkelaar instellen. U kunt dit project implementeren met behulp van slechts een paar opdrachten in de Azure Developer CLI.
Sleutelloze verificatie voor Azure OpenAI voor Door Azure gehoste Python-omgevingen
Wanneer u een Python-app implementeert in een door Azure gehoste omgeving, zoals Azure Container Apps of Azure-app Service, kan de app gebruikmaken van sleutelloze verificatie om te verifiëren bij Azure OpenAI.
Voordat sleutelloze verificatie werkt, moet u de app correct configureren:
- De app moet een systeemidentiteit hebben ingeschakeld of moet zijn gekoppeld aan een door de gebruiker toegewezen identiteit.
- De app-identiteit moet over de juiste machtigingen beschikken om toegang te krijgen tot de Azure OpenAI-resource, zoals de gebruikersrol Cognitive Services OpenAI of de Azure AI-ontwikkelaarsrol.
De volgende stap bestaat uit het gebruik van de Azure Identity SDK om de geïmplementeerde toepassing te verifiëren. Er zijn verschillende opties, afhankelijk van het identiteitstype dat u gebruikt en hoeveel controle u wilt over de verificatiestroom.
Sleutelloze verificatie met DefaultAzureCredential
De eerste optie is om dezelfde DefaultAzureCredential
code te gebruiken die eerder is weergegeven:
import azure.identity
import openai
credential = azure.identity.DefaultAzureCredential()
token_provider = azure.identity.get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
client = openai.AzureOpenAI(
azure_endpoint=f"https://YOUR-AZURE-OPENAI-ENDPOINT.openai.azure.com",
azure_ad_token_provider=token_provider,
api_version="2024-06-01",
)
Zoals eerder beschreven, gebruikt deze code een referentieketen om de app te verifiëren. Het werkt over het algemeen goed wanneer u een systeemidentiteit gebruikt, omdat de Azure Identity SDK precies weet welke identiteit moet worden gebruikt wanneer deze de verificatie uitvoert.
Als u echter een door de gebruiker toegewezen identiteit voor uw app instelt, kan de SDK mogelijk niet bepalen welke identiteit moet worden gebruikt voor verificatie. De reden hiervoor is dat een app kan worden gekoppeld aan meerdere door de gebruiker toegewezen identiteiten. Het helpt bij het instellen van een AZURE_CLIENT_ID
omgevingsvariabele op de client-id van de door de gebruiker toegewezen identiteit, maar die benadering werkt mogelijk niet op alle Azure-platforms.
Sleutelloze verificatie met ManagedIdentityCredential
In een productieomgeving op een Azure-host raden we de ManagedIdentityCredential(/python/api/azure-identity/azure.identity.managedidentitycredential)
klasse aan voor betrouwbaardere verificatie.
Deze klasse kan worden doorgegeven aan de client-id van een door de gebruiker toegewezen identiteit:
ManagedIdentityCredential(client_id=YOUR_APP_IDENTITY_CLIENT_ID)
Het kan ook worden samengesteld zonder parameters, voor gebruik met een systeemidentiteit:
ManagedIdentityCredential()
U kunt de referentie op dezelfde manier gebruiken als DefaultAzureCredential
. Dat wil gezegd, u kunt het gebruiken om tokenproviders of tokens te genereren.
Sleutelloze verificatie in omgevingen
Vaak wordt dezelfde Python-code gebruikt in lokale omgevingen als in productie. Als DefaultAzureCredential
u voor u werkt in zowel lokale als productieomgevingen, kunt u dat overal gebruiken.
Ontwikkelaars kiezen er echter vaak voor om in elke omgeving verschillende referenties te gebruiken. Ze bepalen de keuze op basis van omgevingsvariabelen die de huidige host signaleren.
Denk bijvoorbeeld aan deze if
instructie:
if os.getenv("RUNNING_ON_AZURE"):
credential = azure.identity.ManagedIdentityCredential(os.getenv("AZURE_CLIENT_ID"))
else:
credential = azure.identity.AzureDeveloperCliCredential()
De code controleert eerst op het bestaan van een aangepaste omgevingsvariabele die expliciet is ingesteld om een productieomgeving aan te geven. Voor productie wordt de referentievariabele ingesteld ManagedIdentityCredential
op de client-id van de door de gebruiker toegewezen identiteit die de juiste rol heeft. Anders wordt de referentievariabele ingesteld op AzureDeveloperCliCredential
.
AzureDeveloperCliCredential
gaat ervan uit dat de ontwikkelaar zich azd auth login
lokaal aanmeldt bij het Azure-account.
Een andere benadering is het instellen van een aangepaste gekoppelde referentie.
Er zijn veel opties, afhankelijk van uw omgevingen en verificatiebehoeften.
Voorbeeldcode
Het project openai-chat-app-quickstart maakt gebruik van sleutelloze verificatie voor een Azure-container-app met een door de gebruiker toegewezen identiteit. Het project bevat infrastructure-as-codebestanden (Bicep-bestanden) die de container-app, identiteit en rollen instellen voor zowel de app-identiteit als de lokale ontwikkelaar. U kunt dit project implementeren met behulp van slechts een paar opdrachten in de Azure Developer CLI.