Я работаю над приложением Django, которое предоставит пользователям информацию об их учетных записях Google Analytics (идентификатор учетной записи, свойство, идентификатор вида).Access GA API с Django:/accounts/login/redirect issue
Но я с самого начала пытаюсь решить проблему с авторизацией пользователя (обработка ответа сервера oAuth 2).
Я следил за документацией Google на нем.
MODELS.PY
from django.db import models
from django.contrib.auth.models import User
from oauth2client.django_orm import FlowField, CredentialsField
class FlowModel(models.Model):
id = models.ForeignKey(User, primary_key=True)
flow = FlowField()
class CredentialsModel(models.Model):
id = models.ForeignKey(User, primary_key=True)
credential = CredentialsField()
VIEWS.PY
import os
import httplib2
from oauth2client import xsrfutil
from oauth2client.client import flow_from_clientsecrets
from oauth2client.django_orm import Storage
from apiclient.discovery import build
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseBadRequest
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from django.contrib.sites.models import get_current_site
from .models import CredentialsModel, FlowModel
CLIENT_SECRETS = os.path.join(
os.path.dirname(__file__), 'client_secrets.json')
def get_accounts_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):
# use the first REDIRECT_URI if you are developing your app
# locally, and the second in production
REDIRECT_URI = 'http://localhost:8080/oauth2/oauth2callback'
#REDIRECT_URI = "https://%s%s" % (
# get_current_site(request).domain, reverse("oauth2:return"))
FLOW = flow_from_clientsecrets(
CLIENT_SECRETS,
scope='https://www.googleapis.com/auth/analytics.readonly',
redirect_uri=REDIRECT_URI
)
user = request.user
storage = Storage(CredentialsModel, 'id', user, 'credential')
credential = storage.get()
if credential is None or credential.invalid is True:
FLOW.params['state'] = xsrfutil.generate_token(
settings.SECRET_KEY, user)
authorize_url = FLOW.step1_get_authorize_url()
webbrowser.open_new(authorize_url)
f = FlowModel(id=user, flow=FLOW)
f.save()
return HttpResponseRedirect(authorize_url)
else:
http = httplib2.Http()
http = credential.authorize(http)
service = build('analytics', 'v3', http=http)
ids = get_account_ids(service)
return render(
request, 'ga_auth2/main.html', {'ids':ids})
@login_required
def auth_return(request):
user = request.user
if not xsrfutil.validate_token(
settings.SECRET_KEY, request.REQUEST['state'], user):
return HttpResponseBadRequest()
FLOW = FlowModel.objects.get(id=user).flow
credential = FLOW.step2_exchange(request.REQUEST)
storage = Storage(CredentialsModel, 'id', user, 'credential')
storage.put(credential)
return HttpResponseRedirect("/oauth2")
URLS.PY
from django.conf.urls import include, url
from django.contrib import admin
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'oauth2callback', views.auth_return, name='return'),
]
Проблема в том, что, когда я иду в http://localhost:8080/oauth2 это перенаправлены на http://localhost:8080/accounts/login/?next=/oauth2/ и я вижу страницу ошибки 404, а не fou без обозначения даты
Я определил проект API в Google Developpers консоли: Javascript Происхождение: LOCALHOST: 8080
Redirect URI: локальный: 8080/oauth2/oauth2callback
я себе с этим перенаправлением я толкнул войдите в мою учетную запись Google. Но когда я запускаю свой код Python из приглашения, браузер автоматически открывается, запрашивая логин и/или авторизуя доступ к API.
Как я могу справиться с этой проблемой?
Большое спасибо!