首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rauth: JSON对象必须是str,而不是字节

rauth: JSON对象必须是str,而不是字节
EN

Stack Overflow用户
提问于 2016-11-06 19:44:21
回答 1查看 1.1K关注 0票数 1

为了在Django 1.10 +Python3上实现OAuth2身份验证,我得到了以下错误:

rauth: JSON对象必须是str,而不是字节

它发生在调用:session = sso.get_auth_session(data=data, decoder=json.loads)的线路上。

如果删除decoder=json.loads,将得到以下错误:

解码器无法处理由提供程序返回的数据的access_token。可能需要不同的解码器。

以下是我的方法:

代码语言:javascript
复制
def login(request):
    """
    Login view
    @author: Leonardo Pessoa
    @since: 11/06/2016
    """
    from rauth import OAuth2Service
    from django.conf import settings
    import json

    # instantiating our login service with environment defined settings
    sso = OAuth2Service(
        name                = settings.LOGIN_SETTINGS['name'],
        client_id           = settings.LOGIN_SETTINGS['client_id'],
        client_secret       = settings.LOGIN_SETTINGS['client_secret'],
        access_token_url    = settings.LOGIN_SETTINGS['access_token_url'],
        authorize_url       = settings.LOGIN_SETTINGS['authorize_url'],
        base_url            = settings.LOGIN_SETTINGS['base_url'],
    )

    # check if we have a login code returned by OAuth
    get_code = request.GET.get('code', '')
    if get_code == '':
        params = {
            'redirect_uri'    : settings.LOGIN_SETTINGS['redirect'],
            'response_type'   : 'code'
        }
        url = sso.get_authorize_url(**params)

        return redirect(url)
    else:
        # we are in!
        data = {'code'          : get_code,
                'grant_type'    : 'authorization_code',
                'redirect_uri'  : settings.LOGIN_SETTINGS['redirect']
                }

        session = sso.get_auth_session(data=data, decoder=json.loads)

        return redirect('/logado/')

第一次访问视图是为了重定向到授权URL (没有GET['code'])。接下来,再次访问它(使用GET['code'])来处理授权代码并进行身份验证。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 08:51:16

我仍然认为应该有一些更直接或错误的解决办法,但我有自己的解决办法:

代码语言:javascript
复制
def oauth_decode(data):
    import json

    new_data = data.decode("utf-8", "strict")

    return json.loads(new_data)
...
session = sso.get_auth_session(data=data, decoder=oauth_decode)

问题是,默认情况下,get_auth_session从UTF-8的响应中解码字节流.如果您指定了一个新的解码器,则重写它。所以我想我们这里需要两者(UTF-8 + JSON)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40453741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档