@sphereon/oid4vci-client 0.12.1-next.21 → 0.12.1-next.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/AccessTokenClient.d.ts.map +1 -1
  2. package/dist/AccessTokenClient.js +5 -3
  3. package/dist/AccessTokenClient.js.map +1 -1
  4. package/dist/AccessTokenClientV1_0_11.d.ts.map +1 -1
  5. package/dist/AccessTokenClientV1_0_11.js +5 -4
  6. package/dist/AccessTokenClientV1_0_11.js.map +1 -1
  7. package/dist/AuthorizationCodeClient.js +2 -2
  8. package/dist/OpenID4VCIClient.d.ts.map +1 -1
  9. package/dist/OpenID4VCIClient.js +11 -5
  10. package/dist/OpenID4VCIClient.js.map +1 -1
  11. package/dist/OpenID4VCIClientV1_0_11.d.ts +1 -1
  12. package/dist/OpenID4VCIClientV1_0_11.d.ts.map +1 -1
  13. package/dist/OpenID4VCIClientV1_0_11.js +14 -7
  14. package/dist/OpenID4VCIClientV1_0_11.js.map +1 -1
  15. package/dist/OpenID4VCIClientV1_0_13.d.ts.map +1 -1
  16. package/dist/OpenID4VCIClientV1_0_13.js +11 -6
  17. package/dist/OpenID4VCIClientV1_0_13.js.map +1 -1
  18. package/dist/ProofOfPossessionBuilder.js +6 -6
  19. package/dist/ProofOfPossessionBuilder.js.map +1 -1
  20. package/dist/functions/AccessTokenUtil.d.ts.map +1 -1
  21. package/dist/functions/AccessTokenUtil.js +20 -16
  22. package/dist/functions/AccessTokenUtil.js.map +1 -1
  23. package/lib/AccessTokenClient.ts +3 -1
  24. package/lib/AccessTokenClientV1_0_11.ts +2 -1
  25. package/lib/AuthorizationCodeClient.ts +2 -2
  26. package/lib/OpenID4VCIClient.ts +8 -2
  27. package/lib/OpenID4VCIClientV1_0_11.ts +14 -5
  28. package/lib/OpenID4VCIClientV1_0_13.ts +12 -5
  29. package/lib/ProofOfPossessionBuilder.ts +6 -6
  30. package/lib/__tests__/CredentialRequestClient.spec.ts +8 -8
  31. package/lib/__tests__/CredentialRequestClientBuilder.spec.ts +1 -1
  32. package/lib/__tests__/CredentialRequestClientV1_0_11.spec.ts +7 -7
  33. package/lib/__tests__/ProofOfPossessionBuilder.spec.ts +23 -23
  34. package/lib/__tests__/SdJwt.spec.ts +26 -26
  35. package/lib/__tests__/data/VciDataFixtures.ts +6 -6
  36. package/lib/functions/AccessTokenUtil.ts +17 -14
  37. package/package.json +3 -3
@@ -8,12 +8,12 @@ import { ProofOfPossessionBuilder } from '..';
8
8
  import { IDENTIPROOF_ISSUER_URL } from './MetadataMocks';
9
9
 
10
10
  const jwt: Jwt = {
11
- header: { alg: Alg.ES256, kid: 'did:example:ebfeb1f712ebc6f1c276e12ec21/keys/1', typ: 'jwt' },
11
+ header: { alg: Alg.ES256, kid: 'did:example:ebfeb1f712ebc6f1c276e12ec21/keys/1', typ: 'JWT' },
12
12
  payload: { iss: 'sphereon:wallet', nonce: 'tZignsnFbp', jti: 'tZignsnFbp223', aud: IDENTIPROOF_ISSUER_URL, iat: Date.now() / 1000 },
13
13
  };
14
14
 
