当前位置:   article > 正文

开源模型应用落地-FastAPI-助力模型交互-进阶篇-身份认证(二)_fastapi高级应用

fastapi高级应用

一、前言

   FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。

    在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。

    此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。

    本篇学习FastAPI的身份验证机制,通过接收包含用户名和密码信息,以验证用户的身份。


二、术语

2.1. HTTP Basic Authentication

   是一种简单有效的身份验证机制,允许服务器验证客户端的身份,并在HTTPS加密通道下提供基本的传输安全性,实现了跨平台的统一认证方式,尽管它存在一定的安全隐患,但依然是Web应用程序常用的认证方式之一。

    使用HTTP Basic Authentication的作用包括:

  1. 进行简单的身份验证:应用期望接收包含用户名和密码的头信息,以验证用户的身份。
  2. 控制访问权限:如果用户未提供正确的用户名和密码,应用会返回HTTP 401“未授权”错误,从而限制对某些资源或操作的访问。
  3. 与浏览器集成:当应用返回特定的头信息时,浏览器会显示集成的用户名和密码提示,方便用户输入凭据。

2.2. Timing Attacks

    是一种利用目标系统或算法在处理不同输入时所需的时间差异来获取敏感信息的攻击方式。其主要原理如下:

  1. 时序差异:某些系统或算法在处理不同输入时可能需要的时间不同,这可能会泄露一些敏感信息。例如,验证密码时对比正确密码和错误密码的耗时差异。

  2. 信息泄露:这种时间差异可能泄露出一些有价值的信息,如部分正确的密码字符、加密密钥的位数等。攻击者可以利用这些信息逐步推断出完整的敏感信息。

  3. 攻击过程:攻击者会反复尝试不同的输入,并精确测量处理每个输入所需的时间,从中寻找有价值的时间差异模式。通过统计分析和机器学习等技术,攻击者可以从这些微小的时间差异中提取有用的信息。


 三、前置条件

3.1. 创建虚拟环境&安装依赖

  1. conda create -n fastapi_test python=3.10
  2. conda activate fastapi_test
  3. pip install fastapi uvicorn

四、技术实现

4.1. Basic Authentication

  1. # -*- coding: utf-8 -*-
  2. from typing import Annotated
  3. import secrets
  4. import uvicorn
  5. from fastapi import FastAPI, Depends, HTTPException,status
  6. from fastapi.security import HTTPBasic, HTTPBasicCredentials
  7. app = FastAPI()
  8. security = HTTPBasic()
  9. DEFAULT_USERNAME = b"zhangsan"
  10. DEFAULT_PASSWORD = b"123456"
  11. def check(
  12. credentials: Annotated[HTTPBasicCredentials, Depends(security)],
  13. ):
  14. if not (credentials.username.encode("utf8") == DEFAULT_USERNAME) or not (credentials.password.encode("utf8") == DEFAULT_PASSWORD):
  15. raise HTTPException(
  16. status_code=status.HTTP_401_UNAUTHORIZED,
  17. detail="用户名或密码错误",
  18. headers={"WWW-Authenticate": "Basic"},
  19. )
  20. return credentials
  21. @app.get("/login")
  22. def login(credentials: Annotated[HTTPBasicCredentials, Depends(check)]):
  23. print(f'username: {credentials.username}, password: {credentials.password}')
  24. return '登录成功'
  25. if __name__ == '__main__':
  26. uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

输入正确账号:

输入错误账号:

4.2. 防范Timing Attacks

使用secrets.compare_digest防范Timing Attacks,secrets.compare_digest()在比较不同字符串时花费的时间相同,从而使应用程序免受定时攻击的影响。

  1. # -*- coding: utf-8 -*-
  2. from typing import Annotated
  3. import secrets
  4. import uvicorn
  5. from fastapi import FastAPI, Depends, HTTPException,status
  6. from fastapi.security import HTTPBasic, HTTPBasicCredentials
  7. app = FastAPI()
  8. security = HTTPBasic()
  9. DEFAULT_USERNAME = b"zhangsan"
  10. DEFAULT_PASSWORD = b"123456"
  11. def check(
  12. credentials: Annotated[HTTPBasicCredentials, Depends(security)],
  13. ):
  14. current_username_bytes = credentials.username.encode("utf8")
  15. is_correct_username = secrets.compare_digest(
  16. current_username_bytes, DEFAULT_USERNAME
  17. )
  18. current_password_bytes = credentials.password.encode("utf8")
  19. is_correct_password = secrets.compare_digest(
  20. current_password_bytes, DEFAULT_PASSWORD
  21. )
  22. if not (is_correct_username and is_correct_password):
  23. raise HTTPException(
  24. status_code=status.HTTP_401_UNAUTHORIZED,
  25. detail="用户名或密码错误",
  26. headers={"WWW-Authenticate": "Basic"},
  27. )
  28. return credentials
  29. @app.get("/login")
  30. def login(credentials: Annotated[HTTPBasicCredentials, Depends(check)]):
  31. print(f'username: {credentials.username}, password: {credentials.password}')
  32. return '登录成功'
  33. if __name__ == '__main__':
  34. uvicorn.run(app, host='0.0.0.0', port=7777)

调用结果:

输入正确账号:

输入错误账号:


五、附带说明

5.1. headers={"WWW-Authenticate": "Basic"}的作用

当检测到用户输入的凭据不正确时,返回HTTPException并设置状态码为401,同时添加WWW-Authenticate头以使浏览器再次显示登录提示。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/908671
推荐阅读
相关标签
  

闽ICP备14008679号