跳转至

安全

处理安全、认证和授权的方式有很多种。

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

在许多框架和系统中,仅处理安全和认证就需要大量的工作和代码(在许多情况下,可能占所有编写代码的50%或更多)。

FastAPI 提供了多种工具,帮助你以标准方式轻松、快速地处理安全问题,而无需学习和研究所有的安全规范。

但首先,让我们了解一些基本概念。

急着用?

如果你不关心这些术语,现在只需要基于用户名和密码添加安全认证,请直接跳到下一章节。

OAuth2

OAuth2 是一个规范,定义了多种处理认证和授权的方式。

这是一个相当广泛的规范,涵盖了几个复杂的用例。

它包括使用“第三方”进行认证的方法。

这就是所有“使用 Facebook、Google、X(Twitter)、GitHub 登录”系统底层所使用的技术。

OAuth 1

曾经有一个 OAuth 1,它与 OAuth2 非常不同,并且更复杂,因为它包含了关于如何加密通信的直接规范。

如今它已不太流行或被使用。

OAuth2 没有指定如何加密通信,它期望你的应用程序通过 HTTPS 提供服务。

Tip

在关于部署的部分,你将看到如何使用 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:一个应用程序特定的密钥,可以来自:
    • 查询参数。
    • 请求头。
    • Cookie。
  • http:标准的 HTTP 认证系统,包括:
    • bearer:一个值为 Bearer 加令牌的 Authorization 头。这是从 OAuth2 继承而来的。
    • HTTP 基本认证。
    • HTTP 摘要认证等。
  • oauth2:所有处理安全的 OAuth2 方式(称为“流程”)。
    • 其中一些流程适用于构建 OAuth 2.0 认证提供者(如 Google、Facebook、X(Twitter)、GitHub 等):
      • implicit
      • clientCredentials
      • authorizationCode
    • 但有一个特定的“流程”可以完美地用于在同一应用程序中直接处理认证:
      • password:接下来的几章将涵盖这方面的示例。
  • openIdConnect:有一种定义如何自动发现 OAuth2 认证数据的方法。
    • 这种自动发现是在 OpenID Connect 规范中定义的。

Tip

集成其他认证/授权提供者,如 Google、Facebook、X(Twitter)、GitHub 等,也是可能的,并且相对容易。

最复杂的问题是构建像那样的认证/授权提供者,但 FastAPI 为你提供了轻松完成此任务的工具,同时为你承担繁重的工作。

FastAPI 工具

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

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

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