[OID4VCI] Support for credentials CRUD (DB and admin REST endpoints)

closes #48546

Signed-off-by: mposolda <mposolda@gmail.com>
This commit is contained in:
mposolda
2026-04-30 11:57:13 +02:00
committed by Marek Posolda
parent 73c878bf34
commit f66ae8ab0b
18 changed files with 843 additions and 0 deletions
@@ -86,6 +86,7 @@ import org.keycloak.models.UserConsentModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserSessionModel;
import org.keycloak.models.UserVerifiableCredentialModel;
import org.keycloak.models.WebAuthnPolicy;
import org.keycloak.models.credential.OTPCredentialModel;
import org.keycloak.models.light.LightweightUserAdapter;
@@ -126,6 +127,7 @@ import org.keycloak.representations.idm.authorization.ResourceOwnerRepresentatio
import org.keycloak.representations.idm.authorization.ResourceRepresentation;
import org.keycloak.representations.idm.authorization.ResourceServerRepresentation;
import org.keycloak.representations.idm.authorization.ScopeRepresentation;
import org.keycloak.representations.idm.oid4vc.UserVerifiableCredentialRepresentation;
import org.keycloak.storage.StorageId;
import org.keycloak.util.JsonSerialization;
import org.keycloak.utils.StringUtil;
@@ -1033,6 +1035,14 @@ public class ModelToRepresentation {
return consentRep;
}
public static UserVerifiableCredentialRepresentation toRepresentation(UserVerifiableCredentialModel model) {
UserVerifiableCredentialRepresentation rep = new UserVerifiableCredentialRepresentation();
rep.setCredentialScopeName(model.getCredentialScopeName());
rep.setRevision(model.getRevision());
rep.setCreatedDate(model.getCreatedDate());
return rep;
}
public static AuthenticationFlowRepresentation toRepresentation(KeycloakSession session, RealmModel realm, AuthenticationFlowModel model) {
AuthenticationFlowRepresentation rep = new AuthenticationFlowRepresentation();
rep.setId(model.getId());
@@ -93,6 +93,7 @@ import org.keycloak.models.UserConsentModel;
import org.keycloak.models.UserCredentialModel;
import org.keycloak.models.UserModel;
import org.keycloak.models.UserProvider;
import org.keycloak.models.UserVerifiableCredentialModel;
import org.keycloak.models.credential.OTPCredentialModel;
import org.keycloak.models.credential.PasswordCredentialModel;
import org.keycloak.models.credential.dto.OTPCredentialData;
@@ -129,6 +130,7 @@ import org.keycloak.representations.idm.authorization.ResourceOwnerRepresentatio
import org.keycloak.representations.idm.authorization.ResourceRepresentation;
import org.keycloak.representations.idm.authorization.ResourceServerRepresentation;
import org.keycloak.representations.idm.authorization.ScopeRepresentation;
import org.keycloak.representations.idm.oid4vc.UserVerifiableCredentialRepresentation;
import org.keycloak.storage.DatastoreProvider;
import org.keycloak.util.JsonSerialization;
import org.keycloak.utils.StringUtil;
@@ -984,6 +986,13 @@ public class RepresentationToModel {
return consentModel;
}
public static UserVerifiableCredentialModel toModel(UserVerifiableCredentialRepresentation rep) {
UserVerifiableCredentialModel verifCredentialModel = new UserVerifiableCredentialModel(rep.getCredentialScopeName());
verifCredentialModel.setRevision(rep.getRevision());
verifCredentialModel.setCreatedDate(rep.getCreatedDate());
return verifCredentialModel;
}
public static AuthenticationFlowModel toModel(AuthenticationFlowRepresentation rep) {
AuthenticationFlowModel model = new AuthenticationFlowModel();
model.setId(rep.getId());