今天我们来讲一下再fastapi中如何进行token的验证,在fastapi中,我们可以通过依赖注入的方式,来对一个接口进行token的验证,来判断在数据库中是否有这个用户,我们需要先申明一个函数用来做token的验证操作:
import jwt
import os
from fastapi import Header
from typing import Optional
from .APIResponse import APIResponse
from fastapi.responses import JSONResponse
from fastapi import status
from jwt.exceptions import InvalidSignatureError, ExpiredSignatureError, DecodeError
key = os.urandom(32)
async def verify_jwt(token: Optional[str] = Header(None)):
if token is None:
return JSONResponse(status_code=status.HTTP_405_METHOD_NOT_ALLOWED,
content=APIResponse(405, None, "用户未登录").set_api_dict())
else:
try:
res = jwt.decode(token, key, "HS256")
return res['userID']
except InvalidSignatureError as e:
# 无效签名验证
return JSONResponse(status_code=status.HTTP_403_FORBIDDEN,
content=APIResponse(403, None, "无效的用户签名").set_api_dict())
except ExpiredSignatureError as e:
# 签名过期验证
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED,
content=APIResponse(401, None, "用户签名已过期").set_api_dict())
except DecodeError as e:
return JSONResponse(status_code=status.HTTP_401_UNAUTHORIZED,
content=APIResponse(401, None, "错误的签名").set_api_dict())
在这里我们将错误类型进行了导入,其实应该还有一部分其他类型的错误,我这里只是简单使用了一下,然后指定token类型为str,并且导入Header,将从这里获取我们的token,然后并对token解码进行验证,这样,就完成了我们的token验证函数
这里我也将我申明的APIResponse为返回给前端的数据:
import json
class APIResponse:
def __init__(self, code, data=None, message=None):
self.code = code
self.data = data
self.message = message
def set_api_dict(self):
api_dict = {
"code": self.code,
"data": self.data,
"message": self.message
}
return api_dict
然后在接口中使用:
from fastapi import status, Depends
from models.user import User
from fastapi.responses import JSONResponse
from utils.APIResponse import APIResponse
from utils.JWT import jwt_token, verify_jwt
@api.get("/logout", summary="用户注销")
async def user_logout(token: str = Depends(verify_jwt)):
if type(token) is int:
res = await User.get(id=token)
await res.delete()
return JSONResponse(status_code=status.HTTP_200_OK, content=APIResponse(200, None, "用户注销成功").set_api_dict())
else:
return token
在这里我们需要导入Depends,将我们的验证函数进行注入至接口,这样fastapi在前端进行请求的时候会自动运行这个函数verify_jwt,这样就是一个简单的token验证了。