Вход в Google+ – поток на стороне сервера – сохранение учетных данных – примеры Python

Я создаю приложение в Google App Engine с помощью Flask. Я использую логин Google+ из потока на стороне сервера, описанного в примерах Python: https://developers.google.com/+/web/signin/server-side-flow и https://github.com/googleplus/gplus -quickstart-python / blob / master / signin.py .

Оба примера:

credentials = oauth_flow.step2_exchange(code) 

а также

 session['credentials'] = credentials 

сохранение объекта учетных данных в сеансе фляшки. Когда я запускаю этот код в своем проекте Google App Engine, я получаю сообщение об ошибке:

 TypeError: <oauth2client.client.OAuth2Credentials object at 0x7f6c3c953610> is not JSON serializable 

Как обсуждалось в этом выпуске (отмеченном WontFix), OAuth2Credentials не предназначен для сериализации JSON. Он имеет методы to_json и from_json , которые могут быть использованы для его хранения, например:

 session['credentials'] = credentials.to_json() 

Однако в том же номере :

Никогда не храните объект Credentials в файле cookie, он содержит приложения
идентификатор клиента и секрет клиента.

Возможно, я неправильно понимаю, как работает объект сессии Flask, но из документа :

… Сессия в основном позволяет запоминать информацию с одного запроса другому. Способ Flask делает это с помощью подписанного файла cookie. Таким образом, пользователь может просматривать содержимое сеанса, но не изменять его, если они не знают секретный ключ …

И поэтому мы не должны хранить объект учетных данных в сеансе, даже если это подписанный файл cookie.

В моем случае в настоящее время мне нужно только повторно использовать токен доступа для целей разъединения, поэтому я могу просто сохранить это.

Каков правильный способ справиться с этой ситуацией? Если учетные данные не хранятся в сеансе вообще? Если в этом пункте в примерах будет комментарий «Безопасно сохранить учетные данные здесь»?

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

Храните только токен доступа в сеансе:

 session['credentials'] = credentials.access_token 

Вы можете воссоздать объект credentials с этим токеном, используя класс AccessTokenCredentials позднее, если вам понадобится его снова:

 credentials = AccessTokenCredentials(session['credentials'], 'user-agent-value') 

Объект AccessTokenCredentials хранит только учетные данные; Однако, поскольку он не имеет идентификатор клиента и секрет клиента, он не может быть использован для обновления токена.

Значение пользовательского агента – это то, что вы получаете; он может помочь диагностировать проблемы, если у вас есть доступ к журналам сервера OAuth; с Google я бы не стал рассчитывать на это, поэтому просто сделайте что-то здесь.

«Фланец по умолчанию использует Werkzeug, обеспечивающий« безопасный файл cookie »в качестве сеансовой системы. Он работает, сортируя данные сеанса, сжимая его и кодируя его base64». – http://flask.pocoo.org/snippets/51/

Другими словами, колба действительно странная. Все, что вы вкладываете в сеанс, шифруется ключом сервера, отправляется клиенту и хранится в клиенте . Затем сервер получает его на каждый последующий запрос и декодирует его одним и тем же ключом. Это также означает, что данные сеанса сохранятся при перезагрузке сервера, потому что он сидит на клиенте.

Чтобы улучшить это для моего приложения, я использовал флягу SessionInterface с Couchdb – и теперь клиент знает только идентификатор сеанса, который проверяется на мою базу данных, где хранятся фактические данные. Ура.

Проверьте это, у него есть несколько подходов к сеансам на стороне сервера, в зависимости от того, какой db вы можете использовать – http://flask.pocoo.org/snippets/category/sessions/