diff --git a/rest_framework_sso/migrations/0003_sessiontoken_client_id.py b/rest_framework_sso/migrations/0003_sessiontoken_client_id.py new file mode 100644 index 0000000..863cfdd --- /dev/null +++ b/rest_framework_sso/migrations/0003_sessiontoken_client_id.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.7 on 2021-10-26 09:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("rest_framework_sso", "0002_sessiontoken_last_used_at"), + ] + + operations = [ + migrations.AddField( + model_name="sessiontoken", + name="client_id", + field=models.CharField(blank=True, max_length=1000), + ), + ] diff --git a/rest_framework_sso/models.py b/rest_framework_sso/models.py index 0005b6e..cf1c712 100644 --- a/rest_framework_sso/models.py +++ b/rest_framework_sso/models.py @@ -28,6 +28,7 @@ class SessionToken(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, db_index=True) user = models.ForeignKey(to=AUTH_USER_MODEL, related_name="+", on_delete=models.CASCADE, verbose_name=_("user")) + client_id = models.CharField(max_length=1000, blank=True) ip_address = models.GenericIPAddressField(null=True, blank=True, db_index=True) user_agent = models.CharField(max_length=1000, blank=True) last_used_at = models.DateTimeField(null=True, blank=True, db_index=True) diff --git a/rest_framework_sso/serializers.py b/rest_framework_sso/serializers.py index dd27e95..b6ebeaa 100644 --- a/rest_framework_sso/serializers.py +++ b/rest_framework_sso/serializers.py @@ -18,6 +18,7 @@ class SessionTokenSerializer(serializers.Serializer): username = serializers.CharField(label=_("Username")) password = serializers.CharField(label=_("Password"), style={"input_type": "password"}) + client_id = serializers.CharField(label=_("Client ID"), allow_blank=True, required=False, default="") def validate(self, attrs): username = attrs.get("username") diff --git a/rest_framework_sso/views.py b/rest_framework_sso/views.py index 45a07e9..45ba58c 100644 --- a/rest_framework_sso/views.py +++ b/rest_framework_sso/views.py @@ -72,9 +72,15 @@ def post(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.validated_data["user"] - session_token = SessionToken.objects.active().filter(user=user).with_user_agent(request=request).first() + client_id = serializer.validated_data["client_id"] + session_token = ( + SessionToken.objects.active() + .filter(user=user, client_id=client_id) + .with_user_agent(request=request) + .first() + ) if session_token is None: - session_token = SessionToken(user=user) + session_token = SessionToken(user=user, client_id=client_id) session_token.update_attributes(request=request) session_token.save() payload = create_session_payload(session_token=session_token, user=user)