Skip to content

Commit 5d1f439

Browse files
committed
doc: Update example for JWT Verifiable Presentation.
Signed-off-by: Markus Sabadello <[email protected]>
1 parent 3cca186 commit 5d1f439

File tree

2 files changed

+58
-48
lines changed

2 files changed

+58
-48
lines changed

examples-jwt-vp.md

Lines changed: 52 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,61 @@ Verifiable Credentials with JSON Web Tokens:
44

55
### Example Verifiable Presentation
66

7-
eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJ1cm46dXVpZDphZWNkYThmZi1iOTQ4LTRlYmItYTBhZS02NDRiMzFlZjczYzgiLCJpc3MiOiJkaWQ6c292OjIxdERBS0NFUmg5NXVHZ0tiSk5IWXAiLCJpYXQiOjE1NjMxOTU5NzEsIm5iZiI6MTU2MzE5NTk3MSwidnAiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiXSwidHlwZSI6WyJWZXJpZmlhYmxlUHJlc2VudGF0aW9uIl0sInZlcmlmaWFibGVDcmVkZW50aWFsIjpbImV5SmhiR2NpT2lKU1V6STFOaUo5LmV5SnFkR2tpT2lKMWNtNDZkWFZwWkRwaE9EZGlaR1ppT0MxaE4yUm1MVFJpWkRrdFlXVXdaQzFrT0Rnek1UTXpOVE00Wm1VaUxDSnpkV0lpT2lKa2FXUTZjMjkyT2pJeGRFUkJTME5GVW1nNU5YVkhaMHRpU2s1SVdYQWlMQ0pwYzNNaU9pSmthV1E2YzI5Mk9qRjVkbGhpYldkUWIxVnROR1JzTmpaRU4wdG9lVVFpTENKdVltWWlPakUxTmpBM01URTBNVGtzSW1WNGNDSTZNVFUyTURjNU56Z3hPU3dpZG1NaU9uc2lRR052Ym5SbGVIUWlPbHNpYUhSMGNITTZMeTkzZDNjdWR6TXViM0puTHpJd01UZ3ZZM0psWkdWdWRHbGhiSE12ZGpFaUxDSm9kSFJ3Y3pvdkwzUnlZV1pwTG1acEwyTnlaV1JsYm5ScFlXeHpMM1l4SWwwc0luUjVjR1VpT2xzaVZtVnlhV1pwWVdKc1pVTnlaV1JsYm5ScFlXd2lMQ0pFY21sMlpYSnpUR2xqWlc1elpVTnlaV1JsYm5ScFlXd2lYU3dpWTNKbFpHVnVkR2xoYkZOMVltcGxZM1FpT25zaVpISnBkbVZ5YzB4cFkyVnVjMlVpT25zaWJHbGpaVzV6WlVOc1lYTnpJam9pZEhKMVkydHpJbjE5ZlgwLlpkSnhNMGtKYWtLQWZKSTJoM0RodmZfQUhVZ0M4LU55UVJyMkRNbmx6Q3hIWnlWRWppMHM1U2w4Y054NmFQd3dqRGFncDJLSEZ5Nk05ZU9OSHJycGRiNDlBdUtldHlKWlFVb0I1YVFnLXNDNUdNSFBWeWVUeHphemFEV3lzRWlDWlNYYzZHY2lyTERtSFhWV01VaWRLRGxHaDh2ZFV0ckhSMGF5VmJ4clhRLXpLYWtmbHRhUmF3UTRPSVJQSi0wZnNzb2pTRGJSTzZLbnJINk1RYnNsLWZ3VFJjWW5saWhOSUhwTlRFcFQ2OERBM1F6SFUxLVRBWDF4WTNKeDJ2WW9yaWhGZjAybW5uNWQzZ1c0R3YyS3NOYk5wZXdJQW1mTC1wLWFiT0ZObXQyY0x4RlVTTHNnYUU1dXBEdzJ4QUdUYzNsQXh2Yko3R200ZWFMOFNYVFEyQSJdfX0.e-5OGe4zboXBB5csM1is4oJVgsJT_GIcJvwU50gpLQKwva35gMY0ivbfv3WZx03vMMvByaJN-_XYhDKrr9E72nS9VbxDabZUWMqdnlEjK9vKCPjspEIHaOSH-zmXMyS6e1tLibBAhRx1MSr4H9hcOZNA6mSxs0E-J5Ne64ksOOQdf1byZC-v7rUSb37zYWqd8xBMWQ-Bz5p6oshQrRq5ISJEmtY07JIpA2X_A6CITgsnaYX_QNG67S1h0i_zj6iPAywLpLdJmo6EX0gA5yMN9MabhgZNMK2_1mIdWB-I3gcKHrhy9ojnVMlycxVqL-99Yv-SAFQXOxERiNdJIJSeFQ
7+
eyJhbGciOiJFZERTQSJ9.eyJuYmYiOjE2MDI3NjQ4MDEsImlzcyI6ImRpZDpleGFtcGxlOmViZmViMWY3MTJlYmM2ZjFjMjc2ZTEyZWMyMSIsInZwIjp7IkBjb250ZXh0IjoiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJ0eXBlIjoiVmVyaWZpYWJsZVByZXNlbnRhdGlvbiIsInZlcmlmaWFibGVDcmVkZW50aWFsIjoiZXlKaGJHY2lPaUpGWkVSVFFTSjkuZXlKemRXSWlPaUprYVdRNlpYaGhiWEJzWlRwbFltWmxZakZtTnpFeVpXSmpObVl4WXpJM05tVXhNbVZqTWpFaUxDSnVZbVlpT2pFMU5qQTNNVEUwTVRrc0ltbHpjeUk2SW1ScFpEcGxlR0Z0Y0d4bE9qYzJaVEV5WldNM01USmxZbU0yWmpGak1qSXhaV0ptWldJeFppSXNJbVY0Y0NJNk1UVTJNRGM1TnpneE9Td2lkbU1pT25zaVFHTnZiblJsZUhRaU9sc2lhSFIwY0hNNkx5OTNkM2N1ZHpNdWIzSm5Mekl3TVRndlkzSmxaR1Z1ZEdsaGJITXZkakVpTENKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdk1qQXhPQzlqY21Wa1pXNTBhV0ZzY3k5bGVHRnRjR3hsY3k5Mk1TSmRMQ0owZVhCbElqcGJJbFpsY21sbWFXRmliR1ZEY21Wa1pXNTBhV0ZzSWl3aVZXNXBkbVZ5YzJsMGVVUmxaM0psWlVOeVpXUmxiblJwWVd3aVhTd2lZM0psWkdWdWRHbGhiRk4xWW1wbFkzUWlPbnNpWTI5c2JHVm5aU0k2SWxSbGMzUWdWVzVwZG1WeWMybDBlU0lzSW1SbFozSmxaU0k2ZXlKdVlXMWxJam9pUW1GamFHVnNiM0lnYjJZZ1UyTnBaVzVqWlNCaGJtUWdRWEowY3lJc0luUjVjR1VpT2lKQ1lXTm9aV3h2Y2tSbFozSmxaU0o5Zlgwc0ltcDBhU0k2SW1oMGRIQTZMeTlsZUdGdGNHeGxMbVZrZFM5amNtVmtaVzUwYVdGc2N5OHpOek15SW4wLkdEcENPbHhpWjJpc0JRbjE1MWk1UGoyZS1rVWdrTmdfd3p4Q1BBZnhMeHRkT3o0ZnBEaW1nODFtTnczTHNuTzBHNTZBT1R2RDRTdXpTUXlqMWNQM0JnIn0sImlhdCI6MTYwMjc2NDgwMSwianRpIjoidXJuOnV1aWQ6ZWM3NDE1NTYtM2Y2ZS00ODkxLWJlNTQtNzRjMjNmZDkzNjA1In0.kv4Votk1DpFT4Irr-v85W3lorPo9r2p9qwdDrq4kH_veo7qTKtiNhC7BshUwP7zDN5_gD3GTr68OoNks2LoXDw
88

