You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI中配置JWT刷新令牌存至Cookie时解决Pydantic验证错误的方法

FastAPI中配置JWT刷新令牌存至Cookie时解决Pydantic验证错误的方法

我之前在做类似的FastAPI JWT认证功能时,也遇到过一模一样的Pydantic验证坑,咱们一步步来拆解问题、解决它。

问题拆解

你遇到了两个关联的验证错误:

  1. 一开始用set({'cookies'})作为authjwt_token_location的值,Pydantic直接报错说“Input should be an instance of Sequence”——因为set不属于Sequence类型(Sequence的子类是list、tuple这类有序集合)。
  2. 换成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,
    }

为什么之前的写法会报错?

  1. Set类型不兼容:Pydantic中Sequence的定义是“有序、可索引的集合”,set是无序的,所以不被认可为Sequence的实例,直接触发类型校验错误。
  2. StrictStr的额外限制:StrictStr是Pydantic的严格字符串类型,会对输入做额外校验,但fastapi-jwt-auth的内部逻辑期望的是普通的str类型,两者搭配就会触发不必要的验证错误,换成str就解决了这个问题。
  3. Optional与Sequence的组合问题:Pydantic 2对可选序列类型的校验逻辑更严谨,直接用具体的list[str]代替Optional[Sequence[StrictStr]],写法更清晰,也能避开类型兼容问题。

额外注意事项

  • 生产环境一定要替换掉默认的YOUR_SECRET_KEY,用环境变量设置一个安全、随机的JWT密钥。
  • 如果还是遇到问题,可以尝试把fastapi-jwt-auth升级到最新版本,确保和Pydantic 2的适配没有问题。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:44:33