
Azure OpenAI 服务认证方式指南
引言
Azure OpenAI 服务提供了两种主要的认证方式:API 密钥认证和 Azure Active Directory (Azure AD) 认证。本教程将详细介绍如何配置和使用这两种认证方式,包括完整的代码示例和最佳实践。
为什么需要两种认证方式?
特性 | API 密钥认证 | Azure AD 认证 |
---|---|---|
安全性 | 中等 | 高 |
复杂度 | 简单 | 复杂 |
适用场景 | 开发测试 | 生产环境 |
权限管理 | 基于密钥 | 基于角色 |
审计能力 | 有限 | 完整 |
前置要求
- Azure 订阅
- Azure CLI 已安装并登录
- Python 3.8+
- 必要的 Python 包:
openai
,azure-identity
环境准备
1. 安装 Azure CLI
# macOS
brew install azure-cli
# Ubuntu/Debian
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash
# Windows
# 从 https://docs.microsoft.com/cli/azure/install-azure-cli-windows 下载安装包
2. 登录 Azure
az login
az account set --subscription "your-subscription-id"
3. 安装 Python 依赖
pip install openai azure-identity python-dotenv
方法一:API 密钥认证(推荐用于开发环境)
步骤 1:创建 Azure OpenAI 资源
# 创建资源组(如果不存在)
az group create --name addo --location eastus
# 创建Azure OpenAI资源
az cognitiveservices account create \
--name myopenai-addo \
--resource-group addo \
--location eastus \
--kind OpenAI \
--sku s0
步骤 2:部署模型
# 部署GPT-4o模型
az cognitiveservices account deployment create \
--name myopenai-addo \
--resource-group addo \
--deployment-name gpt-4o-addo \
--model-name gpt-4o \
--model-version 2024-08-06 \
--model-format OpenAI \
--sku-name standard \
--sku-capacity 1
步骤 3:获取访问密钥
az cognitiveservices account keys list \
--name myopenai-addo \
--resource-group addo
步骤 4:Python 代码示例
from openai import AzureOpenAI
# 配置Azure OpenAI客户端
client = AzureOpenAI(
azure_endpoint="https://myopenai-addo.openai.azure.com/",
api_key="your-api-key-here",
api_version="2024-02-01"
)
# 发送请求
response = client.chat.completions.create(
model="gpt-4o-addo",
messages=[{"role": "user", "content": "Hello, Azure OpenAI!"}],
max_tokens=100
)
print(response.choices[0].message.content)
方法二:Azure AD 认证(推荐用于生产环境)
步骤 1:创建 Azure AD 应用
# 创建Azure AD应用
az ad app create \
--display-name "AzureOpenAIDemo" \
--query "{appId:appId, displayName:displayName}"
步骤 2:创建服务主体
az ad sp create --id "your-app-id"
步骤 3:生成客户端密钥
az ad app credential reset \
--id "your-app-id" \
--query "{clientId:appId, clientSecret:password, tenantId:appOwnerOrganizationId}"
步骤 4:配置自定义子域
az cognitiveservices account update \
--name myopenai-addo \
--resource-group addo \
--custom-domain myopenai-addo
步骤 5:分配权限
az role assignment create \
--assignee "your-app-id" \
--role "Cognitive Services User" \
--scope "/subscriptions/your-subscription-id/resourceGroups/addo/providers/Microsoft.CognitiveServices/accounts/myopenai-addo"
步骤 6:Python 代码示例
from azure.identity import ClientSecretCredential
from openai import AzureOpenAI
# Azure AD配置
client_id = "your-client-id"
client_secret = "your-client-secret"
tenant_id = "your-tenant-id"
# 创建凭据
credential = ClientSecretCredential(
client_id=client_id,
client_secret=client_secret,
tenant_id=tenant_id
)
# 创建令牌提供程序
def token_provider():
token = credential.get_token("https://cognitiveservices.azure.com/.default")
return token.token
# 配置Azure OpenAI客户端
client = AzureOpenAI(
azure_endpoint="https://myopenai-addo.openai.azure.com/",
azure_ad_token_provider=token_provider,
api_version="2024-02-01"
)
# 发送请求
response = client.chat.completions.create(
model="gpt-4o-addo",
messages=[{"role": "user", "content": "Hello, Azure AD!"}],
max_tokens=100
)
print(response.choices[0].message.content)
完整配置示例
环境变量配置(.env 文件)
# API密钥认证
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_ENDPOINT=https://myopenai-addo.openai.azure.com/
AZURE_OPENAI_API_VERSION=2024-02-01
AZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o-addo
# Azure AD认证
AZURE_CLIENT_ID=your-client-id
AZURE_CLIENT_SECRET=your-client-secret
AZURE_TENANT_ID=your-tenant-id
# 其他配置
AZURE_OPENAI_MAX_TOKENS=1000
AZURE_OPENAI_TEMPERATURE=0.7
通用客户端封装
class AzureOpenAIClient:
"""Azure OpenAI客户端封装类"""
def __init__(self, use_azure_ad=False, **kwargs):
self.use_azure_ad = use_azure_ad
if use_azure_ad:
# Azure AD认证
credential = ClientSecretCredential(
client_id=kwargs.get('client_id'),
client_secret=kwargs.get('client_secret'),
tenant_id=kwargs.get('tenant_id')
)
def token_provider():
token = credential.get_token("https://cognitiveservices.azure.com/.default")
return token.token
self.client = AzureOpenAI(
azure_endpoint=kwargs.get('endpoint'),
azure_ad_token_provider=token_provider,
api_version=kwargs.get('api_version', '2024-02-01')
)
else:
# API密钥认证
self.client = AzureOpenAI(
azure_endpoint=kwargs.get('endpoint'),
api_key=kwargs.get('api_key'),
api_version=kwargs.get('api_version', '2024-02-01')
)
def chat_completion(self, messages, **kwargs):
"""创建聊天完成"""
return self.client.chat.completions.create(
model=kwargs.get('deployment_name', 'gpt-4o-addo'),
messages=messages,
**kwargs
)
安全最佳实践
API 密钥认证
- 使用 Azure Key Vault 存储密钥
- 定期轮换 API 密钥
- 避免在客户端代码中硬编码密钥
- 实施网络访问控制
Azure AD 认证
- 使用最小权限原则
- 实施多因素认证
- 定期审计权限分配
- 使用托管身份而非服务主体(如果可能)
故障排除
常见问题
-
认证失败
# 检查Azure CLI登录状态 az account show # 验证权限分配 az role assignment list --assignee "your-app-id"
-
自定义子域问题
# 检查自定义子域配置 az cognitiveservices account show \ --name myopenai-addo \ --resource-group addo \ --query "properties.customSubDomainName"
-
令牌权限问题
# 验证服务主体权限 az ad sp show --id "your-app-id" --query "appRoles"
调试技巧
- 使用 Azure Monitor 查看详细日志
- 检查网络流量和 HTTP 状态码
- 验证环境变量配置
- 测试不同的认证方法
性能优化
连接池配置
import httpx
# 配置连接池
client = AzureOpenAI(
azure_endpoint="your-endpoint",
api_key="your-key",
http_client=httpx.Client(
limits=httpx.Limits(max_connections=100, max_keepalive_connections=20),
timeout=httpx.Timeout(60.0)
)
)
重试机制
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def call_openai_api():
response = client.chat.completions.create(...)
return response
成本管理
使用量监控
# 查看使用情况
az monitor metrics list \
--resource "/subscriptions/your-subscription/resourceGroups/addo/providers/Microsoft.CognitiveServices/accounts/myopenai-addo" \
--metric "TotalCalls" \
--time-grain PT1H
预算设置
# 创建预算警报
az consumption budget create \
--name "OpenAI-Budget" \
--resource-group addo \
--amount 100 \
--time-grain Monthly \
--category Cost \
--notifications "email@domain.com"
总结
选择建议
场景 | 推荐认证方式 | 理由 |
---|---|---|
开发测试 | API 密钥 | 配置简单,快速上手 |
个人项目 | API 密钥 | 成本低,维护简单 |
企业生产 | Azure AD | 安全性高,支持审计 |
多租户应用 | Azure AD | 权限管理灵活 |
合规要求 | Azure AD | 支持完整的审计日志 |
关键要点
- 安全性第一:生产环境优先选择 Azure AD 认证
- 权限最小化:遵循最小权限原则
- 监控到位:实施使用量监控和成本控制
- 定期审计:定期检查权限分配和使用情况
- 备份方案:准备多种认证方式的切换方案
通过本文的详细指导,你现在可以根据具体需求选择合适的 Azure OpenAI 认证方式,并确保应用的安全性和可维护性。
参考资源
本文基于实际配置和测试编写,如有问题请参考官方文档或联系 Azure 技术支持。