99
JWT Payload:
1010

11-
{
12-
"jti": "urn:uuid:aecda8ff-b948-4ebb-a0ae-644b31ef73c8",
13-
"iss": "did:sov:21tDAKCERh95uGgKbJNHYp",
14-
"iat": 1563195971,
15-
"nbf": 1563195971,
16-
"vp": {
17-
"@context": [
18-
"https://www.w3.org/2018/credentials/v1"
19-
],
20-
"type": [
21-
"VerifiablePresentation"
22-
],
23-
"verifiableCredential": [
24-
"eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJ1cm46dXVpZDphODdiZGZiOC1hN2RmLTRiZDktYWUwZC1kODgzMTMzNTM4ZmUiLCJzdWIiOiJkaWQ6c292OjIxdERBS0NFUmg5NXVHZ0tiSk5IWXAiLCJpc3MiOiJkaWQ6c292OjF5dlhibWdQb1VtNGRsNjZEN0toeUQiLCJuYmYiOjE1NjA3MTE0MTksImV4cCI6MTU2MDc5NzgxOSwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3RyYWZpLmZpL2NyZWRlbnRpYWxzL3YxIl0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJEcml2ZXJzTGljZW5zZUNyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZHJpdmVyc0xpY2Vuc2UiOnsibGljZW5zZUNsYXNzIjoidHJ1Y2tzIn19fX0.ZdJxM0kJakKAfJI2h3Dhvf_AHUgC8-NyQRr2DMnlzCxHZyVEji0s5Sl8cNx6aPwwjDagp2KHFy6M9eONHrrpdb49AuKetyJZQUoB5aQg-sC5GMHPVyeTxzazaDWysEiCZSXc6GcirLDmHXVWMUidKDlGh8vdUtrHR0ayVbxrXQ-zKakfltaRawQ4OIRPJ-0fssojSDbRO6KnrH6MQbsl-fwTRcYnlihNIHpNTEpT68DA3QzHU1-TAX1xY3Jx2vYorihFf02mnn5d3gW4Gv2KsNbNpewIAmfL-p-abOFNmt2cLxFUSLsgaE5upDw2xAGTc3lAxvbJ7Gm4eaL8SXTQ2A"
25-
]
26-
}
27-
}
11+
{
12+
"nbf": 1602764801,
13+
"iss": "did:example:ebfeb1f712ebc6f1c276e12ec21",
14+
"vp": {
15+
"@context": "https://www.w3.org/2018/credentials/v1",
16+
"type": "VerifiablePresentation",
17+
"verifiableCredential": [
18+
"eyJhbGciOiJFZERTQSJ9.eyJzdWIiOiJkaWQ6ZXhhbXBsZTplYmZlYjFmNzEyZWJjNmYxYzI3NmUxMmVjMjEiLCJuYmYiOjE1NjA3MTE0MTksImlzcyI6ImRpZDpleGFtcGxlOjc2ZTEyZWM3MTJlYmM2ZjFjMjIxZWJmZWIxZiIsImV4cCI6MTU2MDc5NzgxOSwidmMiOnsiQGNvbnRleHQiOlsiaHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMvdjEiLCJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy9leGFtcGxlcy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVW5pdmVyc2l0eURlZ3JlZUNyZWRlbnRpYWwiXSwiY3JlZGVudGlhbFN1YmplY3QiOnsiY29sbGVnZSI6IlRlc3QgVW5pdmVyc2l0eSIsImRlZ3JlZSI6eyJuYW1lIjoiQmFjaGVsb3Igb2YgU2NpZW5jZSBhbmQgQXJ0cyIsInR5cGUiOiJCYWNoZWxvckRlZ3JlZSJ9fX0sImp0aSI6Imh0dHA6Ly9leGFtcGxlLmVkdS9jcmVkZW50aWFscy8zNzMyIn0.GDpCOlxiZ2isBQn151i5Pj2e-kUgkNg_wzxCPAfxLxtdOz4fpDimg81mNw3LsnO0G56AOTvD4SuzSQyj1cP3Bg"
19+
]
20+
},
21+
"iat": 1602764801,
22+
"jti": "urn:uuid:ec741556-3f6e-4891-be54-74c23fd93605"
23+
}
2824

