Skip to content

Commit 5221afd

Browse files
committed
Merge branch '#1392'
2 parents 2c71a35 + 88302fa commit 5221afd

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

drf_spectacular/contrib/rest_auth.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,19 @@ def get_dj_rest_auth_setting(class_name, setting_name):
2323
return getattr(api_settings, setting_name)
2424

2525

26-
def get_token_serializer_class():
26+
def get_use_jwt():
2727
from dj_rest_auth.__version__ import __version__
2828

2929
if get_version_tuple(__version__) < (3, 0, 0):
30-
use_jwt = getattr(settings, 'REST_USE_JWT', False)
30+
return getattr(settings, 'REST_USE_JWT', False)
3131
else:
3232
from dj_rest_auth.app_settings import api_settings
3333

34-
use_jwt = api_settings.USE_JWT
34+
return api_settings.USE_JWT
35+
3536

36-
if use_jwt:
37+
def get_token_serializer_class():
38+
if get_use_jwt():
3739
return get_dj_rest_auth_setting('JWTSerializer', 'JWT_SERIALIZER')
3840
else:
3941
return get_dj_rest_auth_setting('TokenSerializer', 'TOKEN_SERIALIZER')
@@ -74,12 +76,26 @@ def view_replacement(self):
7476
else:
7577
get_schema_params = {'exclude': True}
7678

79+
if (
80+
get_use_jwt()
81+
and 'rest_framework_simplejwt.token_blacklist' in settings.INSTALLED_APPS
82+
and not get_dj_rest_auth_setting('JWT_AUTH_HTTPONLY', 'JWT_AUTH_HTTPONLY')
83+
):
84+
class LogoutSerializer(serializers.Serializer):
85+
refresh = serializers.CharField(required=True, allow_blank=False)
86+
87+
post_request_class = LogoutSerializer
88+
else:
89+
post_request_class = None
90+
7791
class Fixed(self.target_class):
7892
@extend_schema(**get_schema_params)
7993
def get(self, request, *args, **kwargs):
8094
pass # pragma: no cover
8195

82-
@extend_schema(request=None, responses=RestAuthDetailSerializer)
96+
@extend_schema(
97+
request=post_request_class, responses=RestAuthDetailSerializer
98+
)
8399
def post(self, request, *args, **kwargs):
84100
pass # pragma: no cover
85101

tests/contrib/test_rest_auth.py

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.urls import include, path
77
from rest_framework import viewsets
88

9-
from tests import assert_schema, generate_schema
9+
from tests import assert_schema, generate_schema, get_request_schema
1010
from tests.models import SimpleModel, SimpleSerializer
1111

1212
try:
@@ -79,3 +79,35 @@ class XViewset(viewsets.ModelViewSet):
7979
'jwtCookieAuth': {'type': 'apiKey', 'in': 'cookie', 'name': 'jwt-session'},
8080
'jwtHeaderAuth': {'type': 'http', 'scheme': 'bearer', 'bearerFormat': 'JWT'}
8181
}
82+
83+
84+
@pytest.mark.contrib('dj_rest_auth', 'rest_framework_simplejwt')
85+
@mock.patch('dj_rest_auth.app_settings.api_settings.USE_JWT', True)
86+
@mock.patch('dj_rest_auth.app_settings.api_settings.JWT_AUTH_HTTPONLY', False)
87+
def test_rest_auth_token_blacklist(no_warnings, settings):
88+
# flush module import cache to re-evaluate conditional import
89+
import dj_rest_auth.urls
90+
reload(dj_rest_auth.urls)
91+
92+
settings.INSTALLED_APPS += (
93+
'rest_framework_simplejwt',
94+
'rest_framework_simplejwt.token_blacklist',
95+
)
96+
urlpatterns = [
97+
path('rest-auth/', include('dj_rest_auth.urls')),
98+
]
99+
schema = generate_schema(None, patterns=urlpatterns)
100+
assert get_request_schema(schema['paths']['/rest-auth/logout/']['post'])['$ref'] == (
101+
'#/components/schemas/Logout'
102+
)
103+
assert schema['components']['schemas']['Logout'] == {
104+
'type': 'object',
105+
'properties': {
106+
'refresh': {
107+
'type': 'string',
108+
},
109+
},
110+
'required': [
111+
'refresh',
112+
],
113+
}

0 commit comments

Comments
 (0)