У меня есть некоторые конечные точки API, которые необходимо защитить с помощью HTTP Basi c Аутентификация в Django Rest Framework. В DRF есть BasicAuthentication , но на самом деле это аутентификация против пользователя в Django, а это не то, что я ищу.
Я нашел решение, используя пользовательское разрешение, но Это означает, что обезьяна исправляет представления, чтобы установить правильный заголовок проверки подлинности.
Есть ли лучший способ?
class BasicAuthPermission(permissions.BasePermission):
def has_permission(self, request, view):
credentials = view.credentials # Will raise AttributeError on missing credentials
realm = getattr(view, 'realm', 'Protected')
auth = request.headers.get('Authorization')
with suppress(ValueError, AttributeError):
auth = b64decode(auth.split()[-1]).decode()
if auth != credentials:
# Monkey patch style
view.get_authenticate_header = lambda r: f'Basic realm="{realm}"'
raise exceptions.AuthenticationFailed('Bad credentials.')
return True
Я считаю:
class ProtectedApiView(generics.GenericAPIView):
permission_classes = [BasicAuthPermission]
credentials = 'user:password'
# ...