2925
### Example code (signing)
3026

31-
VerifiableCredential verifiableCredential = new VerifiableCredential();
32-
verifiableCredential.getContext().add("https://trafi.fi/credentials/v1");
33-
verifiableCredential.getType().add("DriversLicenseCredential");
34-
verifiableCredential.setId("urn:uuid:a87bdfb8-a7df-4bd9-ae0d-d883133538fe");
35-
verifiableCredential.setIssuer("did:sov:1yvXbmgPoUm4dl66D7KhyD");
36-
verifiableCredential.setIssuanceDate(VerifiableCredential.DATE_FORMAT.parse("2019-06-16T18:56:59Z"));
37-
verifiableCredential.setExpirationDate(VerifiableCredential.DATE_FORMAT.parse("2019-06-17T18:56:59Z"));
38-
39-
verifiableCredential.setCredentialSubject("did:sov:21tDAKCERh95uGgKbJNHYp");
40-
LinkedHashMap<String, Object> jsonLdCredentialSubject = verifiableCredential.getJsonLdCredentialSubject();
41-
LinkedHashMap<String, Object> jsonLdDriversLicense = new LinkedHashMap<String, Object> ();
42-
jsonLdDriversLicense.put("licenseClass", "trucks");
43-
jsonLdCredentialSubject.put("driversLicense", jsonLdDriversLicense);
44-
45-
JwtVerifiableCredential jwtVerifiableCredential = JwtVerifiableCredential.fromVerifiableCredential(verifiableCredential);
46-
47-
String jwtString1 = jwtVerifiableCredential.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, TestUtil.testRSAPrivateKey);
48-
System.out.println(jwtString1);
49-
50-
String jwtPayload1 = jwtVerifiableCredential.getPayload().toJson();
51-
System.out.println(jwtPayload1);
52-
53-
JwtVerifiablePresentation jwtVerifiablePresentation = JwtVerifiablePresentation.fromJwtVerifiableCredential(jwtVerifiableCredential);
54-
String jwtPayload2 = jwtVerifiablePresentation.getPayload().toJson();
55-
System.out.println(jwtPayload2);
56-
57-
String jwtString2 = jwtVerifiablePresentation.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, TestUtil.testRSAPrivateKey);
58-
System.out.println(jwtString2);
27+
Map<String, Object> claims = new LinkedHashMap<>();
28+
Map<String, Object> degree = new LinkedHashMap<String, Object>();
29+
degree.put("name", "Bachelor of Science and Arts");
30+
degree.put("type", "BachelorDegree");
31+
claims.put("college", "Test University");
32+
claims.put("degree", degree);
33+
34+
CredentialSubject credentialSubject = CredentialSubject.builder()
35+
.id(URI.create("did:example:ebfeb1f712ebc6f1c276e12ec21"))
36+
.claims(claims)
37+
.build();
38+
39+
VerifiableCredential verifiableCredential = VerifiableCredential.builder()
40+
.context(VerifiableCredentialContexts.JSONLD_CONTEXT_W3C_2018_CREDENTIALS_EXAMPLES_V1)
41+
.type("UniversityDegreeCredential")
42+
.id(URI.create("http://example.edu/credentials/3732"))
43+
.issuer(URI.create("did:example:76e12ec712ebc6f1c221ebfeb1f"))
44+
.issuanceDate(JsonLDUtils.stringToDate("2019-06-16T18:56:59Z"))
45+
.expirationDate(JsonLDUtils.stringToDate("2019-06-17T18:56:59Z"))
46+
.credentialSubject(credentialSubject)
47+
.build();
48+
49+
byte[] testEd25519PrivateKey = Hex.decodeHex("984b589e121040156838303f107e13150be4a80fc5088ccba0b0bdc9b1d89090de8777a28f8da1a74e7a13090ed974d879bf692d001cddee16e4cc9f84b60580".toCharArray());
50+
51+
JwtVerifiableCredential jwtVerifiableCredential = ToJwtConverter.toJwtVerifiableCredential(verifiableCredential);
52+
53+
String jwtPayload = jwtVerifiableCredential.getPayload().toString();
54+
System.out.println(jwtPayload);
55+
56+
String jwtString = jwtVerifiableCredential.sign_Ed25519_EdDSA(testEd25519PrivateKey);
57+
System.out.println(jwtString);
58+
59+
JwtVerifiablePresentation jwtVerifiablePresentation = JwtVerifiablePresentation.fromJwtVerifiableCredential(jwtVerifiableCredential);
60+
String jwtPayload2 = jwtVerifiablePresentation.getPayload().toString();
61+
System.out.println(jwtPayload2);
62+
63+
String jwtString2 = jwtVerifiablePresentation.sign_Ed25519_EdDSA(testEd25519PrivateKey);
64+
System.out.println(jwtString2);

src/main/java/com/danubetech/verifiablecredentials/jwt/FromJwtConverter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
import com.danubetech.verifiablecredentials.CredentialSubject;
44
import com.danubetech.verifiablecredentials.VerifiableCredential;
55
import com.danubetech.verifiablecredentials.VerifiablePresentation;
6+
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
67
import com.nimbusds.jwt.JWTClaimsSet;
8+
import foundation.identity.jsonld.JsonLDUtils;
79

810
import java.net.URI;
11+
import java.util.Collections;
912
import java.util.Date;
1013

1114
public class FromJwtConverter {
@@ -63,12 +66,13 @@ public static VerifiableCredential fromJwtVerifiableCredential(JwtVerifiableCred
6366

6467
public static VerifiablePresentation fromJwtVerifiableCredentialToVerifiablePresentation(JwtVerifiableCredential jwtVerifiableCredential) {
6568

66-
VerifiableCredential verifiableCredential = VerifiableCredential.fromJson(jwtVerifiableCredential.getCompactSerialization());
69+
String jwtVerifiableCredentialCompactSerialization = jwtVerifiableCredential.getCompactSerialization();
6770

6871
VerifiablePresentation verifiablePresentation = VerifiablePresentation.builder()
69-
.verifiableCredential(verifiableCredential)
7072
.build();
7173

74+
JsonLDUtils.jsonLdAddList(verifiablePresentation, VerifiableCredentialKeywords.JSONLD_TERM_VERIFIABLECREDENTIAL, Collections.singletonList(jwtVerifiableCredentialCompactSerialization));
75+
7276
return verifiablePresentation;
7377
}
7478
}

0 commit comments

Comments
 (0)