gpt4 book ai didi

python - 使用 Python 3.4 和 Django 1.7 的 Oauth2

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:35 25 4
gpt4 key购买 nike

我正在尝试使用 oauth2 授权我的 django 应用程序,以便与购物 API 的 google 内容进行交互。但是,我在使用 oauth2 的过程中遇到了问题。

我安装了 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 View 中收到错误,request.GET['state'] 返回的字符串没有编码,因此我更改了此内容:

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'

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

http = credential.authorize(http)

这似乎是由我之前所做的更改引起的。我是使用 oauth2 的新手,并且已经花了很多时间尝试调试。谁能指出我正确的方向吗?

提前谢谢您。

最佳答案

我终于找到答案了。

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 的 Credentials 对象。

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

关于python - 使用 Python 3.4 和 Django 1.7 的 Oauth2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30776447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com