Крюк в коде oauth2 с DRF

Я пытаюсь создать приложение, которое имеет функции входа пользователя и регистрации.
I can create login and signup both from django, and DRF but couldn’t hook in oAuth2 with DRF to make it functional.
Я понятия не имею, где я должен использовать его.

Должен ли я генерировать токен при регистрации или входе в систему?
Как сделать его функциональным?




Вот мой код

serializers.py

class UserSerializer(ModelSerializer):
    class Meta:
        model = User


class UserCreateSerializer(ModelSerializer):
    email = EmailField()
    username =  CharField()
    first_name = CharField(required=False)
    last_name = CharField(required=False)
    password = CharField()
    confirm_password = CharField()
    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'first_name',
            'last_name',
            'password',
            'confirm_password'
        ]
        extra_kwargs = {"password": {"write_only": True}}


    def create(self, validated_data):
        username = validated_data['username']
        first_name = validated_data['first_name']
        last_name = validated_data['last_name']
        email = validated_data['email']
        password = validated_data['password']
        confirm_password = validated_data['password']
        user_obj = User(
                username = username,
                first_name = first_name,
                last_name = last_name,
                email = email
            )
        user_obj.set_password(password)
        user_obj.save()
        return validated_data



class UserLoginSerializer(ModelSerializer):
    username = CharField()
    class Meta:
        model = User
        fields = [
            'username',
            # 'email',
            'password',
            # 'token',

        ]
        extra_kwargs = {"password":
                            {"write_only": True}
                            }
    def validate(self, data):
        return data

views.py

class UserCreateAPI(CreateAPIView):
    serializer_class = UserCreateSerializer
    queryset = User.objects.all()
    permission_classes = [AllowAny]

class UserLoginAPI(APIView):
    permission_classes = [AllowAny]
    serializer_class = UserLoginSerializer

    def post(self, request, *args, **kwargs):
        data = request.data
        print('data',data)
        serializer = UserLoginSerializer(data=data)
        if serializer.is_valid(raise_exception=True):
            new_data = serializer.data
            if new_data:
                try:
                    user = User.objects.get(username=data['username'])
                    print ('user',user)
                except ObjectDoesNotExist:
                    return HttpResponse("Can't find this user")
                login(request, user)
            return Response(new_data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

tools.py

def get_token_json(access_token):
    return JsonResponse({
        'access_token':access_token.token,
        'expires_in':datetime.now() + timedelta(days=365),
        'token_type':'Bearer',
        'refresh_token':access_token.refresh_token.token,
        'scope':access_token.scope
    })


def get_access_token(user):
    application = Application.objects.get(name="Foodie")
    try:
        old_access_token = AccessToken.objects.get(user=user, application=application)
        old_refresh_token = RefreshToken.objects.get(user=user, access_token=old_access_token)
    except ObjectDoesNotExist:
        return HttpResponse('Have not set any token')
    else:
        old_access_token.delete()
        old_refresh_token.delete()
    new_token = generate_token()
    refresh_token = generate_token()
    access_token=AccessToken.objects.create(user=user, application=app, expires=datetime.now() + timedelta(days=365),token=new_token)
    RefreshToken.objects.create(user=user, application=app, token=refresh_token, access_token=access_token)
    print('aceess',AccessToken)
    return get_token_json(access_token)

Как я могу преодолеть разрыв между DRF и oAuth2, чтобы сделать логин и регистрацию пользователей функциональными?

1 ответ

  1. Попробуйте использовать python social auth.

    Добавить social.apps.django_app.defaultв INSTALLED_APPS

    Добавить social.backends.facebook.FacebookOAuth2в AUTHENTICATION_BACKENDS

    Добавить url(r'^auth/', include('social.apps.django_app.urls', namespace='social'))к вашему urls.py

    Однако это будет работать, если у вас есть аутентификация сеанса в приложении. Если вы хотите использовать только маркер на основе, добавьте канал для создания и отправки маркера или посмотрите на https://github.com/PhilipGarnero/django-rest-framework-social-oauth2