2016-06-08 30 views
1

我试图在Django应用程序中集成G​​oogle登录和访问Google日历。我已经成功地使用python-social-auth来处理前者。在Django应用程序中集成G​​oogle登录和日历访问

我也设法使用基于代码heregoogle-api-python-client获得日历访问的简单django应用程序。

但我很困惑,我应该如何将它们集成到单一工作流程中,以便在用户登录期间获得日历访问权限。如果你能为我提供一些示例代码,我将不胜感激。

回答

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

我甚至无法运行它。当我尝试'manage.py migrate'时,我得到'ImportError:No module named django_orm' – 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 
相关问题