15
15
  const jwt_withoutDid: Jwt = {
16
- header: { alg: Alg.ES256, kid: 'ebfeb1f712ebc6f1c276e12ec21/keys/1', typ: 'jwt' },
16
+ header: { alg: Alg.ES256, kid: 'ebfeb1f712ebc6f1c276e12ec21/keys/1', typ: 'JWT' },
17
17
  payload: { iss: 'sphereon:wallet', nonce: 'tZignsnFbp', jti: 'tZignsnFbp223', aud: IDENTIPROOF_ISSUER_URL, iat: Date.now() / 1000 },
18
18
  };
19
19
 
@@ -62,10 +62,10 @@ describe('ProofOfPossession Builder ', () => {
62
62
  it('should fail without supplied proof or callbacks and with kid without did', async function () {
63
63
  await expect(
64
64
  ProofOfPossessionBuilder.fromProof(undefined as never, OpenId4VCIVersion.VER_1_0_13)
65
- .withIssuer(IDENTIPROOF_ISSUER_URL)
66
- .withClientId('sphereon:wallet')
67
- .withKid(kid_withoutDid)
68
- .build(),
65
+ .withIssuer(IDENTIPROOF_ISSUER_URL)
66
+ .withClientId('sphereon:wallet')
67
+ .withKid(kid_withoutDid)
68
+ .build(),
69
69
  ).rejects.toThrow(Error(PROOF_CANT_BE_CONSTRUCTED));
70
70
  });
71
71
 
@@ -87,11 +87,11 @@ describe('ProofOfPossession Builder ', () => {
87
87
  callbacks: { signCallback: proofOfPossessionCallbackFunction },
88
88
  version: OpenId4VCIVersion.VER_1_0_08,
89
89
  })
90
- .withJwt(undefined as never)
91
- .withIssuer(IDENTIPROOF_ISSUER_URL)
92
- .withClientId('sphereon:wallet')
93
- .withKid(kid_withoutDid)
94
- .build(),
90
+ .withJwt(undefined as never)
91
+ .withIssuer(IDENTIPROOF_ISSUER_URL)
92
+ .withClientId('sphereon:wallet')
93
+ .withKid(kid_withoutDid)
94
+ .build(),
95
95
  ).toThrow(Error(NO_JWT_PROVIDED));
96
96
  });
97
97
 
@@ -118,10 +118,10 @@ describe('ProofOfPossession Builder ', () => {
118
118
  },
119
119
  version: OpenId4VCIVersion.VER_1_0_08,
120
120
  })
121
- .withIssuer(IDENTIPROOF_ISSUER_URL)
122
- .withKid(kid_withoutDid)
123
- .withClientId('sphereon:wallet')
124
- .build();
121
+ .withIssuer(IDENTIPROOF_ISSUER_URL)
122
+ .withKid(kid_withoutDid)
123
+ .withClientId('sphereon:wallet')
124
+ .build();
125
125
  expect(proof).toBeDefined();
126
126
  });
127
127
 
@@ -152,10 +152,10 @@ describe('ProofOfPossession Builder ', () => {
152
152
  callbacks: { signCallback: proofOfPossessionCallbackFunction },
153
153
  version: OpenId4VCIVersion.VER_1_0_08,
154
154
  })
155
- .withIssuer(IDENTIPROOF_ISSUER_URL)
156
- .withClientId('sphereon:wallet')
157
- .withKid(kid_withoutDid)
158
- .build(),
155
+ .withIssuer(IDENTIPROOF_ISSUER_URL)
156
+ .withClientId('sphereon:wallet')
157
+ .withKid(kid_withoutDid)
158
+ .build(),
159
159
  ).rejects.toThrow(Error(JWS_NOT_VALID));
160
160
  });
161
161
 
@@ -186,10 +186,10 @@ describe('ProofOfPossession Builder ', () => {
186
186
  callbacks: { signCallback: proofOfPossessionCallbackFunction },
187
187
  version: OpenId4VCIVersion.VER_1_0_08,
188
188
  })
