今天讲一下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的验证如何处理