如何在Azure B2C与FastAPI集成中配置多Scope?
解决FastAPI + fastapi-azure-auth多Scope显示问题
问题根源
多次实例化AzureSettings会覆盖FastAPI全局的OpenAPI安全配置——每次创建新实例时,都会重新注册一套认证方案,最终只有最后一次的配置会生效,导致全局认证选项只显示最后一个Scope,且路由端无法正确关联指定的Scope。
正确实现方案
1. 全局仅初始化一套认证配置
创建一个包含所有需要的Scope的AzureSettings实例,对应的SingleTenantAzureAuthorizationCodeBearer也只实例化一次:
from fastapi import FastAPI, Security from fastapi_azure_auth import SingleTenantAzureAuthorizationCodeBearer, AzureSettings # 初始化全局配置,包含所有需要的Scope(注意格式要和Azure B2C中定义的一致) settings = AzureSettings( tenant_id="你的租户ID", client_id="你的应用ID", scopes={ "https://你的租户.onmicrosoft.com/api/premium": "高级权限", "https://你的租户.onmicrosoft.com/api/admin": "管理员权限", "https://你的租户.onmicrosoft.com/api/basica": "基础权限" } ) # 全局唯一的认证依赖实例 oauth2_scheme = SingleTenantAzureAuthorizationCodeBearer(settings=settings) app = FastAPI()
2. 路由中单独指定所需Scope
在每个需要权限控制的路由上,通过Security()函数的scopes参数指定该路由要求的Scope:
# 仅允许拥有premium Scope的用户访问 @app.get("/premium") async def premium_resource( token: str = Security(oauth2_scheme, scopes={"https://你的租户.onmicrosoft.com/api/premium": "高级权限"}) ): return {"content": "仅高级用户可见"} # 仅允许拥有admin Scope的用户访问 @app.get("/admin") async def admin_resource( token: str = Security(oauth2_scheme, scopes={"https://你的租户.onmicrosoft.com/api/admin": "管理员权限"}) ): return {"content": "仅管理员可见"} # 仅允许拥有basica Scope的用户访问 @app.get("/basic") async def basic_resource( token: str = Security(oauth2_scheme, scopes={"https://你的租户.onmicrosoft.com/api/basica": "基础权限"}) ): return {"content": "基础用户可见"}
3. 关键注意事项
- Scope格式必须匹配Azure B2C配置:不能只写
premium这类短名称,必须使用Azure B2C中定义的完整Scope URI(比如https://{tenant}.onmicrosoft.com/{api-id}/{scope-name}),否则不仅FastAPI docs无法正确显示,Azure B2C也无法完成权限校验。 - 避免重复实例化认证对象:全局只保留一套
AzureSettings和SingleTenantAzureAuthorizationCodeBearer实例,所有路由复用同一个认证依赖。
内容的提问来源于stack exchange,提问作者Martin Antelo
相关产品推荐
相关产品推荐

