Show transport media for WebAuthn authenticators in Account console

Closes #10063

Signed-off-by: Adham Ahmed Hussein Mahrous <adhamahmad541@gmail.com>
This commit is contained in:
Adham Ahmed Hussein Mahrous 2025-07-17 23:32:47 +03:00 committed by Peter Skopek
parent 50181816b6
commit 0c2226b4c4
2 changed files with 26 additions and 1 deletions

View File

@ -215,4 +215,5 @@ organizationList=List of organizations
domains=Domains
refresh=Refresh
termsAndConditionsDeclined=You need to accept the Terms and Conditions to continue
defaultLocale=Choose...
defaultLocale=Choose...
webauthn-info= Transport media: {{0}}

View File

@ -44,6 +44,7 @@ import org.keycloak.models.UserModel;
import org.keycloak.models.WebAuthnPolicy;
import org.keycloak.models.credential.WebAuthnCredentialModel;
import org.keycloak.models.credential.dto.WebAuthnCredentialData;
import org.keycloak.util.JsonSerialization;
import java.io.IOException;
import java.util.Arrays;
@ -57,6 +58,7 @@ import java.util.stream.Collectors;
public class WebAuthnCredentialProvider implements CredentialProvider<WebAuthnCredentialModel>, CredentialInputValidator {
private static final Logger logger = Logger.getLogger(WebAuthnCredentialProvider.class);
private static final String WEBAUTHN_INFO = "webauthn-info";
private KeycloakSession session;
@ -303,5 +305,27 @@ public class WebAuthnCredentialProvider implements CredentialProvider<WebAuthnCr
protected KeycloakSession getKeycloakSession() {
return session;
}
@Override
public CredentialMetadata getCredentialMetadata(WebAuthnCredentialModel credentialModel, CredentialTypeMetadata credentialTypeMetadata) {
CredentialMetadata credentialMetadata = new CredentialMetadata();
try {
WebAuthnCredentialData credentialData = JsonSerialization.readValue(credentialModel.getCredentialData(), WebAuthnCredentialData.class);
Set<String> transports = credentialData.getTransports();
if (transports != null && !transports.isEmpty()) {
String joinedTransports = String.join(", ", transports);
credentialMetadata.setInfoMessage(WEBAUTHN_INFO, joinedTransports);
}
} catch (
IOException e) {
logger.warn("unable to deserialize model information, skipping messages", e);
}
credentialMetadata.setCredentialModel(credentialModel);
return credentialMetadata;
}
}