rauth: объект JSON должен быть str, а не 'bytes'

Пытаясь реализовать аутентификацию OAuth2 на Django 1.10 + Python 3, я получаю эту ошибку:

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 ответ

Решение

Я все еще думаю, что должно быть что-то более прямое или исправление ошибки, но вот мой собственный обходной путь:

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

Другие вопросы по тегам