FastAPI中的token验证

今天我们来讲一下再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验证了。

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用FastAPIToken进行身份验证的示例代码: ```python from fastapi import FastAPI, Depends, HTTPException from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm app = FastAPI() oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") # 模拟用户 fake_users_db = { "johndoe": { "username": "johndoe", "full_name": "John Doe", "email": "[email protected]", "hashed_password": "fakehashedsecret", "disabled": False, }, "alice": { "username": "alice", "full_name": "Alice Wonderson", "email": "[email protected]", "hashed_password": "fakehashedsecret2", "disabled": True, }, } # 获取用户信息 def fake_decode_token(token): user = None if token == "johndoe": user = fake_users_db["johndoe"] return user # 验证token async def get_current_user(token: str = Depends(oauth2_scheme)): user = fake_decode_token(token) if not user: raise HTTPException( status_code=401, detail="Invalid authentication credentials", headers={"WWW-Authenticate": "Bearer"}, ) return user # 验证用户是否被禁用 async def get_current_active_user(current_user: dict = Depends(get_current_user)): if current_user["disabled"]: raise HTTPException(status_code=400, detail="Inactive user") return current_user # 登录获取token @app.post("/token") async def login(form_data: OAuth2PasswordRequestForm = Depends()): user_dict = fake_users_db.get(form_data.username) if not user_dict: raise HTTPException(status_code=400, detail="Incorrect username or password") user = UserInDB(**user_dict) hashed_password = fake_hash_password(form_data.password) if not hashed_password == user.hashed_password: raise HTTPException(status_code=400, detail="Incorrect username or password") return {"access_token": user.username, "token_type": "bearer"} # 需要验证的路由 @app.get("/users/me") async def read_users_me(current_user: dict = Depends(get_current_active_user)): return current_user ``` 在上面的代码,我们使用OAuth2PasswordBearer和OAuth2PasswordRequestForm来实现身份验证。我们还定义了一个模拟用户数据库fake_users_db,以及一些用于验证和获取当前用户的函数。最后,我们定义了一个需要验证的路由,即/users/me,它需要一个有效的token才能访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值