2016-06-08 1 views
1

Я пытаюсь интегрировать вход в Google и получать доступ к Календарю Google в приложении Django. Я успешно справился с первым, используя python-social-auth.Интеграция входа в Google и доступа к календарю в приложении Django

Мне также удалось получить простое приложение django с доступом к календарю, используя google-api-python-client на основе кода here.

Но я смущен тем, как я должен интегрировать их в один рабочий процесс, где я могу получить разрешение на доступ к календарю во время входа в систему. Я был бы признателен, если бы вы могли предоставить мне примерный код.

ответ

0

Вот как мне удалось заставить его работать:

models.py

from django.db import models 
from oauth2client.contrib.django_orm import CredentialsField 

class Credentials(models.Model): 
    id = models.OneToOneField(User, primary_key=True) 
    credential = CredentialsField() 

    class Meta: 
     db_table = 'credentials' 

settings.py

. 
. 
. 
GOOGLE_CLIENT_ID = '' 
GOOGLE_CLIENT_SECRET = '' 
GOOGLE_SCOPE = 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/calendar' 
OAUTH_REDIRECT_URI = 'http://<domain>/oauth2/redirect/' 
. 
. 
. 

просмотров. py

import httplib2 
from django.conf import settings 
from django.contrib.auth import login as auth_login 
from django.contrib.auth import logout as auth_logout 
from django.contrib.auth.decorators import login_required 
from django.core.urlresolvers import reverse_lazy 
from django.http import (HttpResponse, HttpResponseBadRequest, 
         HttpResponseRedirect) 
from django.shortcuts import redirect 
from oauth2client.contrib import xsrfutil 
from oauth2client.contrib.django_orm import Storage 

from .models import Credentials 


def get_flow(request):  
    flow = OAuth2WebServerFlow(
     client_id=settings.GOOGLE_CLIENT_ID, 
     client_secret=settings.GOOGLE_CLIENT_SECRET, 
     scope=settings.GOOGLE_SCOPE, 
     redirect_uri=settings.OAUTH_REDIRECT_URI, 
     access_type='offline', 
     state='' 
    ) 
    return flow 


def login(request): 
    next = request.GET.get('next', 'home') 
    request.session['next'] = next 

    if not request.user.is_authenticated(): 
     flow = get_flow(request) 
     flow.params['state'] = xsrfutil.generate_token(settings.SECRET_KEY, 
                 request.user) 
     request.session['flow'] = pickle.dumps(flow).decode('iso-8859-1') 
     redirect_uri = flow.step1_get_authorize_url() 
     return redirect(redirect_uri) 
    else: 
     return redirect(reverse_lazy(next)) 


def oauth2redirect(request): 
    # Make sure that the request is from who we think it is 
    if not xsrfutil.validate_token(settings.SECRET_KEY, 
            request.GET.get('state').encode('utf8'), 
            request.user): 
     return HttpResponseBadRequest() 

    code = request.GET.get('code') 
    error = request.GET.get('error') 

    if code: 
     flow = get_flow(request) 
     credentials = flow.step2_exchange(code) 

     request.session['creds'] = credentials.to_json() 
     email = credentials.id_token.get("email") 
     user_exists = False 
     try: 
      user = User.objects.get(email=email) 
      user_exists = True 
     except User.DoesNotExist: 
      user = create_user(credentials) 

     # Since we've oauth2'd the user, we should set the backend appropriately 
     # This is usually done by the authenticate() method. 
     user.backend = 'django.contrib.auth.backends.ModelBackend' 
     # Refresh token is needed for renewing google api access token 
     if credentials.refresh_token: 
      user.refresh_token = credentials.refresh_token 
     user.save() 

     storage = Storage(Credentials, 'id', user, 'credential') 
     storage.put(credentials) 

     # Register that the user has successfully logged in 
     auth_login(request, user) 

     next = request.session.get('next', reverse_lazy('/')) 
     return HttpResponseRedirect(next) 
    elif code is None and error: 
     return HttpResponse(str(error)) 
    else: 
     return HttpResponseBadRequest() 


@login_required 
def logout(request): 
    user = request.user 
    credentials = Credentials.objects.get(id=user.id) 
    credentials.revoke(httplib2.Http()) 
    credentials.delete() 
    storage = Storage(Credentials, 'id', user, 'credential') 
    storage.delete() 

    auth_logout(request) 
    return HttpResponseRedirect('/') 
+0

Вы сменили python-social-auth на свой код или воспользуетесь обоими вместе? – HenryM

+0

Я не использовал python-social-auth. – Kiran

+0

Я даже не могу запустить его. Я получаю 'ImportError: нет модуля с именем django_orm', когда я пытаюсь' manage.py migrate' – HenryM

0

Попробуйте Calendar Quickstart for Python. Он включает в себя вход и использование этой аутентификации для генерации токенов. Эти токены будут использоваться для выполнения вызовов API календаря. Играйте с ним и добавьте свой собственный код.

Вот отрывок:

def get_credentials(): 
"""Gets valid user credentials from storage. 

If nothing has been stored, or if the stored credentials are invalid, 
the OAuth2 flow is completed to obtain the new credentials. 

Returns: 
Credentials, the obtained credential. 
""" 
home_dir = os.path.expanduser('~') 
credential_dir = os.path.join(home_dir, '.credentials') 
if not os.path.exists(credential_dir): 
os.makedirs(credential_dir) 
credential_path = os.path.join(credential_dir, 
'calendar-python-quickstart.json') 

store = oauth2client.file.Storage(credential_path) 
credentials = store.get() 
if not credentials or credentials.invalid: 
flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES) 
flow.user_agent = APPLICATION_NAME 
if flags: 
credentials = tools.run_flow(flow, store, flags) 
else: # Needed only for compatibility with Python 2.6 
credentials = tools.run(flow, store) 
print('Storing credentials to ' + credential_path) 
return credentials 

 Смежные вопросы

  • Нет связанных вопросов^_^