Как реализовать авторизацию запросов с использованием API ключа или токена в Django?

Я разрабатываю небольшой внутренний веб-проект на Django, используя стандартную аутентификацию пользователей по имени пользователя и паролю. У меня возникла необходимость предоставить доступ к некоторым URL для другого сервиса, что похоже на создание мини API. Однако я не хочу использовать Django Rest Framework (DRF) и ищу способ реализовать простую авторизацию запросов с помощью API-ключа (токена). Все, что я нахожу в интернете, в основном касается DRF. Есть ли готовые решения для реализации авторизации без использования DRF? Я буду признателен за ваши рекомендации или направляющие.
  • 18 февраля 2025 г. 14:34
Ответы на вопрос 2
Для реализации авторизации запросов с использованием API ключа или токена в Django без использования Django Rest Framework (DRF), вы можете самостоятельно создать middleware или использовать декораторы для проверки токена. Вот простой подход, который можно реализовать:

### Шаг 1: Создайте модель для хранения API ключей

Сначала создайте модель, которая будет хранить ваши API ключи. Например:

```python
# models.py
from django.db import models

class APIKey(models.Model):
    key = models.CharField(max_length=40, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
```

### Шаг 2: Создайте ключи в базе данных

Сгенерируйте пару ключей (например, UUID) и добавьте их в вашу базу данных:

```python
import uuid
from myapp.models import APIKey

key = uuid.uuid4().hex
APIKey.objects.create(key=key)
print(key)  # Сохраняйте этот ключ, чтобы использовать в запросах
```

### Шаг 3: Создайте middleware

Создайте middleware для проверки токена на каждом запросе:

```python
# middleware.py
from django.http import JsonResponse
from myapp.models import APIKey

class APIKeyMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        api_key = request.META.get('HTTP_X_API_KEY')
        
        if not api_key or not APIKey.objects.filter(key=api_key).exists():
            return JsonResponse({'error': 'Unauthorized'}, status=401)

        response = self.get_response(request)
        return response
```

### Шаг 4: Добавьте middleware в проект

Зарегистрируйте ваше middleware в настройках Django:

```python
# settings.py
MIDDLEWARE = [
    ...
    'myapp.middleware.APIKeyMiddleware',
    ...
]
```

### Шаг 5: Защита ваших представлений (views)

Теперь создайте представления, которые будут защищены авторизацией. Просто используйте их в любом URL-шаблоне:

```python
# views.py
from django.http import JsonResponse

def my_protected_view(request):
    data = {'message': 'Success! You have access.'}
    return JsonResponse(data)
```

### Шаг 6: Настройка URL

Теперь настройте ваш URL для этого представления:

```python
# urls.py
from django.urls import path
from myapp.views import my_protected_view

urlpatterns = [
    path('api/protected/', my_protected_view, name='protected_view'),
]
```

### Шаг 7: Использование API

Теперь любой запрос к вашему защищенному представлению должен включать заголовок `X-API-KEY`:

```bash
curl -H "X-API-KEY: ваш_ключ_здесь" http://localhost:8000/api/protected/
```

### Дополнительные рекомендации

1. **Безопасность:** Убедитесь, что ваши API ключи достаточно сложные и невозможно их угадать.
2. **Логирование:** Рассмотрите возможность логирования запросов для ведения учета их использования.
3. **Ограничение доступов:** Вы можете добавить дополнительные уровни контроля доступа, например, привязывая ключи к конкретным пользователям или IP-адресам.

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


Похожие вопросы