Как установить ключи API для моделей без аутентификации в Django?

Я разрабатываю трекер инвентаризации для магазинов, где каждый магазин может иметь несколько торговых точек. Я использую Django с Django Rest Framework.

Каждый магазин представляет собой модель аутентификации. Как таковой, он может управлять своими соответствующими торговыми точками и настройками, войдя в систему.

В текущем состоянии каждая торговая точка использует один и тот же токен модели магазина (предоставляемый DRF) для подключения и обновления инвентаря по мере совершения продаж. На мой взгляд, это создает уязвимость в безопасности. Например, если магазин имеет сотни торговых точек и API-ключ одной из них раскрыт, все торговые точки будут раскрыты.

Есть ли способ генерировать токен аутентификации для каждой торговой точки? Таким образом, магазины смогут управлять и, при необходимости, обновлять токен каждой торговой точки.

Кроме того, как мне проверить этот токен в представлениях DRF и/или сериализаторе?

Q1:

Есть ли способ генерировать токен аутентификации для каждой торговой точки?

Полностью документирован в разделе Настройка. Для вашего кода, например, чтобы иметь несколько ключей для каждой розетки:

# stores/models.py
from django.db import models
from rest_framework_api_key.models import AbstractAPIKey

class Store(models.Model):
    name = models.CharField(max_length=128)

class Outlet(models.Model):
    name = models.CharField(max_length=128)
    store = models.ForeignKey(
        Store,
        on_delete=models.CASCADE)

class OutletAPIKey(AbstractAPIKey):
    outlet = models.ForeignKey(
        Outlet,
        on_delete=models.CASCADE,
        related_name="api_keys",
    )

Вы можете управлять ключами на панели администратора .

Q2:

Кроме того, как мне проверить этот токен в представлениях DRF и/или сериализаторе?

После программного использования документация должна быть примерно такой:

from rest_framework.views import APIView
from rest_framework_api_key.models import APIKey
from rest_framework_api_key.permissions import HasAPIKey

from .models import Project

class ProjectListView(APIView):
    permission_classes = [HasAPIKey]

    def get(self, request):
        """Retrieve a project based on the request API key."""
        key = request.META["HTTP_AUTHORIZATION"].split()[1]
        outlet_api_key = OutletAPIKey.objects.get_from_key(key)
        outlet = outlet_api_key.outlet
Вернуться на верх