1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
import json
from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import logout as auth_logout, login
from social.backends.oauth import BaseOAuth1, BaseOAuth2
from social.backends.google import GooglePlusAuth
from social.backends.utils import load_backends
from social.apps.django_app.utils import psa
from example.app.decorators import render_to
def logout(request):
"""Logs out user"""
auth_logout(request)
return redirect('/')
def context(**extra):
return dict({
'plus_id': getattr(settings, 'SOCIAL_AUTH_GOOGLE_PLUS_KEY', None),
'plus_scope': ' '.join(GooglePlusAuth.DEFAULT_SCOPE),
'available_backends': load_backends(settings.AUTHENTICATION_BACKENDS)
}, **extra)
@render_to('home.html')
def home(request):
"""Home view, displays login mechanism"""
if request.user.is_authenticated():
return redirect('done')
return context()
@login_required
@render_to('home.html')
def done(request):
"""Login complete view, displays user data"""
return context()
@render_to('home.html')
def validation_sent(request):
return context(
validation_sent=True,
email=request.session.get('email_validation_address')
)
@render_to('home.html')
def require_email(request):
backend = request.session['partial_pipeline']['backend']
return context(email_required=True, backend=backend)
@psa('social:complete')
def ajax_auth(request, backend):
if isinstance(request.backend, BaseOAuth1):
token = {
'oauth_token': request.REQUEST.get('access_token'),
'oauth_token_secret': request.REQUEST.get('access_token_secret'),
}
elif isinstance(request.backend, BaseOAuth2):
token = request.REQUEST.get('access_token')
else:
raise HttpResponseBadRequest('Wrong backend type')
user = request.backend.do_auth(token, ajax=True)
login(request, user)
data = {'id': user.id, 'username': user.username}
return HttpResponse(json.dumps(data), mimetype='application/json')
|