2023-12-14 15:44:29 版本 : 【Python开发】FastAPI 08:Security 登录认证
作者: 系统管理员1 于 2023年12月14日 发布在分类 / 技术研发 / python 下,并于 2023年12月14日 编辑
 历史版本

备注 修改日期 修改人
内容更新 2023-12-14 15:48:24[当前版本] 系统管理员1
内容更新 2023-12-14 15:48:06 系统管理员1
内容更新 2023-12-14 15:47:45 系统管理员1
内容更新 2023-12-14 15:45:12 系统管理员1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接: https://blog.csdn.net/weixin_51407397/article/details/131031170


源码地址:

https://gitee.com/yinyuu/fast-api_study_yinyu

1 介绍

FastAPI 提供了多种工具,可帮助你以标准的方式轻松、快速地处理安全性,而无需研究和学习所有的安全规范,这相比花费大量的精力和代码处理安全性和身份认证很有好了(比如 java )。

首先我们来看一些小概念,如果已了解可直接看第二种~

1.1 OAuth2

OAuth2 是一个规范,它定义了几种处理身份认证和授权的方法。 它是一个相当广泛的规范,涵盖了一些复杂的使用场景,包括使用「第三方」进行身份认证的方法。

Facebook,Google,Twitter,GitHub 登录系统均是采用该机制。

OAuth 1

OAuth 1OAuth2 完全不同,并且更为复杂,它直接包含了有关如何加密通信的规范。

如今它已经 out 了,也就没多少人用了。

OAuth2 没有指定如何加密通信,它期望使用 HTTPS 进行通信。

1.2 OpenAPI

OpenAPI(以前称为 Swagger)是用于构建 API 的开放规范。

FastAPI 基于 OpenAPI,因此自动交互式文档界面,代码生成等成为可能。

OpenAPI 有一种定义多个安全「方案」的方法,你可以利用所有这些基于标准的工具,包括这些交互式文档系统。

OpenAPI 定义了以下安全方案:

  • apiKey:一个特定于应用程序的密钥,可以来自:
    • 查询参数。
    • 请求头。
    • cookie
  • http:标准的 HTTP 身份认证系统,包括:
    • bearer: 一个值为 Bearer 加令牌字符串的 Authorization 请求头。这是从 OAuth2 继承的。
    • HTTP Basic 认证方式。
    • HTTP Digest,等等。
  • oauth2:所有的 OAuth2 处理安全性的方式(称为「流程」)。
    • 以下几种流程适合构建 OAuth 2.0 身份认证的提供者(例如 Google,Facebook,Twitter,GitHub 等): * implicit * clientCredentials * authorizationCode
    • 但是有一个特定的「流程」可以完美地用于直接在同一应用程序中处理身份认证:
    • password:接下来将介绍它的示例。
  • openIdConnect:提供了一种定义如何自动发现 OAuth2 身份认证数据的方法。
    • 此自动发现机制是 OpenID Connect 规范中定义的内容。

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

2 安全基础

假设前后端分离开发,前端要使用后端的 username password 验证用户身份。

预先安装:pip install python-multipart

因为 OAuth2 使用表单数据发送 username password

2.1 使用 Bearer

本例使用 OAuth2 Password 流以及 Bearer 令牌(Token),为此要使用 OAuth2PasswordBearer 类。

 OAuth2PasswordBearer

创建 OAuth2PasswordBearer 的类实例时,要传递 tokenUrl 参数。该参数包含客户端(用户浏览器中运行的前端) 的 URL,用于发送 username password,并获取令牌。

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

tokenUrl="token" 指向的是暂未创建的相对 URL token,这个相对 URL 相当于 ./token。比如 API 位于 https://example.com/,则指向 https://example.com/token

oauth2_scheme 变量是 OAuth2PasswordBearer 的实例,也是可调用项。

比如以下边方式调用:

oauth2_scheme(some, parameters)

因此,Depends 可以调用 oauth2_scheme 变量。

使用

接下来,使用 Depends oauth2_scheme 传入依赖项。

from fastapi import Depends, FastAPI
from fastapi.security import OAuth2PasswordBearer
 
app = FastAPI()
 
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
 
@app.get("/items/")
async def read_items(token: str = Depends(oauth2_scheme)):
    return {"token": token}

该依赖项使用字符串(str)接收路径操作函数的参数 token

运行

使用 main 函数运行:

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

文档

此时访问交互式文档 http://127.0.0.1:8000/docs#

页面右上角出现了一个「Authorize」按钮。 路径操作的右上角也出现了一个可以点击的小锁图标,代表这个接口需要登录认证。

那么点击 Authorize 按钮,弹出授权表单,输入 username password 及其它可选字段:

目前,由于是 demo,在表单中输入内容不会有任何反应,后文会逐步进行完善!

这个自动工具非常实用,可在文档中与所有 API 交互。

前端团队(可能就是开发者本人)可以使用本工具。

第三方应用与系统也可以调用本工具。 开发者也可以用它来调试、检查、测试应用。

文档中请求接口

在文档中请求该接口时,FastAPI 校验请求中的 Authorization 请求头,核对请求头的值是不是由 Bearer + 令牌组成, 并返回令牌字符串(str)。

如果没有找到 Authorization 请求头,或请求头的值不是 Bearer + 令牌。FastAPI 直接返回 401 错误状态码(UNAUTHORIZED):

 密码流

现在,再回过头来看一下。 Password 流是 OAuth2 定义的,用于处理安全与身份验证的方式(流)。 OAuth2 的设计目标是为了让后端或 API 独立于服务器验证用户身份。

但在本例中,FastAPI 应用会处理 API 与身份验证。


历史版本-目录  [回到顶端]
    wcp知识库系统-京ICP备15024440号-1 -V 5.1.9 -wcp