Подтвердить что ты не робот

Вставьте django-allauth в качестве конечной точки в django-rest-framework

Я использую django-allauth на своем веб-сайте для социальных входов. У меня также есть REST API, основанный на django-rest-framework, который служит основой для мобильного приложения. Есть ли способ, с помощью которого я могу напрямую подключить allauth аутентификацию к REST api, чтобы я мог проверять (и регистрировать) пользователей, использующих Facebook в мобильном приложении?

Чтобы уточнить: часть входа в Facebook обрабатывается собственными SDK. Мне нужна конечная точка, которая работает как POST /user (т.е. Создает нового пользователя), но использует токен Oauth Facebook как вход вместо электронной почты и пароля и т.д.

4b9b3361

Ответ 1

Вы можете использовать этот libray для социальной аутентификации django-rest-framework-social-oauth2. Попробуйте этот связанный с django-allauth код

urls.py

urlpatterns = [
    url(
        r'^rest/facebook-login/$',
        csrf_exempt(RestFacebookLogin.as_view()),
        name='rest-facebook-login'
    ),
]

serializers.py

class EverybodyCanAuthentication(SessionAuthentication):
    def authenticate(self, request):
        return None

views.py

class RestFacebookLogin(APIView):
    """
    Login or register a user based on an authentication token coming
    from Facebook.
    Returns user data including session id.
    """

    # this is a public api!!!
    permission_classes = (AllowAny,)
    authentication_classes = (EverybodyCanAuthentication,)

    def dispatch(self, *args, **kwargs):
        return super(RestFacebookLogin, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        try:
            original_request = request._request
            auth_token = request.GET.get('auth_token', '')

            # Find the token matching the passed Auth token
            app = SocialApp.objects.get(provider='facebook')
            fb_auth_token = SocialToken(app=app, token=auth_token)

            # check token against facebook
            login = fb_complete_login(original_request, app, fb_auth_token)
            login.token = fb_auth_token
            login.state = SocialLogin.state_from_request(original_request)

            # add or update the user into users table
            complete_social_login(original_request, login)
            # Create or fetch the session id for this user
            token, _ = Token.objects.get_or_create(user=original_request.user)
            # if we get here we've succeeded
            data = {
                'username': original_request.user.username,
                'objectId': original_request.user.pk,
                'firstName': original_request.user.first_name,
                'lastName': original_request.user.last_name,
                'sessionToken': token.key,
                'email': original_request.user.email,
            }
            return Response(
                status=200,
                data=data
            )

        except:
            return Response(status=401, data={
                'detail': 'Bad Access Token',
            })

Ответ 2

Пока я не совсем уверен, как использовать allauth и rest-fremework вместе, allauth не предлагает такую ​​конечную точку.

Предложение: сделайте свой собственный, который изменит следующее:
Вызовите allauth.socialaccount.providers.facebook.views.fb_complete_login (None, socialtoken), где socialtoken создается как login_by_token. Это выполняет (несколько функций глубже) django.contrib.auth.login, возможно, создавая acct.

После этого для использования на мобильных устройствах может быть возможно токен auth (not FB): получить пользовательские данные (из сеанса?) И вызвать rest_framework.authtoken.views.obtain_auth_token

Примечания:
1. Это не дает возможности разрешить конфликты электронной почты или подключить социальные/локальные действия.
2. Я не пробовал - пожалуйста, отправьте код, если вы можете заставить его работать.

Ответ 4

Вы можете использовать Django Rest Auth для этого, что зависит от django-allauth.