Фреймворк Django-rest и тип гранта Client Credentials без пользователя
Я использую фреймворк Django-rest для реализации набора API с использованием типа гранта Client Credentials. Тип гранта Client Credentials используется клиентами для получения маркера доступа вне контекста пользователя.
Мой метод "authenticate" не привязан к пользователю, да и не должен быть привязан. Однако Django rest, согласно документации, ожидает пользователя.
"Если ни один класс не аутентифицируется, request.user будет установлен в экземпляр django.contrib.auth.models.AnonymousUser, а request.auth будет установлен на None."
.
Это означает, что даже если мой токен действителен, Django rest все равно выдаст отказ в разрешении.
Например:
class TokenAuthentication(BaseAuthentication):
"""
https://www.oauth.com/oauth2-servers/access-tokens/self-encoded-access-tokens/
"""
keyword = 'Bearer'
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.user_model = get_user_model()
def authenticate(self, request):
token = get_authorization_header(request).split()
if not token or token[0].lower() != self.keyword.lower().encode():
return None
if len(token) == 1:
raise InvalidTokenHeaders()
if len(token) > 2:
raise InvalidTokenHeaders()
token = token[1]
unsigned_claims = self.decode_token_claims_no_key(token)
client_id = unsigned_claims.get('sub',None)
client = self.get_application_by_client_id(client_id=client_id)
if client is None:
raise InvalidToken()
trusted_cliams = self.verify_token_cliams(token, client.client_secret)
request.user = None
request.auth = trusted_cliams.get('client_id')
return request.user,request.auth