Python笔记本通过Azure Entra访问API遇登录页面问题排查
问题
我们的API部署在Azure Entra身份提供者之后,在浏览器中调用该端点会先重定向至Microsoft登录页面。现在希望开发者能在Python笔记本中交互式使用该API,避免返回登录页面的HTML内容。我们尝试使用MSAL获取身份验证令牌,但端点仍返回登录页面,请问问题出在哪里?
笔记本代码
import requests from msal import PublicClientApplication # Settings CLIENT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # <- SWA身份提供者应用注册的客户端ID TENANT_ID = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" SCOPE = ["api://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/user_impersonation"] API_URL = f"https://example/api/v1/resources/resource" # 初始化MSAL公共客户端 app = PublicClientApplication( CLIENT_ID, authority=f"https://login.microsoftonline.com/{TENANT_ID}", ) flow = app.initiate_device_flow(scopes=SCOPE) print(flow["message"]) # 向用户提供登录说明 result = app.acquire_token_by_device_flow(flow) if "access_token" in result: token = result["access_token"] # 调用API headers = {"Authorization": f"Bearer {token}"} response = requests.get(API_URL, headers=headers) if response.status_code == 200: print("API响应:", response.text) # <- 这里返回的是登录页面HTML,而非资源内容 else: print("访问API失败:", response.status_code, response.text) else: print("获取令牌失败:", result.get("error_description"))
可能的原因及解决办法
- API身份验证配置未启用Bearer令牌支持:检查API的Azure Entra保护设置,确认是否开启了OAuth 2.0 Bearer令牌验证。如果仅配置了浏览器重定向类的认证(如OpenID Connect授权码流),API会忽略
Authorization请求头,直接触发登录重定向。 - 令牌受众与API不匹配:用JWT解码工具查看获取到的
access_token,确认其中的aud声明是否与API的应用ID URI(即api://<你的API应用ID>)完全一致。如果不一致,说明scope配置错误或请求的资源目标有误。 - 客户端应用权限未获授权:在Azure Entra中,确认代码里
CLIENT_ID对应的应用注册,是否已被授予该API的user_impersonation权限,且该权限已完成管理员同意(若为租户级权限)。 - API URL指向错误:确认
API_URL是否直接指向受保护的API端点,而非前端页面地址。如果是前端页面URL,即使携带令牌也会触发登录重定向逻辑。 - Authorization头格式错误:检查请求头是否严格遵循
Bearer <token>格式,无拼写错误或多余空格。可打印完整headers确认格式正确性。
内容的提问来源于stack exchange,提问作者poklaassen
相关产品推荐
相关产品推荐

