import logging from oauth2_provider.contrib.rest_framework import TokenMatchesOASRequirements, OAuth2Authentication from rest_framework.permissions import ( IsAuthenticated ) logger = logging.getLogger("oauth2_provider") class IsAuthenticatedOrTokenMatchesOASRequirements(TokenMatchesOASRequirements): def has_permission(self, request, view): logger.debug(f'try to authenticate {request} for {view} in IsAuthenticatedOrTokenMatchesOASRequirements') is_authenticated = IsAuthenticated().has_permission(request, view) logger.debug(f'is_authenticated: {is_authenticated}') oauth2authenticated = False if is_authenticated: oauth2authenticated = isinstance(request.successful_authenticator, OAuth2Authentication) logger.debug(f'oauth2authenticated: {oauth2authenticated}') token_has_scope = TokenMatchesOASRequirements() logger.debug(f'token_has_scope: {token_has_scope}') result = (is_authenticated and not oauth2authenticated) or token_has_scope.has_permission(request, view) logger.debug(f'authentication result: {result}') return result