rauth:JSON对象必须是str,而不是'bytes'

时间:2016-11-06 19:44:21

标签: django python-3.x oauth2 rauth

尝试在Django 1.10 + Python 3上实现OAuth2身份验证,我收到此错误:

  

rauth:JSON对象必须是str,而不是'bytes'

它发生在致电:session = sso.get_auth_session(data=data, decoder=json.loads)

的行上

如果删除decoder=json.loads,我会收到以下错误:

  

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

这是我的方法:

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'])来处理授权代码并进行身份验证。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我仍然认为应该有更直接的东西或错误修复,但这是我自己的解决方法:

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 )。