Skip to content

Instantly share code, notes, and snippets.

@maryokhin
Created June 24, 2014 17:06
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maryokhin/4aed548e606f11971f5a to your computer and use it in GitHub Desktop.
Save maryokhin/4aed548e606f11971f5a to your computer and use it in GitHub Desktop.
DRF + python-social-auth
from rest_framework import status
from rest_framework.authtoken.models import Token
from rest_framework.authtoken.views import ObtainAuthToken
from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.settings import api_settings
from social.apps.django_app.utils import strategy
from social.backends.oauth import BaseOAuth1, BaseOAuth2
from api.serializers.social_login import ObtainSocialAuthTokenSerializer
@strategy()
def _register_by_access_token(request, backend):
"""
Checks what OAuth protocol is being used for social authentication, backend corresponds to the allowed backend types
and authenticates the user using the access token from the request.
"""
backend = request.strategy.backend
if isinstance(backend, BaseOAuth1):
token = {
'oauth_token': request.POST.get('access_token'),
'oauth_token_secret': '<secret>' # required by python-social-auth, but is not used
}
elif isinstance(backend, BaseOAuth2):
token = request.POST.get('access_token')
else:
raise Response("Wrong backend type", status=status.HTTP_400_BAD_REQUEST)
return backend.do_auth(token)
class ObtainSocialAuthTokenView(ObtainAuthToken):
serializer_class = ObtainSocialAuthTokenSerializer
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
parser_classes = api_settings.DEFAULT_PARSER_CLASSES
class Meta():
list_wrapper = "tokens"
instance_wrapper = "token"
def post(self, request, backend):
serializer = self.serializer_class(data=request.DATA)
if serializer.is_valid():
user = _register_by_access_token(request, backend)
if user:
user_url = reverse('user-instance', args=[user.pk], request=request)
token, created = Token.objects.get_or_create(user=user)
return Response({'token': token.key, 'user_id': user.id, 'user_url': user_url})
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment