如何将json数据转换为python对象 - Flask

时间:2016-05-25 22:53:40

标签: python json oauth flask google-oauth2

我正在尝试使用OAuthlib使用google登录网页应用程序,这就是google对象的样子:

google = oauth.remote_app('google',
    request_token_url=None,
    access_token_method='POST',
    request_token_params={'scope': 'email'},
    access_token_url='https://accounts.google.com/o/oauth2/token',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    consumer_key="my consumer",
    consumer_secret="my secret",
    base_url='https://www.googleapis.com/oauth2/v1/'
)

我遇到的问题是当我从谷歌获取用户信息时,他是我的授权视图:

@app.route('/login/authorized/<provider>')
def authorized():
    resp = google.authorized_response()
    auth_error(resp)
    id_token = json.load(resp['id_token'])
    login_user(me, True)
    return redirect(url_for('index'))

所以,我尝试用json.load来解码google给我的信息,在这种特殊情况下,响应有一个id_token,这是一个长字符串,根据我的研究,是一个json编码字符串,当它被解码,提供所有用户信息,无论我尝试多少我似乎找不到正确的解码方式,我得到的错误是:

AttributeError: 'unicode' object has no attribute 'read'

在json.load行上。

编辑:在解码id_token之后,我会用它在我自己的数据库中获取或创建用户。

我正在使用Flask,而库是json。

如果有人能解释将字符串解码为python对象的正确方法,我会非常感激,或者如果这不是json但是其他类型的编码字符串请告诉我。非常感谢你提前。

2 个答案:

答案 0 :(得分:3)

json.load reads from a file。要解码JSON 字符串,请使用json.loads

但是,根据these docsid_token不是JSON,而是"JSON Web Token"

如果您正在寻找“有效载荷”,您可以尝试:

payload = json.loads( resp['id_token'].split('.')[1].decode('base64') )

答案 1 :(得分:0)

as @this-vidor说我的id_token是一个JWT而不是JSON,我终于能够使用一个名为jwt的库解码它,我使用了jwt.decode(resp ['id_token'],verify = False)它成功了!只是发布这个以防任何人有同样的问题,并想要一个解决方案。非常感谢你。

有关JWT

的更多信息