【发布时间】:2023-01-12 11:08:34
【问题描述】:
我在 Python 3.9 中使用 FastAPI。我无法获得可用的 oAuth2 依赖项来处理我们特定的 Azure 令牌身份验证,而且我最初尝试使用 fastapi-azure-auth 似乎也不匹配。
因此,我目前正在对 fastapi.security.base.SecurityBase 进行子类化,以尝试创建我自己的身份验证依赖项。我使用 fastapi.security.oauth2.OAuth2 和 fastapi.security.oauth2.OAuth2PasswordBearer 中的方法作为指导。
这些模型依赖于 fastapi.openapi.models.OAuth2 和 fastapi.openapi.models.OAuthFlow 回到 Pydantic 的 BaseModel,除了初始化提供的字段外,大概没有发生任何事情。
我似乎能找到的关于将 OAuth2 与 FastAPI 结合使用的唯一信息似乎是对很棒的 FastAPI 安全小教程的重复剪切和粘贴,它只为一个简单的虚拟示例提供指导。
在这个阶段,我真的很想回答一个对我来说很困惑的问题。
- 我有一个“范围”,我认为它可能是安全方案发挥作用所必需的。
-
fastapi.security.oauth2.OAuth2模型需要为其model属性提供fastapi.openapi.models.OAuth2模型。 -
fastapi.openapi.models.OAuth2模型需要为其flows属性提供fastapi.openapi.models.OAuthFlows模型。 -
OAuthFlows模型包含OAuthFlow<Type>模型之一,它是fastapi.openapi.models.OAuthFlow的子类。 -
OAuthFlow基类是存储“作用域”的地方:scopes: Dict[str, str] = {}我似乎找不到关于
OAuth2PasswordBearer的行为和用法的一句话,直到返回OAuthFlow,甚至代码也完全没有任何这些类的任何在线文档。但是从 FastAPI 教程和 OpenAPI 文档中似乎可以清楚地看出,“作用域”是一个字符串;并且多个范围有时可以表示为使用空格作为分隔符的单个字符串。我无法避免得出这样的结论(以及我可以提供的作为范围的数据证实),“范围”是标量:单个值。
https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/ 说:
- OAuth2 规范将“范围”定义为由空格分隔的字符串列表。
- 每个字符串的内容可以有任何格式,但不应包含空格。
- 每个“范围”只是一个字符串(没有空格)。
所以我的问题是:我们应该如何向
OAuthFlow.scopesdict 提供标量值?我的范围(标量)看起来像这样:
api://a12b34cd-5e67-89f0-a12b-c3de456f78ab/.default是否应将其作为键或值或两者提供,否则是否可以将其他键/值留空 (
"")、None,或者应该在其中放置什么(为什么?)?此外,由于存在
fastapi.security.oauth2.SecurityScopes类做店铺标量范围作为空格分隔的字符串,为什么有两种存储范围的方法以及它们如何交互(如果有的话)?
【问题讨论】:
标签: python oauth-2.0 fastapi openapi