core: add API to list all authenticator devices
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -15,6 +15,7 @@ from authentik.api.v3.sentry import SentryTunnelView | |||||||
| from authentik.api.views import APIBrowserView | from authentik.api.views import APIBrowserView | ||||||
| from authentik.core.api.applications import ApplicationViewSet | from authentik.core.api.applications import ApplicationViewSet | ||||||
| from authentik.core.api.authenticated_sessions import AuthenticatedSessionViewSet | from authentik.core.api.authenticated_sessions import AuthenticatedSessionViewSet | ||||||
|  | from authentik.core.api.devices import DeviceViewSet | ||||||
| from authentik.core.api.groups import GroupViewSet | from authentik.core.api.groups import GroupViewSet | ||||||
| from authentik.core.api.propertymappings import PropertyMappingViewSet | from authentik.core.api.propertymappings import PropertyMappingViewSet | ||||||
| from authentik.core.api.providers import ProviderViewSet | from authentik.core.api.providers import ProviderViewSet | ||||||
| @ -169,6 +170,7 @@ router.register("propertymappings/saml", SAMLPropertyMappingViewSet) | |||||||
| router.register("propertymappings/scope", ScopeMappingViewSet) | router.register("propertymappings/scope", ScopeMappingViewSet) | ||||||
| router.register("propertymappings/notification", NotificationWebhookMappingViewSet) | router.register("propertymappings/notification", NotificationWebhookMappingViewSet) | ||||||
|  |  | ||||||
|  | router.register("authenticators/all", DeviceViewSet, basename="device") | ||||||
| router.register("authenticators/duo", DuoDeviceViewSet) | router.register("authenticators/duo", DuoDeviceViewSet) | ||||||
| router.register("authenticators/sms", SMSDeviceViewSet) | router.register("authenticators/sms", SMSDeviceViewSet) | ||||||
| router.register("authenticators/static", StaticDeviceViewSet) | router.register("authenticators/static", StaticDeviceViewSet) | ||||||
|  | |||||||
							
								
								
									
										36
									
								
								authentik/core/api/devices.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								authentik/core/api/devices.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | """Authenticator Devices API Views""" | ||||||
|  | from django_otp import devices_for_user | ||||||
|  | from django_otp.models import Device | ||||||
|  | from drf_spectacular.utils import extend_schema | ||||||
|  | from rest_framework.fields import CharField, IntegerField, SerializerMethodField | ||||||
|  | from rest_framework.permissions import IsAuthenticated | ||||||
|  | from rest_framework.request import Request | ||||||
|  | from rest_framework.response import Response | ||||||
|  | from rest_framework.viewsets import ViewSet | ||||||
|  |  | ||||||
|  | from authentik.core.api.utils import MetaNameSerializer | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DeviceSerializer(MetaNameSerializer): | ||||||
|  |     """Serializer for Duo authenticator devices""" | ||||||
|  |  | ||||||
|  |     pk = IntegerField() | ||||||
|  |     name = CharField() | ||||||
|  |     type = SerializerMethodField() | ||||||
|  |  | ||||||
|  |     def get_type(self, instance: Device) -> str: | ||||||
|  |         """Get type of device""" | ||||||
|  |         return instance._meta.label | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class DeviceViewSet(ViewSet): | ||||||
|  |     """Viewset for authenticator devices""" | ||||||
|  |  | ||||||
|  |     serializer_class = DeviceSerializer | ||||||
|  |     permission_classes = [IsAuthenticated] | ||||||
|  |  | ||||||
|  |     @extend_schema(responses={200: DeviceSerializer(many=True)}) | ||||||
|  |     def list(self, request: Request) -> Response: | ||||||
|  |         """Get all devices for current user""" | ||||||
|  |         devices = devices_for_user(request.user) | ||||||
|  |         return Response(DeviceSerializer(devices, many=True).data) | ||||||
							
								
								
									
										44
									
								
								schema.yml
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								schema.yml
									
									
									
									
									
								
							| @ -655,6 +655,27 @@ paths: | |||||||
|           $ref: '#/components/schemas/ValidationError' |           $ref: '#/components/schemas/ValidationError' | ||||||
|         '403': |         '403': | ||||||
|           $ref: '#/components/schemas/GenericError' |           $ref: '#/components/schemas/GenericError' | ||||||
|  |   /authenticators/all/: | ||||||
|  |     get: | ||||||
|  |       operationId: authenticators_all_list | ||||||
|  |       description: Get all devices for current user | ||||||
|  |       tags: | ||||||
|  |       - authenticators | ||||||
|  |       security: | ||||||
|  |       - authentik: [] | ||||||
|  |       responses: | ||||||
|  |         '200': | ||||||
|  |           content: | ||||||
|  |             application/json: | ||||||
|  |               schema: | ||||||
|  |                 type: array | ||||||
|  |                 items: | ||||||
|  |                   $ref: '#/components/schemas/Device' | ||||||
|  |           description: '' | ||||||
|  |         '400': | ||||||
|  |           $ref: '#/components/schemas/ValidationError' | ||||||
|  |         '403': | ||||||
|  |           $ref: '#/components/schemas/GenericError' | ||||||
|   /authenticators/duo/: |   /authenticators/duo/: | ||||||
|     get: |     get: | ||||||
|       operationId: authenticators_duo_list |       operationId: authenticators_duo_list | ||||||
| @ -20169,6 +20190,29 @@ components: | |||||||
|             $ref: '#/components/schemas/FlowRequest' |             $ref: '#/components/schemas/FlowRequest' | ||||||
|       required: |       required: | ||||||
|       - name |       - name | ||||||
|  |     Device: | ||||||
|  |       type: object | ||||||
|  |       description: Serializer for Duo authenticator devices | ||||||
|  |       properties: | ||||||
|  |         verbose_name: | ||||||
|  |           type: string | ||||||
|  |           readOnly: true | ||||||
|  |         verbose_name_plural: | ||||||
|  |           type: string | ||||||
|  |           readOnly: true | ||||||
|  |         pk: | ||||||
|  |           type: integer | ||||||
|  |         name: | ||||||
|  |           type: string | ||||||
|  |         type: | ||||||
|  |           type: string | ||||||
|  |           readOnly: true | ||||||
|  |       required: | ||||||
|  |       - name | ||||||
|  |       - pk | ||||||
|  |       - type | ||||||
|  |       - verbose_name | ||||||
|  |       - verbose_name_plural | ||||||
|     DeviceChallenge: |     DeviceChallenge: | ||||||
|       type: object |       type: object | ||||||
|       description: Single device challenge |       description: Single device challenge | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer