FastAPI LoginManager忽略expires参数,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会默认使用会话级过期(即浏览器关闭时失效)。修复步骤:
- 基于你定义的
expires时间,计算出对应的max_age(秒数),或者生成一个UTC时间格式的expires值 - 在调用
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
相关产品推荐
相关产品推荐

