认证的解读做的不是很好,由于作者是一个一个文件阅读的,这部分实际只解读了部分认证代码。因为有一部分相关代码在 middleware 里。认证过程分为2个过程:
1. 通过 AuthenticationMiddleware 在请求被 Endpoint 处理前做认证,这部分代码在 middleware/authentication.py 中,认证逻辑需要开发者自己继承 AuthenticationBackend 编写(通常是查询数据库,判断账户、密码,或者 token 是否有效等)。AuthenticationMiddleware 结束前,会把认证信息记录到 scope["auth"]: AuthCredentials, scope["user"]: BaseUser,没有认证通过也会记录未通过认证的信息。
2. 之后才是在 Endpoint 使用对应的 request handler 函数前,通过装饰器,如 @requires('authenticated'),检测 scope["auth"], scope["user"] 中的认证信息。只不过在 endpoint 中 scope 已经被封装成 Request(HTTPConnection) 实例,所以才会出现在 has_required_scope() 函数通过 HTTPConnection.auth.scopes 判断的方式。
这部分最好先去翻文档 Authentication 一节 https://www.starlette.io/authentication/ ,对整个认证过程有个了解。之后分别做 middleware/authentication.py 和 authentication.py 源码的阅读。
-----
另外,作者所说的 FastAPI 参数检测。 inspect.signature() 可以拿到函数的参数信息,对形参做一些判断。我虽然没怎么用过,不过在 Python cookbook 读过一些使用案例。参考 Python Cookbook 9.7, 9.16, 9.17
- 9.7 利用装饰器强制函数上的类型检查 https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p07_enforcing_type_check_on_function_using_decorator.html
- 9.16 *args和**kwargs的强制参数签名 https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p16_enforce_argument_signature_on_args_kwargs.html
- 9.17 在类上强制使用编程规约 https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p17_enforce_coding_conventions_in_classes.html