我試圖在Django應用程序中集成Google登錄和訪問Google日曆。我已經成功地使用python-social-auth
來處理前者。在Django應用程序中集成Google登錄和日曆訪問
我也設法使用基於代碼here的google-api-python-client
獲得日曆訪問的簡單django應用程序。
但我很困惑,我應該如何將它們集成到單一工作流程中,以便在用戶登錄期間獲得日曆訪問權限。如果你能爲我提供一些示例代碼,我將不勝感激。
我試圖在Django應用程序中集成Google登錄和訪問Google日曆。我已經成功地使用python-social-auth
來處理前者。在Django應用程序中集成Google登錄和日曆訪問
我也設法使用基於代碼here的google-api-python-client
獲得日曆訪問的簡單django應用程序。
但我很困惑,我應該如何將它們集成到單一工作流程中,以便在用戶登錄期間獲得日曆訪問權限。如果你能爲我提供一些示例代碼,我將不勝感激。
以下是我設法得到它的工作:
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('/')
試試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
你是用你的代碼替換python-social-auth,還是一起使用它們? – HenryM
我沒有使用python-social-auth。 – Kiran
我甚至無法運行它。當我嘗試'manage.py migrate'時,我得到'ImportError:No module named django_orm' – HenryM