Ошибка сохранения учетных данных oauth в сеансе при аутентификации с помощью Google+

Я следую учебнику для проверки подлинности с помощью G +. У меня есть следующий маршрут для обработки аутентификации и поместить учетные данные в сеанс Flask. (Фактический код намного длиннее, с проверкой ошибок на этом пути. Его можно найти в моем проекте GitHub .)

Доступ к маршруту дает сообщение о сериализации. Я понимаю, что он пытается сериализовать то, что не может. Как это найти и исправить?

@app.route('/gconnect', methods=['POST']) def gconnect(): oauth_flow = flow_from_clientsecrets('client_secrets.json', scope='') oauth_flow.redirect_uri = 'postmessage' credentials = oauth_flow.step2_exchange(request.data) login_session['credentials'] = credentials login_session['gplus_id'] = credentials.id_token['sub'] answer = requests.get('https://www.googleapis.com/oauth2/v1/userinfo', params={'access_token': credentials.access_token, 'alt': 'json'}) data = answer.json() login_session['username'] = data['name'] login_session['picture'] = data['picture'] login_session['email'] = data['email'] return make_response(json.dumps('Successfully connected user.', 200)) 
 10.0.2.2 - - [12/Apr/2015 14:48:18] "POST /gconnect?state=Y8LV4CFTO00K16G09SLIZZ2CSGR3ZH32 HTTP/1.1" 500 - Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__ return self.wsgi_app(environ, start_response) File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1820, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1403, in handle_exception reraise(exc_type, exc_value, tb) File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1817, in wsgi_app response = self.full_dispatch_request() File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1479, in full_dispatch_request response = self.process_response(response) File "/usr/lib/python2.7/dist-packages/flask/app.py", line 1693, in process_response self.save_session(ctx.session, response) File "/usr/lib/python2.7/dist-packages/flask/app.py", line 837, in save_session return self.session_interface.save_session(self, session, response) File "/usr/lib/python2.7/dist-packages/flask/sessions.py", line 326, in save_session val = self.get_signing_serializer(app).dumps(dict(session)) File "/usr/lib/python2.7/dist-packages/itsdangerous.py", line 537, in dumps payload = want_bytes(self.dump_payload(obj)) File "/usr/lib/python2.7/dist-packages/itsdangerous.py", line 809, in dump_payload json = super(URLSafeSerializerMixin, self).dump_payload(obj) File "/usr/lib/python2.7/dist-packages/itsdangerous.py", line 522, in dump_payload return want_bytes(self.serializer.dumps(obj)) File "/usr/lib/python2.7/dist-packages/flask/sessions.py", line 85, in dumps return json.dumps(_tag(value), separators=(',', ':')) File "/usr/lib/python2.7/dist-packages/flask/json.py", line 126, in dumps rv = _json.dumps(obj, **kwargs) File "/usr/lib/python2.7/dist-packages/simplejson/__init__.py", line 369, in dumps **kw).encode(obj) File "/usr/lib/python2.7/dist-packages/simplejson/encoder.py", line 262, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/dist-packages/simplejson/encoder.py", line 340, in iterencode return _iterencode(o, 0) File "/usr/lib/python2.7/dist-packages/flask/json.py", line 83, in default return _json.JSONEncoder.default(self, o) File "/usr/lib/python2.7/dist-packages/simplejson/encoder.py", line 239, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <oauth2client.client.OAuth2Credentials object at 0xb57e388c> is not JSON serializable 

В сеансе вы пытаетесь сохранить объект учетных данных, а не фактические данные учетных данных . Данные сеанса сериализуются с помощью JSON, поэтому все данные в нем должны быть сериализованы JSON.

Чтобы понять, что вам действительно нужно сохранить в сеансе, чтобы использовать только что выполненную проверку подлинности, вы можете посмотреть свой запрос на /userinfo , где вы отправляете credentials.access_token .

Маркер доступа обычно используется для запоминания после любого цикла oauth. Не храните объект учетных данных, просто сохраните токен доступа.

 # remove the session['credentials'] line login_session['access_token'] = credentials.access_token 

Теперь вы можете использовать этот токен из сеанса в других маршрутах, чтобы сделать другие вызовы api.

У меня была аналогичная проблема, и я смог преобразовать объект credentials в json через

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