You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python Web API实现Azure AD用户程序化认证方案咨询

我来帮你搞定这个场景——用Python Web API代客户端完成Azure AD的用户名密码认证对吧?这其实是Azure AD支持的**资源所有者密码凭据流(ROPC)**的典型使用场景,不过先提醒你:这个流比较敏感,只适合客户端确实无法直接对接AD的特殊情况,比如老旧系统集成。下面是具体的实现步骤:

核心依赖:MSAL Python库

首先要用微软官方的Microsoft Authentication Library (MSAL) for Python,它专门处理Azure AD的认证逻辑,比自己写HTTP请求靠谱多了。安装命令:

pip install msal
第一步:配置Azure AD应用

先在Azure门户完成应用注册:

  • 注册一个新的Azure AD应用,记录下租户ID和客户端ID
  • 找到应用的"认证"页面,启用"资源所有者密码凭据"流(注意:这个流仅支持工作/学校账户,个人微软账户不兼容)
  • 根据你的业务需求,给应用分配对应的API权限(比如如果要调用Graph API,就加User.Read等权限,记得要授予管理员同意)
第二步:编写程序化认证函数

用MSAL实现用户名密码的认证逻辑,直接调用acquire_token_by_username_password方法即可:

import msal

def authenticate_with_aad(username: str, password: str, tenant_id: str, client_id: str, scopes: list):
    # 初始化MSAL客户端
    aad_app = msal.PublicClientApplication(
        client_id=client_id,
        authority=f"https://login.microsoftonline.com/{tenant_id}"
    )
    
    # 发起用户名密码认证请求
    auth_result = aad_app.acquire_token_by_username_password(
        username=username,
        password=password,
        scopes=scopes
    )
    
    # 处理认证结果
    if "access_token" in auth_result:
        return {
            "access_token": auth_result["access_token"],
            "id_token": auth_result.get("id_token"),  # 可选,包含用户身份信息
            "token_type": auth_result["token_type"],
            "expires_in": auth_result["expires_in"]
        }
    else:
        # 抛出错误,比如密码错误、用户开启MFA、权限不足等
        error_msg = auth_result.get("error_description", auth_result.get("error", "未知错误"))
        raise ValueError(f"Azure AD认证失败: {error_msg}")
第三步:集成到你的Web API

以FastAPI为例,创建一个接口接收客户端传来的用户名密码,调用认证函数后返回令牌:

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import os

app = FastAPI(title="Azure AD Proxy Auth API")

# 从环境变量加载敏感配置(绝对不要硬编码!)
TENANT_ID = os.getenv("AAD_TENANT_ID")
CLIENT_ID = os.getenv("AAD_CLIENT_ID")
# 这里的作用域根据你的需求调整,比如要调用自己的API就填api://{client-id}/.default
TARGET_SCOPES = ["https://graph.microsoft.com/User.Read"]

# 定义请求体模型
class AuthRequest(BaseModel):
    username: str
    password: str

@app.post("/api/auth/get-token", response_description="返回Azure AD访问令牌")
async def get_aad_token(request: AuthRequest):
    try:
        token_data = authenticate_with_aad(
            username=request.username,
            password=request.password,
            tenant_id=TENANT_ID,
            client_id=CLIENT_ID,
            scopes=TARGET_SCOPES
        )
        return token_data
    except ValueError as e:
        raise HTTPException(status_code=401, detail=str(e))
关键注意事项
  • 安全第一:一定要确保客户端和你的API之间用HTTPS传输,明文密码绝对不能走HTTP!另外,尽量避免在用户可以直接用OAuth2授权码流的场景用ROPC,这个流是最后的备选方案。
  • MFA限制:ROPC流不支持多因素认证,如果用户开启了MFA,认证会直接失败,你需要在代码里处理这种异常情况,给客户端明确的提示。
  • 令牌缓存:上面的示例没有实现令牌缓存,如果你的API有大量重复认证请求,可以用MSAL的内置缓存机制,减少对Azure AD的调用次数,提升性能。
  • 配置管理:所有敏感配置(租户ID、客户端ID)都要存在环境变量或者Azure Key Vault里,绝对不能硬编码在代码中,避免泄露。

内容的提问来源于stack exchange,提问作者Jakob Kristensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:20:21