FastAPI中配置JWT刷新令牌存至Cookie时解决Pydantic验证错误的方法
我之前在做类似的FastAPI JWT认证功能时,也遇到过一模一样的Pydantic验证坑,咱们一步步来拆解问题、解决它。
问题拆解
你遇到了两个关联的验证错误:
- 一开始用
set({'cookies'})作为authjwt_token_location的值,Pydantic直接报错说“Input should be an instance of Sequence”——因为set不属于Sequence类型(Sequence的子类是list、tuple这类有序集合)。 - 换成Sequence/List/StrictStr这类类型后,又触发了“Value error, The 'authjwt_token_location' must be between 'headers' or 'cookies'”,这其实是类型注解和实际值的兼容问题,尤其是Pydantic 2对类型的校验更严格,加上StrictStr的额外限制,导致fastapi-jwt-auth的内部验证逻辑不通过。
解决方案:修正Settings类的类型注解与赋值
直接把authjwt_token_location的类型注解改成list[str](或tuple[str]),并赋值为包含"cookies"的列表/元组,去掉不必要的StrictStr类型,就能完美解决问题。
正确的Settings类写法
from pydantic import BaseSettings import os from typing import Optional from fastapi_jwt_auth import AuthJWT class Settings(BaseSettings): authjwt_secret_key: str = os.environ.get('JWT_SECRET_KEY','YOUR_SECRET_KEY') # 用list[str]作为类型,直接赋值为包含"cookies"的列表 # 如果你需要同时支持headers和cookies,就写成 ["headers", "cookies"] authjwt_token_location: list[str] = ["cookies"] # 如果需要保留可选性(允许字段为None),可以改成: # authjwt_token_location: Optional[list[str]] = ["cookies"] @AuthJWT.load_config def get_config(): return Settings()
验证登录接口逻辑
修改完配置后,你的登录接口的Cookie设置逻辑就能正常工作了:
from fastapi import HTTPException, status, Depends, APIRouter from sqlalchemy.orm import Session from your_models import UserRequest, UserModel from your_utils import verify_pwd router = APIRouter() @router.post('/login') def login_user(user: UserRequest, db: Session = Depends(get_db), Authorize: AuthJWT = Depends()): db_user = db.query(UserModel).filter(UserModel.email == user.email).first() if not db_user or not verify_pwd(user.pwd, db_user.hashed_pwd): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid Credentials') access_token = Authorize.create_access_token(subject=db_user.email) refresh_token = Authorize.create_refresh_token(subject=db_user.email) # 现在配置正确,这个方法会自动把refresh token写入HTTP响应的Cookie中 Authorize.set_refresh_cookies(refresh_token) return { 'access_token': access_token, }
为什么之前的写法会报错?
- Set类型不兼容:Pydantic中Sequence的定义是“有序、可索引的集合”,set是无序的,所以不被认可为Sequence的实例,直接触发类型校验错误。
- StrictStr的额外限制:
StrictStr是Pydantic的严格字符串类型,会对输入做额外校验,但fastapi-jwt-auth的内部逻辑期望的是普通的str类型,两者搭配就会触发不必要的验证错误,换成str就解决了这个问题。 - Optional与Sequence的组合问题:Pydantic 2对可选序列类型的校验逻辑更严谨,直接用具体的
list[str]代替Optional[Sequence[StrictStr]],写法更清晰,也能避开类型兼容问题。
额外注意事项
- 生产环境一定要替换掉默认的
YOUR_SECRET_KEY,用环境变量设置一个安全、随机的JWT密钥。 - 如果还是遇到问题,可以尝试把fastapi-jwt-auth升级到最新版本,确保和Pydantic 2的适配没有问题。
内容来源于stack exchange
相关产品推荐
相关产品推荐

