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

FastAPI LoginManager忽略expires参数,Cookie仅会话结束时过期

问题:FastAPI LoginManager设置Cookie过期时间不生效

我正在实现用户登录功能,但FastAPI的LoginManager设置的Cookie仅在会话结束时过期,完全忽略了expires参数。以下是我的实现代码,请问哪里操作有误?

from fastapi_login import LoginManager

manager = LoginManager(Config.SECRET_KEY, "/user/login", use_cookie=True, default_expiry=timedelta(days=365))
manager.cookie_name = Config.COOKIE_NAME

@router.post("/user/login", name="user_login", response_model=None)
async def user_login(request: Request, email: str = Form(None),
    password: str = Form(None),
    remember_mark: bool = Form(False)) -> [ViewsMain, RedirectResponse]:
    '''
    Recieving user login form.
    '''
    form = FormUserLogin(email=email, password=password,
        remember_mark= True)
    view_data, alert_msg = general_ctl.user_login(form)
    if alert_msg:
        alert_data = alert.danger(alert_msg)
        return views.login(request, view_data=view_data, alert=alert_data)
        
    response = RedirectResponse(url="/customer/dashboard",
            status_code=status.HTTP_302_FOUND)
    expires = timedelta(days=365)
    access_token = manager.create_access_token(
        data={"sub": email}, expires=expires)
    manager.set_cookie(response, access_token)
      
    return response

Cookie的过期时间显示为“会话结束时”(对应截图内容)


问题原因及修复方案

  • 核心问题:fastapi-login的LoginManager.set_cookie方法不会自动从生成的Token中提取过期时间,你需要手动在调用该方法时传入Cookie的过期参数,否则Cookie会默认使用会话级过期(即浏览器关闭时失效)。

  • 修复步骤:

    1. 基于你定义的expires时间,计算出对应的max_age(秒数),或者生成一个UTC时间格式的expires值
    2. 在调用manager.set_cookie时,添加max_age或expires参数

修改后的关键代码片段:

response = RedirectResponse(url="/customer/dashboard", status_code=status.HTTP_302_FOUND)
expires = timedelta(days=365)
access_token = manager.create_access_token(
    data={"sub": email}, expires=expires)

# 计算max_age的秒数
max_age = int(expires.total_seconds())
# 调用set_cookie时传入max_age参数
manager.set_cookie(response, access_token, max_age=max_age)

# 也可以直接传入datetime格式的expires值(需导入datetime模块)
# from datetime import datetime
# expires_datetime = datetime.utcnow() + expires
# manager.set_cookie(response, access_token, expires=expires_datetime)

return response

补充说明:你初始化LoginManager时设置的default_expiry是Token本身的默认过期时间,但Cookie的过期规则是独立的,必须单独在set_cookie时指定,两者不会自动关联。


内容的提问来源于stack exchange,提问作者Oleg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:41:00