Предотвращение одновременного входа в систему django rest framework jwt аутентификация

Я использую djangorestframework-simplejwt==4.4.0 в своем приложении для аутентификации пользователей. Но по умолчанию он обеспечивает несколько логинов для одного пользователя, т.е. я могу генерировать n-ое количество токенов.

Я хочу предотвратить многократный вход в систему с одной и той же учетной записи. Как мне это сделать?

Models.py

class Company(models.Model):
    region_coices = (('East', 'East'), ('West', 'West'), ('North', 'North'), ('South', 'South'))
    category = (('Automotive', 'Automotive'), ('F.M.C.G.', 'F.M.C.G.'), ('Pharmaceuticals', 'Pharmaceuticals'),
                ('Ecommerce', 'Ecommerce'), ('Others', 'Others'))
    type = models.ManyToManyField(CompanyTypes)
    name = models.CharField(max_length=500, default=0)
    email = models.EmailField(max_length=50, default=0)


class User(AbstractUser):
    is_admin = models.BooleanField(default=False)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, blank=True, null=True)

    @property
    def full_name(self):
        return self.first_name + " " + self.last_name



class EmployeeTypes(models.Model):
    emp_choices = (('Pool Operator', 'Pool Operator'), ('Consignor', 'Consignor'), ('Consignee', 'Consignee'))
    emp_type = models.CharField(max_length=500, default='Pool Operator', choices=emp_choices)


class Employee(models.Model):
    role_choices = (('CRUD', 'CRUD'), ('View', 'View'))
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name="company")
    name = models.CharField(max_length=500, default=0)

Urls.py

path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),

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

вот так :-

try:

token = Token.objects.get(user=user) // Chcck if token is present

except Token.DoesNotExist:

token = Token.objects.create(user=user) // Create new token, no token for this user

else:

return Response({'error': 'Already logged in', status=400})

Вам необходимо самостоятельно реализовать механизм входа в систему.

Вы можете хранить токен обновления пользователя refresh token с его user agent и IP address в базе данных или некоторые системы кэширования, такие как Redis, когда пользователь хочет обновить токен доступа, проверяют предоставленный токен обновления вместе с его IP-адресом и агентом пользователя в базе данных, и если какой-либо токен существует, выдают ему новый токен доступа.

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

При реализации этого решения, если пользователь попытается войти в систему снова, он автоматически выйдет из предыдущих логинов.

Вернуться на верх