0

Я работаю над приложением 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.

Как я могу справиться с этой проблемой?

Большое спасибо!

ответ

0

Вы защитили свой индексный указатель login_required, поэтому он перенаправит вас на страницу входа. Если вы этого не хотите, не используйте этот декоратор.