How to authenticate by Access Token in code using python-social-auth
Question: I have a REST API and I need to authenticate users via Facebook Login API.
Access Token should be obtained in mobile app (I guess) and then sent to the
server. So I have found some code in old tutorial and I can't make it work.
Here's the code:

    
    
    from social.apps.django_app.utils import strategy
    from django.contrib.auth import login
    from django.views.decorators.csrf import csrf_exempt
    from rest_framework.decorators import api_view, permission_classes
    from rest_framework import permissions, status
    from django.http import HttpResponse as Response
    
    
    @strategy()
    def auth_by_token(request, backend):
        user=request.user
        user = backend.do_auth(
            access_token=request.DATA.get('access_token'),
            user=user.is_authenticated() and user or None
            )
        if user and user.is_active:
            return user
        else:
            return None
    
    
    
    @csrf_exempt
    @api_view(['POST'])
    @permission_classes((permissions.AllowAny,))
    def social_register(request):
        auth_token = request.DATA.get('access_token', None)
        backend = request.DATA.get('backend', None)
        if auth_token and backend:
            try:
                user = auth_by_token(request, backend)
            except Exception, err:
                return Response(str(err), status=400)
            if user:
                login(request, user)
                return Response("User logged in", status=status.HTTP_200_OK)
            else:
                return Response("Bad Credentials", status=403)
        else:
            return Response("Bad request", status=400)
    

When I try to send POST request with parameters, I get this error:

    
    
    'unicode' object has no attribute 'do_auth'
    

I found an example in [official documentation](http://python-social-
auth.readthedocs.org/en/latest/use_cases.html#signup-by-oauth-access-token),
it uses `@psa('social:complete')` decorator:

    
    
    from django.contrib.auth import login
    
    from social.apps.django_app.utils import psa
    
    # Define an URL entry to point to this view, call it passing the
    # access_token parameter like ?access_token=<token>. The URL entry must
    # contain the backend, like this:
    #
    #   url(r'^register-by-token/(?P<backend>[^/]+)/$',
    #       'register_by_access_token')
    
    @psa('social:complete')
    def register_by_access_token(request, backend):
        # This view expects an access_token GET parameter, if it's needed,
        # request.backend and request.strategy will be loaded with the current
        # backend and strategy.
        token = request.GET.get('access_token')
        user = backend.do_auth(request.GET.get('access_token'))
        if user:
            login(request, user)
            return 'OK'
        else:
            return 'ERROR'
    

But what if I need to pass backend name in request body?


Answer: It should be `request.backend.do_auth(request.GET.get('access_token'))`.

I've updated the docs with the right snippet
<http://psa.matiasaguirre.net/docs/use_cases.html#signup-by-oauth-access-
token>.

