Наконец-то решено!Проблема в том, что 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
.