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
相关产品推荐
相关产品推荐

