2015-06-11 48 views
1

我试图授权我的django应用程序使用oauth2为了与购物API的谷歌内容进行交互。但是,我一直在遇到oauth2的问题。Oauth2使用Python 3.4和Django 1.7

我安装了oauth2client和google-api-python-client。我的观点是如下:

CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secret.json') 

FLOW = flow_from_clientsecrets(
    CLIENT_SECRETS, 
    scope='https://www.googleapis.com/auth/content', 
    redirect_uri='https://127.0.0.1:8000/oauth2/oauth2callback') 


def get_account_ids(service): 
    accounts = service.management().accounts().list().execute() 
    ids = [] 
    if accounts.get('items'): 
     for account in accounts['items']: 
      ids.append(account['id']) 
    return ids 


@login_required 
def index(request): 
    user = request.user 
    storage = Storage(CredentialsModel, 'id', user, 'credential') 
    credential = storage.get()  
    if credential is None: 
     FLOW.params['state'] = xsrfutil.generate_token(
      settings.SECRET_KEY, user) 
     authorize_url = FLOW.step1_get_authorize_url() 
     f = FlowModel(id=user, flow=FLOW) 
     f.save() 
     return HttpResponseRedirect(authorize_url) 
    else: 
     http = httplib2.Http() 
     http = credential.authorize(http) 
     service = build('content', 'v2', http=http) 
     ids = get_account_ids(service) 
     return render(
      request, 'index.html', {'ids':ids}) 


@login_required 
def auth_return(request): 
    user = request.user 
    if not xsrfutil.validate_token(settings.SECRET_KEY, bytes(request.GET['state'], 'utf-8'), user): 
     return HttpResponseBadRequest() 
    credential = FLOW.step2_exchange(request.GET, http=None) 
    storage = Storage(CredentialsModel, 'id', user, 'credential') 
    storage.put(credential) 
    return HttpResponseRedirect("/oauth2/") 

起初,我是从auth_return认为串由request.GET中[“状态”]重新调整得到一个错误没有编码,所以我改变这样的:

if not xsrfutil.validate_token(settings.SECRET_KEY, request.GET['state'], user): 

这样:

if not xsrfutil.validate_token(settings.SECRET_KEY, bytes(request.GET['state'], 'utf-8'), user): 
     return HttpResponseBadRequest() 

和错误不见了。但是,我现在得到错误:

'bytes' object has no attribute 'authorize' 

从索引视图。导致例外的确切线为:

http = credential.authorize(http) 

看起来这是由我之前做出的更改引起的。我是使用oauth2的新手,并且已经花费了很多小时来尝试调试。任何人都可以请我指出正确的方向?

预先感谢您。

回答

1

我终于找到了答案。

似乎oauth2client中的django_orm模块在CredentialsField定义中使用'to_python'函数,该函数不起作用,因此返回Base64数据。

为了解决这个问题,必须从编辑oauth2client/django_orm源定义:

class CredentialsField(models.Field): 

到:

from django.utils.six import with_metaclass 
class CredentialsField(with_metaclass(models.SubfieldBase, models.Field)): 

这将允许其返回证书对象两个Python2和Python3 。

请确保先删除当前存储的凭证对象,因为它是字符串对象而不是凭证对象。