189
- .withIssuer(IDENTIPROOF_ISSUER_URL)
190
- .withClientId('sphereon:wallet')
191
- .withKid(kid_withoutDid)
192
- .build(),
189
+ .withIssuer(IDENTIPROOF_ISSUER_URL)
190
+ .withClientId('sphereon:wallet')
191
+ .withKid(kid_withoutDid)
192
+ .build(),
193
193
  ).rejects.toThrow(Error(JWS_NOT_VALID));
194
194
  });
195
195
  });
@@ -215,37 +215,37 @@ describe('sd-jwt vc', () => {
215
215
  const offered = supported['SdJwtCredentialId'] as CredentialSupportedSdJwtVc;
216
216
 
217
217
  nock(issuerMetadata.token_endpoint as string)
218
- .post('/')
219
- .reply(200, async (_, body: string) => {
220
- const parsedBody = Object.fromEntries(body.split('&').map((x) => x.split('=')));
221
- return createAccessTokenResponse(parsedBody as AccessTokenRequest, {
222
- credentialOfferSessions: vcIssuer.credentialOfferSessions,
223
- accessTokenIssuer: 'https://issuer.example.com',
224
- cNonces: vcIssuer.cNonces,
225
- cNonce: 'a-c-nonce',
226
- accessTokenSignerCallback: async () => 'ey.val.ue',
227
- tokenExpiresIn: 500,
218
+ .post('/')
219
+ .reply(200, async (_, body: string) => {
220
+ const parsedBody = Object.fromEntries(body.split('&').map((x) => x.split('=')));
221
+ return createAccessTokenResponse(parsedBody as AccessTokenRequest, {
222
+ credentialOfferSessions: vcIssuer.credentialOfferSessions,
223
+ accessTokenIssuer: 'https://issuer.example.com',
224
+ cNonces: vcIssuer.cNonces,
225
+ cNonce: 'a-c-nonce',
226
+ accessTokenSignerCallback: async () => 'ey.val.ue',
227
+ tokenExpiresIn: 500,
228
+ });
228
229
  });
229
- });
230
230
 
231
231
  await client.acquireAccessToken({ pin: '123' });
232
232
  nock(issuerMetadata.credential_endpoint as string)
233
- .post('/')
234
- .reply(200, async (_, body) =>
235
- vcIssuer.issueCredential({
236
- credentialRequest: { ...(body as CredentialRequestV1_0_13), credential_identifier: offered.vct },
237
- credential: {
238
- vct: 'Hello',
239
- iss: 'example.com',
240
- iat: 123,
241
- // Defines what can be disclosed (optional)
242
- __disclosureFrame: {
243
- name: true,
233
+ .post('/')
234
+ .reply(200, async (_, body) =>
235
+ vcIssuer.issueCredential({
236
+ credentialRequest: { ...(body as CredentialRequestV1_0_13), credential_identifier: offered.vct },
237
+ credential: {
238
+ vct: 'Hello',
239
+ iss: 'example.com',
240
+ iat: 123,
241
+ // Defines what can be disclosed (optional)
242
+ __disclosureFrame: {
243
+ name: true,
244
+ },
244
245
  },
245
- },
246
- newCNonce: 'new-c-nonce',
247
- }),
248
- );
246
+ newCNonce: 'new-c-nonce',
247
+ }),
248
+ );
249
249
 
250
250
  const credentials = await client.acquireCredentials({
251
251
  credentialIdentifier: offered.vct,
@@ -51,7 +51,7 @@ export interface IssuerMockData {
51
51
  type?: string;
52
52
  format: 'jwt_vc' | 'ldp_vc' | 'jwt_vc_json-ld' | string;
53
53
  proof: {
54
- proof_type: 'jwt' | string;
54
+ proof_type: 'JWT' | string;
55
55
  jwt: string;
56
56
  };
57
57
  };
@@ -119,7 +119,7 @@ const mockData: VciMockDataStructure = {
119
119
  type: 'OpenBadgeCredential',
120
120
  format: 'jwt_vc',
121
121
  proof: {
122
- proof_type: 'jwt',
122
+ proof_type: 'JWT',
123
123
  jwt: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lKclpuVmpTa0V0VEhKck9VWjBPRmx5TFVkMlQzSmpia3N3YjNkc2RqUlhNblUwU3pJeFNHZHZTVlIzSWl3aWVTSTZJalozY0ZCUE1rOUNRVXBTU0ZFMVRXdEtXVlJaV0dsQlJFUXdOMU5OTlV0amVXcDNYMkUzVUUxWmVGa2lmUSMwIn0.eyJhdWQiOiJodHRwczovL25naS1vaWRjNHZjaS10ZXN0LnNwcnVjZWlkLnh5eiIsImlhdCI6MTY4MTkxMTA2MC45NDIsImV4cCI6MTY4MTkxMTcyMC45NDIsImlzcyI6InNwaGVyZW9uOnNzaS13YWxsZXQiLCJqdGkiOiJhNjA4MzMxZi02ZmE0LTQ0ZjAtYWNkZWY5NmFjMjdmNmQ3MCJ9.NwF3_41gwnlIdd_6Uk9CczeQHzIQt6UcvTT5Cxv72j9S1vNwiY9annA2kLsjsTiR5-WMBdUhJCO7wYCtZ15mxw',
124
124
  },
125
125
  },
@@ -365,7 +365,7 @@ const mockData: VciMockDataStructure = {
365
365
  types: ['OpenBadgeCredential'],
366
366
  format: 'jwt_vc',
367
367
  proof: {
368
- proof_type: 'jwt',
368
+ proof_type: 'JWT',
369
369
  jwt: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lKclpuVmpTa0V0VEhKck9VWjBPRmx5TFVkMlQzSmpia3N3YjNkc2RqUlhNblUwU3pJeFNHZHZTVlIzSWl3aWVTSTZJalozY0ZCUE1rOUNRVXBTU0ZFMVRXdEtXVlJaV0dsQlJFUXdOMU5OTlV0amVXcDNYMkUzVUUxWmVGa2lmUSMwIn0.eyJhdWQiOiJodHRwczovL2pmZi53YWx0LmlkL2lzc3Vlci1hcGkvZGVmYXVsdC9vaWRjLyIsImlhdCI6MTY4MTkxMTk0Mi4yMzgsImV4cCI6MTY4MTkxMjYwMi4yMzgsIm5vbmNlIjoiZjA2YTMxMDUtYTJlZC00NGZjLTk1NGItNGEyNTk3MDM0OTNiIiwiaXNzIjoic3BoZXJlb246c3NpLXdhbGxldCIsImp0aSI6IjA1OWM3ODA5LTlmOGYtNGE3ZS1hZDI4YTNhMTNhMGIzNmViIn0.RfiWyybxpe3nkx3b0yIsqDHQtvB1WwhDW4t0X-kijy2dsSfv2cYhSEmAzs1shg7OV4EW8fSzt_Te79xiVl6jCw',
370
370
  },
371
371
  },
@@ -483,7 +483,7 @@ const mockData: VciMockDataStructure = {
483
483
  types: ['OpenBadgeCredential'],
484
484
  format: 'jwt_vc',
485
485
  proof: {
486
- proof_type: 'jwt',
486
+ proof_type: 'JWT',
487
487
  jwt: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6andrOmV5SmhiR2NpT2lKRlV6STFOa3NpTENKMWMyVWlPaUp6YVdjaUxDSnJkSGtpT2lKRlF5SXNJbU55ZGlJNkluTmxZM0F5TlRack1TSXNJbmdpT2lKclpuVmpTa0V0VEhKck9VWjBPRmx5TFVkMlQzSmpia3N3YjNkc2RqUlhNblUwU3pJeFNHZHZTVlIzSWl3aWVTSTZJalozY0ZCUE1rOUNRVXBTU0ZFMVRXdEtXVlJaV0dsQlJFUXdOMU5OTlV0amVXcDNYMkUzVUUxWmVGa2lmUSMwIn0.eyJhdWQiOiJodHRwczovL29pZGM0dmMudW5paXNzdWVyLmlvLyIsImlhdCI6MTY4MTkxMjgzNy40MTQsImV4cCI6MTY4MTkxMzQ5Ny40MTQsIm5vbmNlIjoiMzhkMzZmM2ItNzJlMy00ODg2LWI2MGMtMzZiNzcwZDBlNGVhIiwiaXNzIjoic3BoZXJlb246c3NpLXdhbGxldCIsImp0aSI6ImIzYWEyMmFkLWExZTItNDJjOC1iMGI4ZTdjNDgzZDg4M2U4In0.awwIJ0422HSdOsCIe8k7zjxqY6RVaHK2ItUFqbmVjqLXxWt-Mp7cXF84n9HGgC8fgGOKmjlgXdNLr_Jiio_e3g',
488
488
  },
489
489
  },
@@ -582,7 +582,7 @@ const mockData: VciMockDataStructure = {
582
582
  type: 'OpenBadgeCredential',
583
583
  format: 'ldp_vc',
584
584
  proof: {
585
- proof_type: 'jwt',
585
+ proof_type: 'JWT',
586
586
  jwt: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3AxM3N6QUFMVFN0cDV1OGtMcnl5YW5vYWtrVWtFUGZXazdvOHY3dms0RW1KI3o2TWtwMTNzekFBTFRTdHA1dThrTHJ5eWFub2Fra1VrRVBmV2s3bzh2N3ZrNEVtSiJ9.eyJhdWQiOiJodHRwczovL2xhdW5jaHBhZC5tYXR0cmxhYnMuY29tIiwiaWF0IjoxNjgxOTE0NDgyLjUxOSwiZXhwIjoxNjgxOTE1MTQyLjUxOSwiaXNzIjoic3BoZXJlb246c3NpLXdhbGxldCIsImp0aSI6ImI5NDY1ZGE5LTY4OGYtNDdjNi04MjUwNDA0ZGNiOWI5Y2E5In0.uQ8ewOfIjy_1p_Gk6PjeEWccBJnjOca1pwbTWiCAFMQX9wlIsfeUdGtXUoHjH5_PQtpwytodx7WU456_CT9iBQ',
587
587
  },
588
588
  },
@@ -696,7 +696,7 @@ const mockData: VciMockDataStructure = {
696
696
  type: 'OpenBadgeCredential',
697
697
  format: 'ldp_vc',
698
698
  proof: {
699
- proof_type: 'jwt',
699
+ proof_type: 'JWT',
700
700
  jwt: 'eyJ0eXAiOiJKV1QiLCJhbGciOiJFZERTQSIsImtpZCI6ImRpZDprZXk6ejZNa3AxM3N6QUFMVFN0cDV1OGtMcnl5YW5vYWtrVWtFUGZXazdvOHY3dms0RW1KI3o2TWtwMTNzekFBTFRTdHA1dThrTHJ5eWFub2Fra1VrRVBmV2s3bzh2N3ZrNEVtSiJ9.eyJhdWQiOiJodHRwczovL29pZGM0dmMuZGl3YWxhLmlvIiwiaWF0IjoxNjgxOTE1MDk1LjIwMiwiZXhwIjoxNjgxOTE1NzU1LjIwMiwiaXNzIjoic3BoZXJlb246c3NpLXdhbGxldCIsImp0aSI6IjYxN2MwM2EzLTM3MTUtNGJlMy1hYjkxNzM4MTlmYzYxNTYzIn0.KA-cHjecaYp9FSaWHkz5cqtNyhBIVT_0I7cJnpHn03T4UWFvdhjhn8Hpe-BU247enFyWOWJ6v3NQZyZgle7xBA',
701
701
  },
702
702
  },
@@ -9,25 +9,28 @@ export const createJwtBearerClientAssertion = async (
9
9
  version?: OpenId4VCIVersion;
10
10
  },
11
11
  ): Promise<void> => {
12
- const { asOpts } = opts;
12
+ const { asOpts, credentialIssuer } = opts;
13
13
  if (asOpts?.clientOpts?.clientAssertionType === 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer') {
14
- if (!request.client_id) {
15
- throw Error(`Not client_id supplied, but client-assertion jwt-bearer requested.`);
16
- } else if (!asOpts.clientOpts.kid) {
17
- throw Error(`No kid supplied, but client-assertion jwt-bearer requested.`);
18
- } else if (!asOpts.clientOpts.signCallbacks) {
19
- throw Error(`No sign callback supplied, but client-assertion jwt-bearer requested.`);
14
+ const { kid, clientId = request.client_id, signCallbacks, alg } = asOpts.clientOpts;
15
+ if (!clientId) {
16
+ return Promise.reject(Error(`Not client_id supplied, but client-assertion jwt-bearer requested.`));
17
+ } else if (!kid) {
18
+ return Promise.reject(Error(`No kid supplied, but client-assertion jwt-bearer requested.`));
19
+ } else if (typeof signCallbacks !== 'function') {
20
+ return Promise.reject(Error(`No sign callback supplied, but client-assertion jwt-bearer requested.`));
21
+ } else if (!credentialIssuer) {
22
+ return Promise.reject(Error(`No credential issuer supplied, but client-assertion jwt-bearer requested.`));
20
23
  }
21
24
  const jwt: Jwt = {
22
25
  header: {
23
26
  typ: 'JWT',
24
- kid: asOpts.clientOpts.kid,
25
- alg: asOpts.clientOpts.alg ?? 'ES256',
27
+ kid: kid,
28
+ alg: alg ?? 'ES256',
26
29
  },
27
30
  payload: {
28
- iss: request.client_id,
29
- sub: request.client_id,
30
- aud: opts.credentialIssuer,
31
+ iss: clientId,
32
+ sub: clientId,
33
+ aud: credentialIssuer,
31
34
  jti: v4(),
32
35
  exp: Date.now() / 1000 + 60,
33
36
  iat: Date.now() / 1000 - 60,
@@ -35,9 +38,9 @@ export const createJwtBearerClientAssertion = async (
35
38
  };
36
39
  const pop = await ProofOfPossessionBuilder.fromJwt({
37
40
  jwt,
38
- callbacks: asOpts.clientOpts.signCallbacks,
41
+ callbacks: signCallbacks,
39
42
  version: opts.version ?? OpenId4VCIVersion.VER_1_0_13,
40
- mode: 'jwt',
43
+ mode: 'JWT',
41
44
  }).build();
42
45
  request.client_assertion_type = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer';
43
46
  request.client_assertion = pop.jwt;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/oid4vci-client",
3
- "version": "0.12.1-next.21+03caf09",
3
+ "version": "0.12.1-next.23+1ff4e40",
4
4
  "description": "OpenID for Verifiable Credential Issuance (OpenID4VCI) client",
5
5
  "source": "lib/index.ts",
6
6
  "main": "dist/index.js",
@@ -15,7 +15,7 @@
15
15
  "build": "tsc"
16
16
  },
17
17
  "dependencies": {
18
- "@sphereon/oid4vci-common": "0.12.1-next.21+03caf09",
18
+ "@sphereon/oid4vci-common": "0.12.1-next.23+1ff4e40",
19
19
  "@sphereon/ssi-types": "0.25.1-unstable.87",
20
20
  "cross-fetch": "^3.1.8",
21
21
  "debug": "^4.3.4"
@@ -69,5 +69,5 @@
69
69
  "OIDC4VCI",
70
70
  "OID4VCI"
71
71
  ],
72
- "gitHead": "03caf09d9cd0e2c3bfd9d67be0acc820d62968bc"
72
+ "gitHead": "1ff4e40cefb183072951e3ede3f8b3a5842d645a"
73
73
  }