Фреймворк 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
Вернуться на верх