Created
November 8, 2017 12:13
-
-
Save josefmonje/e5085d07686209e4674aa36cb5f97a7f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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