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

FastAPI_Login授权后RedirectResponse跳转,用户未获授权问题排查

问题原因与解决方案

问题根源

你的代码核心错误在于:创建RedirectResponse实例resp后,把认证Cookie设置到了函数参数传入的response对象上,而非实际要返回的resp对象。浏览器最终接收的是resp,但这个响应里没有携带认证Cookie,所以重定向到主页后,服务器无法识别用户身份,导致未授权状态。

当你返回字符串'ok'时,FastAPI会自动用传入的response对象生成最终响应,之前设置的Cookie会被包含进去,浏览器能正常接收,所以认证有效。但返回RedirectResponse或TemplateResponse这类自定义响应对象时,它们和函数参数里的response完全独立,必须手动把Cookie绑定到要返回的响应对象上。

修复方案

针对RedirectResponse的修改

直接将manager.set_cookie的参数替换为你创建的resp对象:

@router.post('/login')
def login(data: OAuth2PasswordRequestForm = Depends(), 
          db: Session = Depends(get_db)):
    email = data.username
    password = data.password

    user = db.query(DbUser).filter(DbUser.email == email).first()

    if not user:
        raise InvalidCredentialsException

    if not Hash.verify(user.password, password):
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
            detail='Incorrect password')

    token = manager.create_access_token(
        data={'sub': email}
    )
    resp = RedirectResponse(url='/post/stat/all',status_code=status.HTTP_302_FOUND)
    # 将Cookie设置到要返回的resp对象上
    manager.set_cookie(resp, token)
    return resp

针对TemplateResponse的修改

创建TemplateResponse实例后,将Cookie设置到该实例上再返回:

@router.post('/login')
def login(request: Request,
          data: OAuth2PasswordRequestForm = Depends(), 
          db: Session = Depends(get_db)):
    # 省略用户验证、token生成逻辑...
    
    resp = templates.TemplateResponse("/login/success.html",{"request": request})
    manager.set_cookie(resp, token)
    return resp

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:53:38