FastAPI——token验证

本文介绍了如何在FastAPI中使用JWT进行token验证,包括密钥生成、加密数据结构和登录接口示例,重点讲解了加密算法HS256和过期时间设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天讲一下fastapi中的token验证,其实fastapi自身对于token就有验证的,不过这里需要对用户输入的用户名和密码的参数限制为username,password,这对于我们来说有些限制了,比如我们在写微信小程序,或者APP登录时,我们一般不会去使用这种格式,并且在数据库中存入的参数形式也不一致,这样子对于我们来说就不是很有友好了,所以我们这里选择使用token,在使用的时候,我们需要先导入jwt,使用jwt来进行加密以及验证:

pip install jwt

然后需要使用加密字符,这里我没有使用他们的标准生成密钥方式,这里可以使用:

import os
key = os.urandom(32)

这种方式来进行密钥的生成,规范的生成模式还是以官网的那种方式去生成

def jwt_token(data: dict, expires_delta: timedelta):
    jwt_dict = data.copy()
    expired = datetime.utcnow() + expires_delta
    jwt_dict.update({'exp': expired})
    token = jwt.encode(jwt_dict, key, algorithm="HS256")
    return token

这里我们先不说这个函数的,我们先来说

jwt.encode(jwt_dict, key, algorithm="HS256")
# 这里的jwt_dict 是我们的加密数据以及过期时间等数据组成的字典,这里的key,是我们的加密密钥,然后
# algorithm是加密方式
datetime.utcnow() + expires_delta 
# 这一步是格式化时间 在此之前,我们需要导入 
from datetime import datetime, timedelta

然后我们再回到函数中,data为加密数据,是我们需要再登录时去处理的用户数据,然后expires_delta为过期时间,然后我们再回到我们的接口中去

@api.post("/login", summary='用户登录')
async def user_login(body: Register):
    res = await User.filter(userName=body.userName)
    if len(res) == 0:
        return JSONResponse(status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
                            content=APIResponse(405, None, "用户不存在").set_api_dict())
    else:
        md5password = password_md5(body.passWord)
        password = await User.get(userName=body.userName)
        if md5password == password.passWord:
            token = jwt_token({"userID": password.id}, timedelta(days=3))
            return JSONResponse(status_code=status.HTTP_200_OK, content=APIResponse(200, {"token": token}, "登录成功")
                                .set_api_dict(), headers={"Set-Cookie": "X-token=Bearer "+token})
        else:
            return JSONResponse(status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
                                content=APIResponse(405, None, "用户名或密码有误").set_api_dict())

这里的APIResponse是我自己定义的一个函数,用来处理返回数据的,大家这里可以自行忽略,同时我这里也使用了md5加密的一个形式,在前后端交互中,前端也可以处理加密,后端也可以,这个可以大家自行沟通,并且我这里也只是提供一个逻辑而已 ,后续我们再讲一下token的验证如何处理

### FastAPI 和 Dify 的特性差异及其在网络开发中的应用场景 #### 特性对比 FastAPI 是一种现代、快速(高性能)的Web框架,用于构建API,基于Python类型提示。它提供了自动交互文档的功能,并支持异步编程模式。 Dify 主要是一个专注于自然语言处理(NLP)和机器学习模型部署的服务平台[^1]。虽然也涉及到API接口的设计与实现,但是其核心功能在于简化NLP应用和服务的创建过程,比如通过Bearer Token 或者 API-Key 进行鉴权访问特定资源或服务[^2]。 #### 功能区别 - **性能优化** - FastAPI 利用了 Python 3.6+ 的新特性来提高效率并减少错误率,例如依赖注入系统以及内置的数据验证机制。 - 对于 Dify 而言,重点不在于提供高效的HTTP请求响应时间上,而是在如何更好地集成预训练的语言模型和其他AI工具到用户的业务逻辑当中去[^3]。 - **安全性措施** - 在 FastAPI 中可以灵活配置多种认证授权方案,如OAuth2, JWT等。 - Dify 提供了两种不同的身份验证方法:对于某些特殊场景下的API调用采用 API-Key 方式;而在其他情况下则推荐使用更安全可靠的 Bearer Token 来保护敏感数据传输。 - **易用性和扩展性** - FastAPI 设计之初就考虑到了开发者体验,拥有简洁直观的语法结构,易于理解和维护代码。 - 尽管 Dify 同样具备良好的用户体验设计,但它更加侧重于解决具体领域内的问题——即帮助工程师们迅速搭建起具有高级智能化特性的应用程序原型或是生产环境版本。 #### 应用案例分析 当涉及到网络开发项目时: - 如果目标是建立一个通用型RESTful Web Service,则可以选择 FastAPI 。该框架能够很好地满足大多数互联网产品的后端需求,包括但不限于社交平台、电子商务网站等等。 - 若项目的重心放在利用先进的 AI 技术改善产品功能方面,那么像 Dify这样的专用解决方案可能会更适合一些。它可以加速从概念验证阶段过渡至实际部署的过程,在此期间无需过多关注底层架构细节就可以享受到高质量的人工智能能力加持。 ```python from fastapi import FastAPI, Depends, HTTPException from pydantic import BaseModel import uvicorn app = FastAPI() class Item(BaseModel): name: str description: str | None = None price: float tax: float | None = None @app.post("/items/") async def create_item(item: Item): return {"item": item} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值