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