Skip to content

Commit

Permalink
Implementing the login and logout views needed by persona
Browse files Browse the repository at this point in the history
  • Loading branch information
gnrfan committed Feb 9, 2013
1 parent acf90c6 commit 457d44a
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 8 deletions.
8 changes: 5 additions & 3 deletions sample_app/apps/browserid/urls.py
@@ -1,7 +1,9 @@
from django.conf.urls import patterns, url
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.csrf import csrf_exempt
from browserid import views

urlpatterns = patterns('',
url(r'^status/?$', csrf_exempt(views.StatusView.as_view()))
)
url(r'^status/?$', csrf_exempt(views.StatusView.as_view()), name='status'),
url(r'^login/?$', csrf_exempt(views.LoginView.as_view()), name='login'),
url(r'^logout/?$', 'django.contrib.auth.views.logout', name='logout')
)
39 changes: 37 additions & 2 deletions sample_app/apps/browserid/views.py
Expand Up @@ -4,18 +4,22 @@
from urllib.error import URLError

from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.http import HttpResponseBadRequest
from django.core.urlresolvers import reverse
from django.views.generic import View
from django.contrib.sites.models import Site
from django.contrib.auth.models import User
from django.contrib.auth import login

from browserid import settings as browserid_settings
from browserid.models import Nonce

class HttpResponseConflict(HttpResponse):
status = 409


class StatusView(View):
class CommonView(View):

ASSERTION_KEY = 'assertion'

Expand All @@ -26,6 +30,9 @@ def has_assertion(self):
def get_assertion(self):
return self.request.POST[self.ASSERTION_KEY]


class StatusView(CommonView):

def format_audience(self):
site = Site.objects.get_current()
protocol = 'https' if request.is_secure() else 'http'
Expand Down Expand Up @@ -125,4 +132,32 @@ def post(self, request):
except User.DoesNotExist:
return self.nonce_error(data)
else:
return self.error_response(data)
return self.error_response(data)


class LoginView(CommonView):

def redirect_home(self):
homepage = resolve('homepage')
return HttpResponseRedirect(homepage)

def get_nonce(self, assertion):
return Nonce.objects.get(assertion=assertion)

def start_session_from_nonce(self, nonce):
login(self.request, nonce.user)

# HTTP Verb handlers

def post(self, request):

if self.has_assertion():
assertion = self.get_assertion()

try:
nonce = self.get_nonce(assertion)
self.start_session_from_nonce()
except Nonce.DoesNotExist:
pass

return self.redirect_home()
2 changes: 1 addition & 1 deletion sample_app/apps/myapp/urls.py
Expand Up @@ -3,5 +3,5 @@
from myapp import views

urlpatterns = patterns('',
url(r'^$', views.IndexView.as_view())
url(r'^$', views.IndexView.as_view(), name="homepage")
)
11 changes: 9 additions & 2 deletions sample_app/apps/myapp/views.py
@@ -1,5 +1,12 @@
from django.views.generic.base import TemplateView

from django.core.urlresolvers import reverse

class IndexView(TemplateView):
template_name = 'index.html'
template_name = 'index.html'

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['login_url'] = reverse('login')
context['logout_url'] = reverse('logout')
context['status_url'] = reverse('status')
return context

0 comments on commit 457d44a

Please sign in to comment.