Facebook авторизация с AngularJS и Django REST Framework

Я разрабатываю приложение SPA сAngularJS который используетДжанго бэкэнд для сервера. Способ, которым я общаюсь с сервером из SPA, заключается вДжанго-отдых-рамка, Так что теперь я хочу сделать аутентификацию с помощью Facebook (Google и Twitter тоже), и я много читал на эту тему и нашелOAuth.io который делает аутентификацию на стороне SPA клиента ипитон-социально-аутентификации который делает то же самое, но на стороне сервера.

Так что в настоящее время у меня есть только авторизация клиента, мое приложение подключается к Facebook (с OAuth.io) и успешно авторизируется. Этот процесс возвращает access_token, а затем я делаю запрос к своему API, который должен войти в систему этого пользователя или создать учетную запись для этого пользователя по данному токену, и эта часть не работает. Так что я не уверен, где я не прав, может быть, потому что нетt полное руководство по использованию python-social-auth, так что, возможно, я что-то упустил или .. я нене знаю ..

Итак, некоторый код этого, что у меня есть:

Со стороны SPA: это соединение с OAuth.io, и оно работает, потому что я получаю токен доступа. Затем я должен сделать запрос на мой отдых API. бэкэнд это 'facebook ','Google» или же 'твиттер»

OAuth.initialize('my-auth-code-for-oauthio');
OAuth.popup(backend, function(error, result) {
    //handle error with error
    //use result.access_token in your API request

    var token = 'Token ' + result.access_token;
    var loginPromise = $http({
         method:'POST', 
         url: 'api-token/login/' + backend + '/', 
         headers: {'Authorization': token}});

         loginPromise.success(function () {
             console.log('Succeess');
         });
         loginPromise.error(function (result) {
             console.log('error');
         });
});

На сервере в файле settings.py я добавил социальный плагин к установленным приложениям, препроцессорам контекста шаблона, некоторым бэкэндам аутентификации, и это мой файл:

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    ...,
    'rest_framework',
    'rest_framework.authtoken',
    'api',
    'social.apps.django_app.default',
    'social'
)
TEMPLATE_CONTEXT_PROCESSORS = ("django.contrib.auth.context_processors.auth",
                               "django.core.context_processors.debug",
                               "django.core.context_processors.i18n",
                               "django.core.context_processors.media",
                               "django.core.context_processors.static",
                               "django.core.context_processors.request",
                               "django.contrib.messages.context_processors.messages",
                               'social.apps.django_app.context_processors.backends',
                               'social.apps.django_app.context_processors.login_redirect',)

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
    )
}

SOCIAL_AUTH_FACEBOOK_KEY = 'key'
SOCIAL_AUTH_FACEBOOK_SECRET = 'secret'
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']

AUTHENTICATION_BACKENDS = (
      'social.backends.open_id.OpenIdAuth',
      'social.backends.facebook.FacebookOAuth2',
      'social.backends.facebook.FacebookAppOAuth',
      'social.backends.google.GoogleOpenId',
      'social.backends.google.GoogleOAuth2',
      'social.backends.google.GoogleOAuth',
      'social.backends.twitter.TwitterOAuth',
      'django.contrib.auth.backends.ModelBackend',
  )

В моем views.py API у меня есть следующее (я нашел егоВот):

from django.contrib.auth.models import User, Group
from rest_framework import viewsets, generics
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import authentication, permissions, parsers, renderers
from rest_framework.authtoken.serializers import AuthTokenSerializer
from rest_framework.decorators import api_view, throttle_classes
from social.apps.django_app.utils import strategy
from rest_framework.permissions import IsAuthenticated, IsAuthenticatedOrReadOnly

from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token

class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
    renderer_classes = (renderers.JSONRenderer,)
    serializer_class = AuthTokenSerializer
    model = Token

    # Accept backend as a parameter and 'auth' for a login / pass
    def post(self, request, backend):
        serializer = self.serializer_class(data=request.DATA)

        if backend == 'auth':
            if serializer.is_valid():
                token, created = Token.objects.get_or_create(user=serializer.object['user'])
                return Response({'token': token.key})
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

        else:
            # Here we call PSA to authenticate like we would if we used PSA on server side.
            user = register_by_access_token(request, backend)

            # If user is active we get or create the REST token and send it back with user data
            if user and user.is_active:
                token, created = Token.objects.get_or_create(user=user)
                return Response({'id': user.id , 'name': user.username, 'userRole': 'user','token': token.key})

@strategy()
def register_by_access_token(request, backend):
    backend = request.strategy.backend
    user = request.user
    user = backend._do_auth(
        access_token=request.GET.get('access_token'),
        user=user.is_authenticated() and user or None
    )
    return user

И, наконец, у меня есть эти маршруты в urls.py:

...
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token'),
url(r'^api-token/login/(?P[^/]+)/

Каждый раз, когда я пытаюсь сделать auth, OAuth.io работает и возвращается запрос к api

подробно: "Неверный токен "

Я думаю, что я что-то упустил в конфигурации python-social-auth или я делаю все неправильно. Так что буду рад, если у кого-нибудь появятся идеи и захочется помочь :)

, views.ObtainAuthToken.as_view()), url(r'^register/(?P[^/]+)/', views.register_by_access_token), ...

Каждый раз, когда я пытаюсь сделать auth, OAuth.io работает и возвращается запрос к api

подробно: "Неверный токен "

Я думаю, что я что-то упустил в конфигурации python-social-auth или я делаю все неправильно. Так что буду рад, если у кого-нибудь появятся идеи и захочется помочь :)

Ответы на вопрос(3)

Ваш ответ на вопрос