Предотвращение одновременного входа в систему 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-адресом и агентом пользователя в базе данных, и если какой-либо токен существует, выдают ему новый токен доступа.
При входе в систему сбросьте неистекшие маркеры обновления, если они существуют в базе данных для пользователя, который успешно вошел в систему, а затем вставьте новый маркер обновления, который вы только что сгенерировали, в базу данных.
При реализации этого решения, если пользователь попытается войти в систему снова, он автоматически выйдет из предыдущих логинов.