DRF отвечает мне ошибкой 403 с {"detail": "У вас нет разрешения на выполнение этого действия".} полезная нагрузка, когда я пытаюсь сделать запрос в качестве клиента - PullRequest
0 голосов
/ 19 сентября 2019

В settings.py файле я записал эти настройки:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
}

Когда я вызываю любой API с токеном из приложения password grant, тогда он работает нормально, но когда я пытаюсь вызватьте же API с токеном из приложения client credential grant, оно не работает и отвечает с ошибкой 403.Это из-за разрешения по умолчанию?Я не знаю, какое разрешение я должен использовать вместо этого!?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Наконец-то решено!Проблема в том, что permission я использовал.IsAuthenticated проверки прав доступа request.user.Когда вы используете грант client credential, request.user равен None.Поскольку permission для поддержки гранта clien credential в DRF нет, вы должны использовать собственное специальное разрешение.Это то, что мне было нужно и использовалось:

class IsAuthenticatedOrClientCredentialPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.auth is None:
            return False
        grant_type = request.auth.application.get_authorization_grant_type_display()
        if request.user is None:
            if grant_type == 'Client credentials':
                request.user = request.auth.application.user  # <-- this is because I needed to get the user either the grant is 'password' or 'client credentials'
                return True
            else:
                return False
        else:
            return True

Но вы можете захотеть получить разрешение только для проверки, является ли тип гранта client credentials, и дать разрешение, если так, вот что вам нужно:

class ClientCredentialPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.auth is None:
            return False
        grant_type = request.auth.application.get_authorization_grant_type_display()
        if request.user is None and grant_type == 'Client credentials':
            return True
        else:
            return False

Примечание: если вы хотите использовать второе настраиваемое разрешение, учтите, что request.user - это None, и вы можете получить владельца клиента (то естьотправив вам запрос) через request.auth.application.user.

0 голосов
/ 19 сентября 2019

вам нужно включить tokenAuthentication и запустить миграцию, чтобы применить изменения в таблице аутентификации DB

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',  # <-- And here
    ],
}

INSTALLED_APPS = [
    ...
    'rest_framework.authtoken'
]

Вот идеальный блог для вашего варианта использования.

https://www.django -rest-framework.org/api-guide/authentication/#tokenauthentication

https://simpleisbetterthancomplex.com/tutorial/2018/11/22/how-to-implement-token-authentication-using-django-rest-framework.html#implementing-the-token-authentication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...