使用Google+进行身份验证时,在会话中存储oauth凭据时出错

时间:2015-04-10 15:36:00

标签: python oauth flask google-oauth

我正在学习使用G +进行身份验证的教程。我有以下路由来处理身份验证并将凭据放入Flask会话。 (实际代码要长得多,并且在此过程中会进行错误检查。可以在my GitHub project中找到。)

访问路由会产生有关序列化的错误。我理解它正在尝试序列化它不能的东西。我如何找到并解决这个问题?

@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

2 个答案:

答案 0 :(得分:5)

您正在尝试在会话中存储凭据对象,而不是实际的凭据数据。会话数据使用JSON进行序列化,因此其中的所有数据都必须是JSON可序列化的。

如果您在会话中确实需要存储的内容使用您刚刚执行的身份验证,则可以查看/userinfo的请求,并在credentials.access_token发送{。}}。

访问令牌通常是您在任何oauth周期后需要记住的内容。不要存储凭证对象,只需存储访问令牌。

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

现在,您可以在其他路由中的会话中使用此令牌进行其他api调用。

答案 1 :(得分:2)

我有类似的问题,并且能够通过

将凭证对象转换为json
login_session['credentials'] = credentials.to_json()