Skip to content

Instantly share code, notes, and snippets.

@josefmonje
Created November 8, 2017 12:13
Show Gist options
  • Save josefmonje/e5085d07686209e4674aa36cb5f97a7f to your computer and use it in GitHub Desktop.
Save josefmonje/e5085d07686209e4674aa36cb5f97a7f to your computer and use it in GitHub Desktop.
import os
import urllib
from django.contrib.auth import user_logged_in
from django.contrib.auth.models import User
from django.http import Http404
from django.shortcuts import redirect
from django.urls import reverse
from django.views import generic
from httplib2 import Http
from apiclient.discovery import build
from djoser import serializers
from oauth2client.client import flow_from_clientsecrets
from rest_framework.authtoken.models import Token
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
class Oauth2View(generic.View):
flow = flow_from_clientsecrets(
os.path.join(BASE_DIR, 'google_oauth.json'),
scope='https://www.googleapis.com/auth/userinfo.email',
redirect_uri='http://driver.bbwb.cyscorpions.com/oauth/',
)
def get(self, request, *args, **kwargs):
code = request.GET.get('code', None)
if code:
credentials = self.flow.step2_exchange(code)
http = credentials.authorize(Http())
service = build('oauth2', 'v2', http=http)
user_info = service.userinfo().get().execute()
user = self.get_user(user_info)
token = self.get_token(user)
driver_url = reverse('driver:login')
return redirect('{0}?{1}'.format(driver_url, urllib.parse.urlencode(token)))
else:
auth_uri = self.flow.step1_get_authorize_url()
return redirect(auth_uri)
def get_user(self, user_info):
try:
return User.objects.get(email=user_info['email'])
except Exception:
raise Http404("No registered user.")
def get_token(self, user):
token, _ = Token.objects.get_or_create(user=user)
user_logged_in.send(sender=user.__class__, request=self.request, user=user)
token_serializer_class = serializers.serializers_manager.get('token')
return token_serializer_class(token).data
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment