diff --git a/services/src/main/java/org/keycloak/protocol/oid4vc/model/VerifiableCredential.java b/services/src/main/java/org/keycloak/protocol/oid4vc/model/VerifiableCredential.java index 22507b7c804c..57ca589f7a70 100644 --- a/services/src/main/java/org/keycloak/protocol/oid4vc/model/VerifiableCredential.java +++ b/services/src/main/java/org/keycloak/protocol/oid4vc/model/VerifiableCredential.java @@ -38,8 +38,16 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class VerifiableCredential { + public static final String VC_CONTEXT_V1 = "https://www.w3.org/ns/credentials/v1"; + public static final String VC_CONTEXT_V2 = "https://www.w3.org/ns/credentials/v2"; + + /** + * @context: The value of the @context property MUST be an ordered set where the first item is a URL with the + * value https://www.w3.org/ns/credentials/v2. Subsequent items in the ordered set MUST be composed of any + * combination of URLs and/or objects, where each is processable as a JSON-LD Context. + */ @JsonProperty("@context") - private List context; + private List context = new ArrayList<>(List.of(VC_CONTEXT_V1)); private List type = new ArrayList<>(); private URI issuer; private Date issuanceDate; @@ -127,4 +135,4 @@ public VerifiableCredential setAdditionalProperties(Map addition this.additionalProperties = additionalProperties; return this; } -} \ No newline at end of file +} diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/oid4vc/issuance/signing/OID4VCIssuerEndpointTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/oid4vc/issuance/signing/OID4VCIssuerEndpointTest.java index 5caf35ac9179..b4a086952e5b 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/oid4vc/issuance/signing/OID4VCIssuerEndpointTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/oid4vc/issuance/signing/OID4VCIssuerEndpointTest.java @@ -374,6 +374,9 @@ public void testRequestCredential() { assertNotNull("A valid credential string should have been responded", jsonWebToken); assertNotNull("The credentials should be included at the vc-claim.", jsonWebToken.getOtherClaims().get("vc")); VerifiableCredential credential = objectMapper.convertValue(jsonWebToken.getOtherClaims().get("vc"), VerifiableCredential.class); + assertNotNull("@context is a required VC property", credential.getContext()); + assertEquals(1, credential.getContext().size()); + assertEquals(VerifiableCredential.VC_CONTEXT_V1, credential.getContext().get(0)); assertTrue("The static claim should be set.", credential.getCredentialSubject().getClaims().containsKey("VerifiableCredential")); assertFalse("Only mappers supported for the requested type should have been evaluated.", credential.getCredentialSubject().getClaims().containsKey("AnotherCredentialType")); }));