为了在Django 1.10 +Python3上实现OAuth2身份验证,我得到了以下错误:
rauth: JSON对象必须是str,而不是字节
它发生在调用: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'])来处理授权代码并进行身份验证。
有什么想法吗?
发布于 2016-11-07 08:51:16
我仍然认为应该有一些更直接或错误的解决办法,但我有自己的解决办法:
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)。
https://stackoverflow.com/questions/40453741
复制相似问题