from django.http import HttpResponse from django.shortcuts import redirect from django.urls import reverse import google_auth_oauthlib.flow from django.contrib.auth.decorators import login_required from .utils import get_access_token, has_expired from .models import UserModel @login_required def index(request): uid = request.user.id user = UserModel.objects.filter(pk=uid).first() if not user: return redirect(reverse('authorize')) if 'credentials' not in request.session or has_expired(request.session['credentials']): get_access_token(request) cred = request.session['credentials'] return HttpResponse(cred['access_token']) CLIENT_SECRETS_FILE = "client_secrets.json" SCOPES = ['https://www.googleapis.com/auth/business.manage'] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES, redirect_uri="http://127.0.0.1:8000/oauth2callback") def authorize(request): authorization_url, state = flow.authorization_url(access_type='offline') # Store the state so the callback can verify the auth server response. request.session['state'] = state return redirect(authorization_url) def oauth2callback(request): state = request.session['state'] flow.state = state code = request.GET.get('code', False) flow.fetch_token(code=code) credentials = flow.credentials request.session['credentials'] = credentials_to_dict(credentials) refresh_token = credentials.refresh_token user_model = UserModel.objects.create(user=request.user, refresh_token=refresh_token) user_model.save() return redirect(reverse('home')) def credentials_to_dict(credentials): expiry = str(credentials.expiry.utcnow()) return { 'access_token': credentials.token, 'expiry': expiry }