安全¶
处理安全、身份验证和授权有多种方式。
这通常是一个复杂而“困难”的话题。
在许多框架和系统中,仅仅处理安全和身份验证就需要大量的精力与代码(在许多情况下,它可能占到所有编写代码的 50% 甚至更多)。
FastAPI 提供了多种工具,帮助您轻松、快速、标准化地处理安全,而无需研究和学习所有的安全规范。
但首先,让我们了解一些小概念。
赶时间?¶
如果您不关心这些术语,而只是需要“立即”添加基于用户名和密码的身份验证安全,请跳到下一章。
OAuth2¶
OAuth2 是一项规范,它定义了处理身份验证和授权的多种方式。
它是一个相当广泛的规范,涵盖了多种复杂的用例。
它包括使用“第三方”进行身份验证的方式。
所有带有“使用 Facebook、Google、Twitter、GitHub 登录”的系统底层都使用了这种方式。
OAuth 1¶
存在一个 OAuth 1,它与 OAuth2 非常不同,并且更复杂,因为它包含了关于如何加密通信的直接规范。
它在当今已经不太流行或使用了。
OAuth2 不指定如何加密通信,它期望您的应用程序通过 HTTPS 提供服务。
提示
在部署章节中,您将看到如何使用 Traefik 和 Let's Encrypt 免费设置 HTTPS。
OpenID Connect¶
OpenID Connect 是另一项基于 OAuth2 的规范。
它只是扩展了 OAuth2,通过指定 OAuth2 中相对模糊的一些内容,使其更具互操作性。
例如,Google 登录就使用了 OpenID Connect(其底层使用了 OAuth2)。
但 Facebook 登录不支持 OpenID Connect。它有自己风格的 OAuth2。
OpenID(非“OpenID Connect”)¶
还存在一个“OpenID”规范。它试图解决与 OpenID Connect 相同的问题,但并非基于 OAuth2。
因此,它是一个完全额外的系统。
它在当今已经不太流行或使用了。
OpenAPI¶
OpenAPI(以前称为 Swagger)是构建 API 的开放规范(现为 Linux 基金会的一部分)。
FastAPI 基于 OpenAPI。
这使得拥有多个自动交互式文档界面、代码生成等功能成为可能。
OpenAPI 有一种方式来定义多种安全“方案”。
通过使用它们,您可以利用所有这些基于标准的工具,包括这些交互式文档系统。
OpenAPI 定义了以下安全方案
apiKey
: 一个应用程序特定的密钥,可以来自- 查询参数。
- 请求头(Header)。
- Cookie。
http
: 标准 HTTP 身份验证系统,包括bearer
: 一个带有Bearer
值加上一个令牌的Authorization
头。这继承自 OAuth2。- HTTP 基本认证(Basic authentication)。
- HTTP Digest 等。
oauth2
: 所有 OAuth2 处理安全的方式(称为“流”)。- 其中一些流适用于构建 OAuth 2.0 身份验证提供程序(如 Google、Facebook、Twitter、GitHub 等)
implicit(隐式)
clientCredentials(客户端凭证)
authorizationCode(授权码)
- 但有一个特定的“流”可以直接用于在同一应用程序中处理身份验证
password
: 接下来的一些章节将涵盖此示例。
- 其中一些流适用于构建 OAuth 2.0 身份验证提供程序(如 Google、Facebook、Twitter、GitHub 等)
openIdConnect
: 有一种方式定义如何自动发现 OAuth2 身份验证数据。- 这种自动发现正是 OpenID Connect 规范中定义的。
提示
集成其他身份验证/授权提供商,如 Google、Facebook、Twitter、GitHub 等,也是可能且相对容易的。
最复杂的问题是构建一个像那些一样的身份验证/授权提供商,但 FastAPI 为您提供了工具,让您可以轻松地做到这一点,同时为您承担了繁重的工作。
FastAPI 工具¶
FastAPI 在 fastapi.security
模块中为这些安全方案提供了多种工具,简化了这些安全机制的使用。
在接下来的章节中,您将看到如何使用 FastAPI 提供的这些工具为您的 API 添加安全性。
您还将看到它如何自动集成到交互式文档系统中。