1

Тема: FastAPI - логування за допомогою cookie

Борюся з функціоналом розлогування з системи

@app.get('/logout')
def logout(response: Response):
    logging.basicConfig(level = logging.INFO)
    logging.info('debug logout - before deleting cookie')
    response.delete_cookie("token")
    logging.info('debug logout - after deleting cookie')

    set_cookie_header = response.headers.get('set-cookie')
    if set_cookie_header and 'token=;' in set_cookie_header:
        logging.info('debug logout - cookie deletion confirmed')
    else:
        logging.info('debug logout - cookie deletion not confirmed')
    
    return RedirectResponse(url="/home", status_code=303)

Поки що не працює:

INFO:root:debug logout - before deleting cookie
INFO:root:debug logout - after deleting cookie
INFO:root:debug logout - cookie deletion not confirmed

2

Re: FastAPI - логування за допомогою cookie

Ось так спрацювало:

@app.get('/logout')
def logout(response: Response,):
    logging.basicConfig(level = logging.INFO)
    logging.info('debug logout - before deleting cookie')
    response.delete_cookie("token")
    logging.info('debug logout - after deleting cookie')

    set_cookie_header = response.headers.get('set-cookie')
    if set_cookie_header and 'token=;' in set_cookie_header:
        logging.info('debug logout - cookie deletion confirmed')
    else:
        logging.info('debug logout - cookie deletion not confirmed')
        response.set_cookie(key="token", value="", expires=0)
        #response.set_cookie("token", None)
        logging.info('debug logout - setting token cookie as empty')
        set_cookie_header = response.headers.get('set-cookie')
        if set_cookie_header and 'token=;' in set_cookie_header:
            logging.info('debug logout - cookie deletion confirmed')
        else:
            logging.info('debug logout - cookie deletion not confirmed')
            response.delete_cookie(key="token")
            logging.info('debug logout - after deleting cookie (2)')

    set_cookie_header = response.headers.get('set-cookie')
    logging.info(f'debug logout - Set-Cookie header: {set_cookie_header}')

    #return RedirectResponse(url="/logged_out", status_code=303)
    return {"status":"logged out"}

Наскільки я бачу, цимес був у

return {"status":"logged out"}

бо якщо одразу ж перенаправляти на "home", то кукіс перезаписується, а не видаляється.

3

Re: FastAPI - логування за допомогою cookie

Все ж сподіваюся знайти спосіб, як при лоґ-ауті рендерити HTML, при цьому щоб кукіс видалявся.

Поки що чомусь виходить лише з

return {"status":"logged out"}

Хоч воно працює, однак це не дуже юзер-френдлі.

4

Re: FastAPI - логування за допомогою cookie

Ось так працює і юзер-френдлі

@app.get("/logout", response_class=HTMLResponse)
def logout(request: Request, response: Response):
    data = {"login_url": app.url_path_for('login'),}
    response = templates.TemplateResponse("logout.html", {"request": request, "data": data})
    response.delete_cookie("token")
    return response
<!DOCTYPE html>
<html>
<head>
    <title>Logout</title>
</head>
<body>
    <a href="{{ data.login_url }}">Login again</a>
</body>
</html>

5 Востаннє редагувалося frz (03.01.2024 20:29:54)

Re: FastAPI - логування за допомогою cookie

Це рішення несекурне. Натомість треба генерувати окремий токен для входу і записувати в дб модель з прапорцем IsValid==1. Коли юзер вилогінюється, то позначати цей токен IsValid==0 (чи видаляти). Тепер, навіть якщо зловмисник заволодіє кукісом і розшифрує його, токен для входу вже не буде валідним. Ну й відповідно процедура входу має перевіряти токен входу в дб моделі на валідність.