【问题标题】:How to translate json data to python object - Flask如何将 json 数据转换为 python 对象 - Flask
【发布时间】:2016-09-23 18:05:51
【问题描述】:

我正在尝试使用 OAuthlib 做一个 Web 应用程序以使用 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 而是其他类型的编码字符串,请告知。非常感谢您。

【问题讨论】:

    标签: python json oauth flask google-oauth


    【解决方案1】:

    正如@this-vidor 所说,我的 id_token 是 JWT 而不是 JSON,我终于能够使用名为 jwt 的库对其进行解码,我使用了 jwt.decode(resp['id_token'], verify=False) 和它工作!只是发布这个以防万一有人遇到同样的问题并想要一个解决方案。非常感谢。

    有关JWT的更多信息

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 如果我使用 json.loads 我得到 ValueError: No JSON object could be decoded,也许我没有很好地解释谷歌返回的内容,我会在这里发布,但它是一个非常非常长字符串,
      • @JenaroCalviño 如果令牌看起来像base64 编码,请按照我的回答先尝试解码。
      • @JenaroCalviño 您能否提供您的研究表明 id_token 是 JSON 字符串?
      • 这是link taht 表明它是 json,我打印了 resp['id_token'] 的类型,它说它是 unicode,显然 decode('unicode') 是不允许的
      • @JenaroCalviño 请查看我修改后的答案。 “JSON Web Tokens”不是简单的 JSON,而是三个 base64 编码的 JSON 字符串。请参阅我在https://jwt.io/ 的答案中链接的文档。
      猜你喜欢
      • 2011-09-28
      • 2019-02-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2011-03-17
      • 2011-05-20
      • 1970-01-01
      相关资源
      最近更新 更多