2014-02-18 4 views
1

Я использую сессию Flask, которая устанавливает ответный заголовок cookie в ответе.Кол-во сеансов не JSON serialize cookie

from flask import session 

Это устанавливает cookie с именем session с a = 1.

a = session.get('a', None) 
session['a'] = 1 
return jsonify(a = a) 

jsonify в коде, чтобы показать, что куки считываются при следующем запросе, и это. Это ответ на второй запрос

{ 
    "a": 1 
} 

Мне нужно прочитать файл cookie у клиента. Поэтому я хочу, чтобы он был закодирован JSON. Это заголовок Set-Cookie в ответе

Set-Cookie: session=eyJhIjoxfQ.BeUPPQ.Al5bwLzcAsN2f15mdREzhGWP1uc; HttpOnly; Path=/ 

Это не сериализованный JSON.

Кол-во версий 0.10.1. Начиная с версии 0.10, он использует сеанс от itsdangerous, основным преимуществом которого является JSON для сериализации файлов cookie вместо используемой ранее сериализации Pickle.

Что мне не хватает? Версия фляжки 0.10.1

ответ

4

Вы неправильно поняли формат реализации сеанса по умолчанию для фляшек. Объект session создает криптографически подписанный JSON, который затем (необязательно) сжимается и затем кодируется base64 для хранения значений сеанса, чтобы клиент не мог вмешиваться в значения, хранящиеся в нем. В вашем случае не было применено сжатие (сжатие применяется только в том случае, если это уменьшает конечный размер вывода).

Это изменение по сравнению с предыдущим форматом, используя pickle, чтобы ограничить ущерб злоумышленник может сделать, если на стороне сервера секрет был скомпрометирован (увидеть blog post of mine почему pickle может быть опасно).

Другими словами, все Flask сделали замену сериализатора, от pickle до расширенного помеченного формата JSON, но уже существовавшая криптографическая подпись и сжатие остались на месте.

Таким образом, формат на самом деле не подходит для декодирования на стороне клиента (вам придется декодировать base64, возможно, распаковать данные, разделить сигнатуру, и вам, возможно, придется интерпретировать дополнительную тиковую маркировку) , Вы можете переключить для него реализацию сеанса, но это очень не рекомендуется.

Если вы хотите обмениваться данными с клиентской стороны, вы можете просто вставлять данные на страницу в блок <script> с помощью var session_data = {{data|tojson|safe}}; или установить отдельный файл cookie с данными.

+0

Жаль, что я не был чист. Пожалуйста, прочитайте переписанный вопрос. –

+0

@ClodoaldoNeto: тогда была удалена часть о 'jsonify'; остальное все еще стоит. –

+0

@MartijnPieters Почему флакс [docs] (http://flask.pocoo.org/docs/0.11/quickstart/#sessions) предполагает, что секретный ключ используется только для подписи данных, а не для шифрования: _ Что это значит заключается в том, что пользователь может просматривать содержимое вашего файла cookie, но не изменять его, если они не знают секретный ключ, используемый для подписания_? Это ошибка в документации, недавнее изменение или что-то, что я неправильно понимаю? – max

Смежные вопросы