跳到内容

安全

处理安全、身份验证和授权有多种方式。

这通常是一个复杂而“困难”的话题。

在许多框架和系统中,仅仅处理安全和身份验证就需要大量的精力与代码(在许多情况下,它可能占到所有编写代码的 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: 接下来的一些章节将涵盖此示例。
  • openIdConnect: 有一种方式定义如何自动发现 OAuth2 身份验证数据。
    • 这种自动发现正是 OpenID Connect 规范中定义的。

提示

集成其他身份验证/授权提供商,如 Google、Facebook、Twitter、GitHub 等,也是可能且相对容易的。

最复杂的问题是构建一个像那些一样的身份验证/授权提供商,但 FastAPI 为您提供了工具,让您可以轻松地做到这一点,同时为您承担了繁重的工作。

FastAPI 工具

FastAPI 在 fastapi.security 模块中为这些安全方案提供了多种工具,简化了这些安全机制的使用。

在接下来的章节中,您将看到如何使用 FastAPI 提供的这些工具为您的 API 添加安全性。

您还将看到它如何自动集成到交互式文档系统中。