core: include more authenticator details when possible (#15224)

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L.
2025-06-24 23:52:06 +02:00
committed by GitHub
parent d09b7757b6
commit bf4e8dbedc
4 changed files with 36 additions and 16 deletions

View File

@ -1,6 +1,5 @@
"""Authenticator Devices API Views"""
from django.utils.translation import gettext_lazy as _
from drf_spectacular.utils import extend_schema
from guardian.shortcuts import get_objects_for_user
from rest_framework.fields import (
@ -23,7 +22,7 @@ from authentik.stages.authenticator_webauthn.models import WebAuthnDevice
class DeviceSerializer(MetaNameSerializer):
"""Serializer for Duo authenticator devices"""
"""Serializer for authenticator devices"""
pk = CharField()
name = CharField()
@ -33,22 +32,27 @@ class DeviceSerializer(MetaNameSerializer):
last_updated = DateTimeField(read_only=True)
last_used = DateTimeField(read_only=True, allow_null=True)
extra_description = SerializerMethodField()
external_id = SerializerMethodField()
def get_type(self, instance: Device) -> str:
"""Get type of device"""
return instance._meta.label
def get_extra_description(self, instance: Device) -> str:
def get_extra_description(self, instance: Device) -> str | None:
"""Get extra description"""
if isinstance(instance, WebAuthnDevice):
return (
instance.device_type.description
if instance.device_type
else _("Extra description not available")
)
return instance.device_type.description if instance.device_type else None
if isinstance(instance, EndpointDevice):
return instance.data.get("deviceSignals", {}).get("deviceModel")
return ""
return None
def get_external_id(self, instance: Device) -> str | None:
"""Get external Device ID"""
if isinstance(instance, WebAuthnDevice):
return instance.device_type.aaguid if instance.device_type else None
if isinstance(instance, EndpointDevice):
return instance.data.get("deviceSignals", {}).get("deviceModel")
return None
class DeviceViewSet(ViewSet):

View File

@ -43953,7 +43953,7 @@ components:
- name
Device:
type: object
description: Serializer for Duo authenticator devices
description: Serializer for authenticator devices
properties:
verbose_name:
type: string
@ -43992,11 +43992,18 @@ components:
nullable: true
extra_description:
type: string
nullable: true
description: Get extra description
readOnly: true
external_id:
type: string
nullable: true
description: Get external Device ID
readOnly: true
required:
- confirmed
- created
- external_id
- extra_description
- last_updated
- last_used

View File

@ -7,7 +7,7 @@ import { PaginatedResponse } from "@goauthentik/elements/table/Table";
import { Table, TableColumn } from "@goauthentik/elements/table/Table";
import { msg, str } from "@lit/localize";
import { TemplateResult, html } from "lit";
import { TemplateResult, html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { AuthenticatorsApi, Device } from "@goauthentik/api";
@ -104,8 +104,11 @@ export class UserDeviceTable extends Table<Device> {
row(item: Device): TemplateResult[] {
return [
html`${item.name}`,
html`${deviceTypeName(item)}
${item.extraDescription ? ` - ${item.extraDescription}` : ""}`,
html`<div>
${deviceTypeName(item)}
${item.extraDescription ? ` - ${item.extraDescription}` : ""}
</div>
${item.externalId ? html` <small>${item.externalId}</small> ` : nothing} `,
html`${item.confirmed ? msg("Yes") : msg("No")}`,
html`${item.created.getTime() > 0
? html`<div>${formatElapsedTime(item.created)}</div>

View File

@ -13,7 +13,7 @@ import "@goauthentik/user/user-settings/mfa/MFADeviceForm";
import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
import { msg, str } from "@lit/localize";
import { TemplateResult, html } from "lit";
import { TemplateResult, html, nothing } from "lit";
import { customElement, property } from "lit/decorators.js";
import { ifDefined } from "lit/directives/if-defined.js";
@ -130,8 +130,14 @@ export class MFADevicesPage extends Table<Device> {
row(item: Device): TemplateResult[] {
return [
html`${item.name}`,
html`${deviceTypeName(item)}
${item.extraDescription ? ` - ${item.extraDescription}` : ""}`,
html`<div>${deviceTypeName(item)}</div>
${item.extraDescription
? html`
<pf-tooltip position="top" content=${item.externalId || ""}>
<small>${item.extraDescription}</small>
</pf-tooltip>
`
: nothing} `,
html`${item.created.getTime() > 0
? html`<div>${formatElapsedTime(item.created)}</div>
<small>${item.created.toLocaleString()}</small>`