|
15 | 15 | from django.utils import timezone
|
16 | 16 | from django.utils.translation import gettext_lazy as _
|
17 | 17 | from rest_framework import exceptions
|
| 18 | +from rest_framework_simplejwt.exceptions import TokenError |
| 19 | +from rest_framework_simplejwt.tokens import AccessToken |
18 | 20 |
|
19 | 21 | from seed.lib.superperms.orgs.models import Organization
|
20 | 22 |
|
@@ -82,23 +84,29 @@ def process_header_request(cls, request):
|
82 | 84 | return None
|
83 | 85 |
|
84 | 86 | try:
|
85 |
| - if not auth_header.startswith("Basic"): |
86 |
| - raise exceptions.AuthenticationFailed("Only Basic HTTP_AUTHORIZATION is supported") |
87 |
| - |
88 |
| - auth_header = auth_header.split()[1] |
89 |
| - auth_header = base64.urlsafe_b64decode(auth_header).decode("utf-8") |
90 |
| - username, api_key = auth_header.split(":") |
91 |
| - |
92 |
| - valid_api_key = re.search("^[a-f0-9]{40}$", api_key) |
93 |
| - if not valid_api_key: |
94 |
| - raise exceptions.AuthenticationFailed("Invalid API key") |
95 |
| - |
96 |
| - user = SEEDUser.objects.get(api_key=api_key, username=username) |
97 |
| - return user |
| 87 | + if auth_header.startswith("Basic"): |
| 88 | + auth_header = auth_header.split()[1] |
| 89 | + auth_header = base64.urlsafe_b64decode(auth_header).decode("utf-8") |
| 90 | + username, api_key = auth_header.split(":") |
| 91 | + |
| 92 | + valid_api_key = re.search("^[a-f0-9]{40}$", api_key) |
| 93 | + if not valid_api_key: |
| 94 | + raise exceptions.AuthenticationFailed("Invalid API key") |
| 95 | + |
| 96 | + user = SEEDUser.objects.get(api_key=api_key, username=username) |
| 97 | + return user |
| 98 | + elif auth_header.startswith("Bearer"): |
| 99 | + at = AccessToken(auth_header.removeprefix("Bearer ")) |
| 100 | + user = SEEDUser.objects.get(pk=at["user_id"]) |
| 101 | + return user |
| 102 | + else: |
| 103 | + raise exceptions.AuthenticationFailed("Only Basic HTTP_AUTHORIZATION or BEARER Tokens are supported") |
98 | 104 | except ValueError:
|
99 | 105 | raise exceptions.AuthenticationFailed("Invalid HTTP_AUTHORIZATION Header")
|
| 106 | + except TokenError: |
| 107 | + raise exceptions.AuthenticationFailed("Invalid Bearer Token") |
100 | 108 | except SEEDUser.DoesNotExist:
|
101 |
| - raise exceptions.AuthenticationFailed("Invalid API key") |
| 109 | + raise exceptions.AuthenticationFailed("Invalid API key or Bearer Token") |
102 | 110 |
|
103 | 111 | def get_absolute_url(self):
|
104 | 112 | return f"/users/{quote(self.username)}/"
|
@@ -149,3 +157,9 @@ def save(self, *args, **kwargs):
|
149 | 157 | if self.email.lower() != self.username:
|
150 | 158 | self.email = self.username
|
151 | 159 | return super().save(*args, **kwargs)
|
| 160 | + |
| 161 | + def serialize(self): |
| 162 | + from seed.serializers.users import UserSerializer |
| 163 | + |
| 164 | + serializer = UserSerializer(self) |
| 165 | + return serializer.data |
0 commit comments