Как создать самоопределяющийся токен в Django Token Auth

#python #django #django-rest-framework #django-authentication

#python #django #django-rest-framework #django-аутентификация

Вопрос:

Можем ли мы создать самоопределяющийся токен в аутентификации токена в Django?

В настоящее время мы создаем суперпользователя и генерируем токен для этого суперпользователя. Но существует несколько сред, и мы хотим сохранить токен одинаковым для всех сред. Следовательно, необходим самоопределяющийся токен.

Например, если мы создадим токен, используя Token Auth

 REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
}
  

сначала мы создаем суперпользователя, затем создаем токен с помощью django-admin.

 Authorization:Token 8b000baba908hh7cf0618d492896e7b4bd6c9ce3
  

Здесь я хочу определить свой собственный токен, который будет сохранен в той же таблице.

Комментарии:

1. что-то вроде JWT (?)

2. я думаю, не так, как JWT, в JWT пользователь запрашивает токен 1st. я хочу сохранить токен постоянным. я обновил описание, если это поможет. @Alviandoh

3. итак, технически, если мы «украдем» метод rest_framework Token, сгенерируем их собственный токен и сохраним его в вашей таблице. а затем создайте пользовательский сервер на основе их серверной части. Это было бы хорошо?

Ответ №1:

Если я правильно понимаю ваш вопрос, вы хотели бы иметь один и тот же токен для суперпользователя во многих средах (на разных серверах)? Если это так, то вы можете попытаться переопределить метод автоматического создания токенов.

Как сгенерировать токены: https://www.django-rest-framework.org/api-guide/authentication/#generating-tokens

Код DRF authToken https://github.com/encode/django-rest-framework/blob/master/rest_framework/authtoken/models.py

На основе приведенного выше примера кода может быть (не проверено):

 @receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        if instance.is_superuser:    
            Token.objects.create(user=instance, key="superuser_key")
        else:
            Token.objects.create(user=instance) # use generated key 
  

Важно, пожалуйста, не кодируйте токен жестко в коде, вы можете использовать, например, пакет python-decouple для обработки его как переменной env.