From e0ef46ca913324cec25e235cdc24d1163d57a241 Mon Sep 17 00:00:00 2001 From: Taizo 'Tsa6' Simpson Date: Fri, 22 Sep 2017 16:00:24 -0400 Subject: [PATCH] Added login enpoints /login and /login/redirect --- EpisodesCommunity/urls.py | 3 ++- LandingPage/urls.py | 9 +++++++ LandingPage/views.py | 52 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 LandingPage/urls.py diff --git a/EpisodesCommunity/urls.py b/EpisodesCommunity/urls.py index 5068add..b24ce88 100644 --- a/EpisodesCommunity/urls.py +++ b/EpisodesCommunity/urls.py @@ -13,9 +13,10 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url +from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), + url(r'^', include('LandingPage.urls')) ] diff --git a/LandingPage/urls.py b/LandingPage/urls.py new file mode 100644 index 0000000..ae09a29 --- /dev/null +++ b/LandingPage/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls import url + +from . import views + +urlpatterns = [ + url(r'^login/redirect$', views.LoginRedirect.as_view()), + url(r'^login$', views.Login.as_view()), +] + diff --git a/LandingPage/views.py b/LandingPage/views.py index 91ea44a..e1f5ed1 100644 --- a/LandingPage/views.py +++ b/LandingPage/views.py @@ -1,3 +1,55 @@ from django.shortcuts import render +from django.views import View +from django.conf import settings +from django.http import HttpResponse +from django.http import HttpResponseRedirect +import requests +import hashlib +import json # Create your views here. +# Redirect url should point to this view +class LoginRedirect(View): + def get(self, req): + + # Check state + userstate = generateState(req) + if userstate == req.GET['state']: + code = req.GET['code'] + resp = requests.post( + settings.AUTH_TOKEN_ENDPOINT+"token", + data={ + 'grant_type':'authorization_code', + 'code':code, + 'redirect_uri':settings.AUTH_REDIRECT_URL, + 'client_id':settings.AUTH_CLIENT_ID + }, + headers = { + 'Authorization':'Basic %s'%settings.AUTH_B64 + } + ) + print((settings.AUTH_B64)) + resp_json = resp.json() + if 'error' in resp_json: + return HttpResponse('

OAuth Error

%s
'%json.dumps(resp_json)) + else: + req.session['token'] = resp_json['access_token'] + return HttpResponseRedirect('/') + else: + return HttpResponse('

Unmatching state tokens


It looks like the request to login wasn\'t started by you. Try going back to the home page and logging in again.

', status=400) + +class Login(View): + def get(self, req): + url = '%sauthorize?response_type=code&client_id=%s&redirect_uri=%s&scope=email&state=%s'%(settings.AUTH_TOKEN_ENDPOINT,settings.AUTH_CLIENT_ID,settings.AUTH_REDIRECT_URL, generateState(req)) + response = HttpResponse("Redirecting you to the IcyNet auth page...") + response.status_code = 302 + response['Location'] = url + return response + +def generateState(request): + request.session.save() + + m = hashlib.sha256() + m.update(bytearray(request.session.session_key, 'utf-8')) + m.update(bytearray(settings.SECRET_KEY, 'utf-8')) + return m.hexdigest()