xenon
@xenon
Too drunk to fsck

Почему Flask игнорирует SESSION_COOKIE_SAMESITE?

Почему-то Flask игнорирует опцию конфига SESSION_COOKIE_SAMESITE хотя вроде как должен ее обрабатывать (ссылка)

$ curl -I http://localhost:5000/
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 5
Set-Cookie: foo=bar; Secure; HttpOnly; Path=/; SameSite=Strict
Set-Cookie: session=1e70123c-2726-44f7-9e6e-b9e5a083699d; Expires=Wed, 10-Feb-2021 20:04:03 GMT; HttpOnly; Path=/
Server: Werkzeug/1.0.1 Python/3.7.3
Date: Tue, 09 Feb 2021 20:04:03 GMT


Видно, что устанавливаются две куки, одну (foo) я ставлю вручную и любые ее параметры отрабатываются - с ней все OK. Другая (session), ставится Flask'ом игнорируя опцию SESSION_COOKIE_SAMESITE почему-то.

Код упростил до минимума:
#!/usr/bin/env python3
from flask import Flask, Response
from flask_session import Session

app = Flask(__name__)
app.config.update(
    FLASK_ENV = 'development',
    SESSION_TYPE = 'redis',
    SESSION_COOKIE_SAMESITE = "Strict",
    PERMANENT_SESSION_LIFETIME = 86400,
)

sess = Session()
sess.init_app(app)

@app.route('/')
def index():
    response = Response('hello')
    response.set_cookie('foo', 'bar', secure=True, httponly=True, samesite='Strict')
    return response


Если играть с другими параметрами (установить SESSION_COOKIE_SECURE или увеличить PERMANENT_SESSION_LIFETIME) - то их изменения отражаются на куке, а SESSION_COOKIE_SAMESITE просто игнорируется почему-то. В redis куки создаются. Даже если изменить SESSION_TYPE = 'filesystem' - куки отправляются, но по прежнему без samesite.

Что я делаю не так? Как можно обойти это и выставить атрибут samesite для куки session?

Модули (virtualenv):
cachelib==0.1.1
click==7.1.2
Flask==1.1.2
Flask-Session==0.3.2
itsdangerous==1.1.0
Jinja2==2.11.3
MarkupSafe==1.1.1
pkg-resources==0.0.0
redis==3.5.3
Werkzeug==1.0.1
  • Вопрос задан
  • 508 просмотров
Решения вопроса 1
xenon
@xenon Автор вопроса
Too drunk to fsck
Разобрался сам. Текущая версия Flask-Session (0.3.2) в принципе "не знает" про samesite, и использует такой код для установки куки:

response.set_cookie(app.session_cookie_name, session_id,
                            expires=expires, httponly=httponly,
                            domain=domain, path=path, secure=secure)


Требуются очень простые изменения в код, Pull request'ы уже есть, но маинтайнер их так и не принял пока что. Сделал свой форк, ставится:
pip install git+https://github.com/yaroslaff/flask-session.git@samesite


На время - сойдет. Когда маинтайнер примет пулл-риквесты, можно будет вернуться на оригинал проекта.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы