首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python3.4和Django 1.7的Oauth2

使用Python3.4和Django 1.7的Oauth2
EN

Stack Overflow用户
提问于 2015-06-11 09:13:16
回答 1查看 206关注 0票数 1

我正在尝试使用oauth2授权我的django应用程序,以便与google进行交互。然而,我正在经历与oauth2有关的问题。

我安装了oauth2client和。我的意见如下:

代码语言:javascript
运行
复制
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视图中得到一个错误,请求重新处理的字符串没有编码,因此我更改了以下内容:

代码语言:javascript
运行
复制
if not xsrfutil.validate_token(settings.SECRET_KEY, request.GET['state'], user):

对此:

代码语言:javascript
运行
复制
if not xsrfutil.validate_token(settings.SECRET_KEY, bytes(request.GET['state'], 'utf-8'), user):
        return HttpResponseBadRequest()

错误就消失了。但是,我现在得到了一个错误:

代码语言:javascript
运行
复制
'bytes' object has no attribute 'authorize'

从索引视图。导致异常的确切行是:

代码语言:javascript
运行
复制
http = credential.authorize(http)

这似乎是我早些时候所做的改变造成的。我刚开始使用oauth2,我已经花了很多时间尝试调试。谁能给我指出正确的方向吗?

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-12 05:49:00

我终于找到了答案。

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

要解决这个问题,您必须从以下位置编辑oauth2client/django_orm源定义:

代码语言:javascript
运行
复制
class CredentialsField(models.Field):

至:

代码语言:javascript
运行
复制
from django.utils.six import with_metaclass
class CredentialsField(with_metaclass(models.SubfieldBase, models.Field)):

这将允许它返回Python2和Python3的凭据对象。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30776447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档