views.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from django.http import HttpResponse
  2. from django.shortcuts import redirect
  3. from django.urls import reverse
  4. import google_auth_oauthlib.flow
  5. from django.contrib.auth.decorators import login_required
  6. from .utils import get_access_token, has_expired
  7. from .models import UserModel
  8. @login_required
  9. def index(request):
  10. uid = request.user.id
  11. user = UserModel.objects.filter(pk=uid).first()
  12. if not user:
  13. return redirect(reverse('authorize'))
  14. if 'credentials' not in request.session or has_expired(request.session['credentials']):
  15. get_access_token(request)
  16. cred = request.session['credentials']
  17. return HttpResponse(cred['access_token'])
  18. CLIENT_SECRETS_FILE = "client_secrets.json"
  19. SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
  20. flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file(
  21. CLIENT_SECRETS_FILE,
  22. scopes=SCOPES,
  23. redirect_uri="http://127.0.0.1:8000/oauth2callback")
  24. def authorize(request):
  25. authorization_url, state = flow.authorization_url(access_type='offline')
  26. # Store the state so the callback can verify the auth server response.
  27. request.session['state'] = state
  28. return redirect(authorization_url)
  29. def oauth2callback(request):
  30. state = request.session['state']
  31. flow.state = state
  32. code = request.GET.get('code', False)
  33. flow.fetch_token(code=code)
  34. credentials = flow.credentials
  35. request.session['credentials'] = credentials_to_dict(credentials)
  36. refresh_token = credentials.refresh_token
  37. user_model = UserModel.objects.create(user=request.user, refresh_token=refresh_token)
  38. user_model.save()
  39. return redirect(reverse('home'))
  40. def credentials_to_dict(credentials):
  41. expiry = str(credentials.expiry.utcnow())
  42. return {
  43. 'access_token': credentials.token,
  44. 'expiry': expiry
  45. }