Azure OpenAI 服务认证方式指南

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 认证

  • 使用最小权限原则
  • 实施多因素认证
  • 定期审计权限分配
  • 使用托管身份而非服务主体(如果可能)

故障排除

常见问题

  1. 认证失败

    # 检查Azure CLI登录状态
    az account show
    
    # 验证权限分配
    az role assignment list --assignee "your-app-id"
    
  2. 自定义子域问题

    # 检查自定义子域配置
    az cognitiveservices account show \
        --name myopenai-addo \
        --resource-group addo \
        --query "properties.customSubDomainName"
    
  3. 令牌权限问题

    # 验证服务主体权限
    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 支持完整的审计日志

关键要点

  1. 安全性第一:生产环境优先选择 Azure AD 认证
  2. 权限最小化:遵循最小权限原则
  3. 监控到位:实施使用量监控和成本控制
  4. 定期审计:定期检查权限分配和使用情况
  5. 备份方案:准备多种认证方式的切换方案

通过本文的详细指导,你现在可以根据具体需求选择合适的 Azure OpenAI 认证方式,并确保应用的安全性和可维护性。

参考资源


本文基于实际配置和测试编写,如有问题请参考官方文档或联系 Azure 技术支持。

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus