Skip to content

Commit 886f760

Browse files
committed
Filter tokens by user agent
1 parent 15e448c commit 886f760

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

rest_framework_sso/querysets.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@ class SessionTokenQuerySet(QuerySet):
99
def active(self):
1010
return self.filter(Q(revoked_at__isnull=True) | Q(revoked_at__gt=timezone.now()))
1111

12-
def first_or_create(self, defaults=None, **kwargs):
12+
def first_or_create(self, defaults=None, request_meta=None, **kwargs):
1313
"""
1414
Looks up an object with the given kwargs, creating one if necessary.
1515
Returns a tuple of (object, created), where created is a boolean
1616
specifying whether an object was created.
1717
"""
18+
if request_meta and 'HTTP_USER_AGENT' in request_meta:
19+
kwargs['user_agent__startswith'] = request_meta.get('HTTP_USER_AGENT')[:100]
20+
1821
lookup, params = self._extract_model_params(defaults, **kwargs)
1922
# The get() needs to be targeted at the write database in order
2023
# to avoid potential transaction consistency problems.

rest_framework_sso/views.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# coding: utf-8
22
from __future__ import absolute_import, unicode_literals
33

4+
from rest_framework import status
45
from rest_framework.permissions import IsAuthenticated
56
from rest_framework.response import Response
67
from rest_framework.views import APIView
@@ -67,7 +68,8 @@ def post(self, request, *args, **kwargs):
6768
serializer = self.get_serializer(data=request.data)
6869
serializer.is_valid(raise_exception=True)
6970
user = serializer.validated_data['user']
70-
session_token, created = SessionToken.objects.active().first_or_create(user=user)
71+
session_token, created = SessionToken.objects.active().\
72+
first_or_create(user=user, request_meta=request.META)
7173
session_token.update_attributes(request=request)
7274
session_token.save()
7375
payload = create_session_payload(session_token=session_token, user=user)
@@ -84,9 +86,14 @@ class ObtainAuthorizationTokenView(BaseAPIView):
8486

8587
def post(self, request, *args, **kwargs):
8688
if hasattr(request.auth, 'get') and request.auth.get('sid'):
87-
session_token, created = SessionToken.objects.active().first_or_create(pk=request.auth.get('sid'), user=request.user)
89+
try:
90+
session_token = SessionToken.objects.active().\
91+
get(pk=request.auth.get('sid'), user=request.user)
92+
except SessionToken.DoesNotExist:
93+
return Response({'detail': 'Invalid token.'}, status=status.HTTP_401_UNAUTHORIZED)
8894
else:
89-
session_token, created = SessionToken.objects.active().first_or_create(user=request.user)
95+
session_token, created = SessionToken.objects.active().\
96+
first_or_create(user=request.user, request_meta=request.META)
9097

9198
session_token.update_attributes(request=request)
9299
session_token.save()

0 commit comments

Comments
 (0)