Azure App Service对接AAD身份提供程序的Python Streamlit应用获取登录用户信息
可行解决思路
1. 先确认Azure App Service身份验证的令牌配置
- 进入Azure门户对应App Service的「身份验证」面板,找到你配置的AAD身份提供程序点击编辑
- 确认令牌存储选项已经开启,这个是
/.auth/me端点能返回数据的前提,未开启时该接口只会返回空数组 - 检查添加的权限范围,必须至少包含
openid、email、profile三个委托权限,否则AAD不会返回用户姓名、邮箱这类声明
2. 修正/.auth/me端点的调用方式
Streamlit部署在App Service上时,调用该接口不能用外部域名请求,要在服务端发起本地请求,避免跨域和身份凭证传递问题:
- 服务端请求时必须带上当前请求的
X-MS-TOKEN-AAD-ID-TOKEN请求头,这个头是App Service认证通过后自动注入到发往后端的请求中的 - 参考实现代码:
import streamlit as st import requests def get_user_info(): # 从请求头获取App Service注入的ID令牌,Streamlit 1.23+版本支持st.context.headers id_token = st.context.headers.get("X-MS-TOKEN-AAD-ID-TOKEN") if not id_token: return None # 本地调用/.auth/me端点,避免跨域 headers = {"X-MS-TOKEN-AAD-ID-TOKEN": id_token} response = requests.get("http://localhost/.auth/me", headers=headers) if response.status_code == 200: return response.json() return None user_info = get_user_info() if user_info: st.write(user_info)
如果你的Streamlit版本低于1.23,需要先升级版本才能获取请求头。
3. 直接从请求头获取声明(更简化方案)
App Service认证通过后会自动把用户的核心声明注入到请求头里,不需要调用/.auth/me也能拿到基础信息:
- 姓名可以从
X-MS-CLIENT-PRINCIPAL-NAME头获取 - 邮箱可以从
X-MS-CLIENT-PRINCIPAL-EMAIL头获取 - 用户ID可以从
X-MS-CLIENT-PRINCIPAL-ID头获取 - 如果需要更多自定义声明,可以直接解析
X-MS-TOKEN-AAD-ID-TOKEN头里的JWT令牌内容
4. 排查Streamlit配置问题
- 确认你没有在Streamlit配置里开启CORS限制或者反向代理配置错误,导致App Service注入的请求头被丢弃
- 不要在客户端用JavaScript调用
/.auth/me,跨域限制会导致请求携带的身份凭证失效,所有用户信息获取逻辑必须放在服务端执行
内容的提问来源于stack exchange,提问作者Grumpybeard
相关产品推荐
相关产品推荐

