Аутентификация клиента в приложении на базе Django rest framework с использованием django-oauth-toolkit

Я создаю проект в django для своего мобильного приложения. Проект django — это серверная часть API для мобильного приложения. Я создал регистрацию для пользовательской модели, используя структуру django rest. API регистрации работает нормально. Теперь я хочу, чтобы обслуживался только запрос из моего мобильного приложения. Для этого я создал тип гранта авторизации приложения oauth "client-credentials"

class UserSerializer(ModelSerializer):
email = serializers.EmailField(
        required=True,
        validators=[UniqueValidator(queryset=User.objects.all())]
        )
username = serializers.CharField(
    validators=[UniqueValidator(queryset=User.objects.all())]
    )
password = serializers.CharField(min_length=8)

def create(self, validated_data):
    user = User.objects.create_user(validated_data['username'], validated_data['email'],
         validated_data['password'])
    return user

class Meta:
    model = User
    fields = ('id', 'username', 'email', 'password')
    read_only_fields = ('id',)
    write_only_fields = ('password',)

Это пользовательский сериализатор, а представление

class UserCreateAPIView(CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (IsAuthenticatedOrCreate, TokenHasScope)

Но проблема в том, что я могу делать прямые вызовы API регистрации без использования токена. Как убедиться, что User Create API вызывается, когда передается только токен, или что почтовый запрос действителен при передаче токена.


person Prabin Bhandari    schedule 06.12.2017    source источник
comment
можете ли вы указать классы аутентификации по умолчанию REST_FRAMEWORK и классы разрешений (settings.py) в вопросе ... проблема связана с предоставленной вами аутентификацией/разрешением.   -  person Saji Xavier    schedule 06.12.2017
comment
что такое разрешение IsAuthenticatedOrCreate? он разрешает запрос пользователя на создание без аутентификации.   -  person Saji Xavier    schedule 06.12.2017
comment
@SajiXavier IsAuthenticatedOrCreate — это созданный мной класс разрешений, который позволяет аутентифицированным пользователям входить в систему, а неаутентифицированным пользователям — регистрироваться. Класс IsAuthenticatedOrCreate(permissions.IsAuthenticated): def has_permission(self, request, view): вернуть True вернуть super(IsAuthenticatedOrCreate, self).has_permission(запрос, просмотр)   -  person Prabin Bhandari    schedule 06.12.2017
comment
oauth используется только для аутентификации, и вам необходимо определить соответствующее разрешение на основе состояния аутентификации. Поэтому, если вы разрешаете пользователям регистрироваться без аутентификации, Signup API будет доступен без токена. Пожалуйста, попробуйте с "IsAuthenticated"   -  person Saji Xavier    schedule 06.12.2017


Ответы (1)


Вы можете просто создать приложение с типом гранта Client Credentials и установить свой класс разрешений следующим образом:

permission_classes = [TokenHasReadWriteScope]

Для других ваших API, которые требуют аутентификации и авторизации пользователя, вы можете выпустить другого клиента с типом гранта На основе пароля владельца ресурса и установить свой класс разрешений как:

permission_classes = [TokenHasReadWriteScope, YourCustomPermission]

Или, если вам нужны как учетные данные клиента, так и пароль владельца ресурса (например, для вашего API регистрации могут потребоваться только учетные данные клиента, но для редактирования личной информации пользователя может потребоваться ресурс предоставление на основе пароля владельца). Для этого вы можете создать пользовательскую модель приложения и разрешить обе для клиента. http://django-oauth-toolkit.readthedocs.io/en/latest/advanced_topics.html?highlight=extending%20

person Sagar Adhikari    schedule 03.05.2018
comment
Эй, не могли бы вы помочь мне с похожей проблемой: stackoverflow.com/questions/55351275/ - person Syed Ammar Mustafa; 31.03.2019