Skip to content

Commit 3483d97

Browse files
authored
Merge pull request #20943 from netbox-community/20936-api-auth-check
Closes #20936: Add a REST API endpoint to validate authentication credentials
2 parents 7eefb07 + ca43adf commit 3483d97

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

netbox/netbox/api/views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
from django_rq.queues import get_connection
66
from drf_spectacular.types import OpenApiTypes
77
from drf_spectacular.utils import extend_schema
8+
from rest_framework.permissions import IsAuthenticated
89
from rest_framework.response import Response
910
from rest_framework.reverse import reverse
1011
from rest_framework.views import APIView
1112
from rq.worker import Worker
1213

1314
from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired
1415
from netbox.plugins.utils import get_installed_plugins
16+
from users.api.serializers import UserSerializer
1517
from utilities.apps import get_installed_apps
1618

1719

@@ -62,3 +64,15 @@ def get(self, request):
6264
'python-version': platform.python_version(),
6365
'rq-workers-running': Worker.count(get_connection('default')),
6466
})
67+
68+
69+
class AuthenticationCheckView(APIView):
70+
"""
71+
Return the user making the request, if authenticated successfully.
72+
"""
73+
permission_classes = [IsAuthenticated]
74+
75+
@extend_schema(responses={200: OpenApiTypes.OBJECT})
76+
def get(self, request):
77+
serializer = UserSerializer(request.user, context={'request': request})
78+
return Response(serializer.data)

netbox/netbox/tests/test_api.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,18 @@ def test_status(self):
3232

3333
self.assertEqual(response.status_code, 200)
3434

35+
def test_authentication_check(self):
36+
url = reverse('api-authentication-check')
37+
38+
# Test an unauthenticated request
39+
response = self.client.get(f'{url}')
40+
self.assertEqual(response.status_code, 403)
41+
42+
# Test an authenticated request
43+
response = self.client.get(f'{url}', **self.header)
44+
self.assertEqual(response.status_code, 200)
45+
self.assertEqual(response.data['id'], self.user.pk)
46+
3547

3648
class OptionalLimitOffsetPaginationTest(TestCase):
3749

netbox/netbox/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
66

77
from account.views import LoginView, LogoutView
8-
from netbox.api.views import APIRootView, StatusView
8+
from netbox.api.views import APIRootView, AuthenticationCheckView, StatusView
99
from netbox.graphql.schema import schema
1010
from netbox.graphql.views import NetBoxGraphQLView
1111
from netbox.plugins.urls import plugin_patterns, plugin_api_patterns
@@ -53,6 +53,7 @@
5353
path('api/vpn/', include('vpn.api.urls')),
5454
path('api/wireless/', include('wireless.api.urls')),
5555
path('api/status/', StatusView.as_view(), name='api-status'),
56+
path('api/authentication-check/', AuthenticationCheckView.as_view(), name='api-authentication-check'),
5657

5758
# REST API schema
5859
path(

0 commit comments

Comments
 (0)