@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.32.1-next.54 → 0.33.1-feature.vcdm2.4
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.
- package/dist/index.js +4 -20
- package/dist/index.js.map +1 -1
- package/dist/siop-api-functions.d.ts.map +1 -1
- package/dist/siop-api-functions.js +34 -48
- package/dist/siop-api-functions.js.map +1 -1
- package/dist/siopv2-rp-api-server.d.ts +3 -0
- package/dist/siopv2-rp-api-server.d.ts.map +1 -1
- package/dist/siopv2-rp-api-server.js +50 -26
- package/dist/siopv2-rp-api-server.js.map +1 -1
- package/dist/types/QRCode.types.d.ts +204 -0
- package/dist/types/QRCode.types.d.ts.map +1 -0
- package/dist/types/QRCode.types.js +2 -0
- package/dist/types/QRCode.types.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/{types.d.ts → types/types.d.ts} +5 -1
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/webapp-api-functions.d.ts +1 -0
- package/dist/webapp-api-functions.d.ts.map +1 -1
- package/dist/webapp-api-functions.js +95 -73
- package/dist/webapp-api-functions.js.map +1 -1
- package/package.json +21 -16
- package/src/siop-api-functions.ts +6 -3
- package/src/siopv2-rp-api-server.ts +42 -3
- package/src/types/QRCode.types.ts +227 -0
- package/src/types/index.ts +2 -0
- package/src/{types.ts → types/types.ts} +5 -1
- package/src/webapp-api-functions.ts +45 -12
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
|
@@ -3,16 +3,19 @@ import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange';
|
|
|
3
3
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
4
4
|
import { IAgentContext, ICredentialVerifier } from '@veramo/core';
|
|
5
5
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager';
|
|
6
|
+
import { QRCodeOpts } from './QRCode.types';
|
|
6
7
|
export type SiopFeatures = 'rp-status' | 'siop';
|
|
7
8
|
export interface ISIOPv2RPRestAPIOpts {
|
|
8
9
|
enableFeatures?: SiopFeatures[];
|
|
9
10
|
endpointOpts?: {
|
|
10
11
|
basePath?: string;
|
|
12
|
+
trustProxy?: boolean | Array<string>;
|
|
11
13
|
globalAuth?: GenericAuthArgs & {
|
|
12
14
|
secureSiopEndpoints?: boolean;
|
|
13
15
|
};
|
|
14
16
|
webappCreateAuthRequest?: ICreateAuthRequestWebappEndpointOpts;
|
|
15
17
|
webappDeleteAuthRequest?: ISingleEndpointOpts;
|
|
18
|
+
webappGetDefinitions?: ISingleEndpointOpts;
|
|
16
19
|
webappAuthStatus?: ISingleEndpointOpts;
|
|
17
20
|
siopVerifyAuthResponse?: ISingleEndpointOpts;
|
|
18
21
|
siopGetAuthRequest?: ISingleEndpointOpts;
|
|
@@ -20,9 +23,10 @@ export interface ISIOPv2RPRestAPIOpts {
|
|
|
20
23
|
}
|
|
21
24
|
export interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpts {
|
|
22
25
|
siopBaseURI?: string;
|
|
26
|
+
qrCodeOpts?: QRCodeOpts;
|
|
23
27
|
webappAuthStatusPath?: string;
|
|
24
28
|
webappBaseURI?: string;
|
|
25
|
-
|
|
29
|
+
responseRedirectURI?: string;
|
|
26
30
|
}
|
|
27
31
|
export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPresentationExchange & IPDManager;
|
|
28
32
|
export type IRequiredContext = IAgentContext<IRequiredPlugins>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,MAAM,CAAA;AAC/C,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,YAAY,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;QACpC,UAAU,CAAC,EAAE,eAAe,GAAG;YAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;QAChE,uBAAuB,CAAC,EAAE,oCAAoC,CAAA;QAC9D,uBAAuB,CAAC,EAAE,mBAAmB,CAAA;QAC7C,oBAAoB,CAAC,EAAE,mBAAmB,CAAA;QAC1C,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;QACtC,sBAAsB,CAAC,EAAE,mBAAmB,CAAA;QAC5C,kBAAkB,CAAC,EAAE,mBAAmB,CAAA;KACzC,CAAA;CACF;AACD,MAAM,WAAW,oCAAqC,SAAQ,mBAAmB;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,SAAS,GAAG,qBAAqB,GAAG,UAAU,CAAA;AACnG,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types/types.ts"],"names":[],"mappings":""}
|
|
@@ -4,4 +4,5 @@ import { ICreateAuthRequestWebappEndpointOpts, IRequiredContext } from './types'
|
|
|
4
4
|
export declare function createAuthRequestWebappEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts): void;
|
|
5
5
|
export declare function authStatusWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
6
6
|
export declare function removeAuthRequestStateWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
7
|
+
export declare function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
7
8
|
//# sourceMappingURL=webapp-api-functions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webapp-api-functions.d.ts","sourceRoot":"","sources":["../src/webapp-api-functions.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,mBAAmB,EAAqB,MAAM,+BAA+B,CAAA;AAGjG,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEnD,OAAO,EAAE,oCAAoC,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAGhF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,oCAAoC,
|
|
1
|
+
{"version":3,"file":"webapp-api-functions.d.ts","sourceRoot":"","sources":["../src/webapp-api-functions.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,mBAAmB,EAAqB,MAAM,+BAA+B,CAAA;AAGjG,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAA;AAEnD,OAAO,EAAE,oCAAoC,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAGhF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,oCAAoC,QAyDrI;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,mBAAmB,QA2E7G;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,mBAAmB,QAoBzH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,mBAAmB,QAe3G"}
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.createAuthRequestWebappEndpoint = createAuthRequestWebappEndpoint;
|
|
16
|
-
exports.authStatusWebappEndpoint = authStatusWebappEndpoint;
|
|
17
|
-
exports.removeAuthRequestStateWebappEndpoint = removeAuthRequestStateWebappEndpoint;
|
|
18
|
-
const did_auth_siop_1 = require("@sphereon/did-auth-siop");
|
|
19
|
-
const ssi_express_support_1 = require("@sphereon/ssi-express-support");
|
|
20
|
-
const ssi_sdk_siopv2_oid4vp_common_1 = require("@sphereon/ssi-sdk.siopv2-oid4vp-common");
|
|
21
|
-
const ssi_sdk_siopv2_oid4vp_rp_auth_1 = require("@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth");
|
|
22
|
-
const short_uuid_1 = __importDefault(require("short-uuid"));
|
|
23
|
-
const ssi_sdk_core_1 = require("@sphereon/ssi-sdk.core");
|
|
24
|
-
function createAuthRequestWebappEndpoint(router, context, opts) {
|
|
25
|
-
var _a;
|
|
26
|
-
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
1
|
+
import { AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop';
|
|
2
|
+
import { checkAuth, sendErrorResponse } from '@sphereon/ssi-express-support';
|
|
3
|
+
import { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common';
|
|
4
|
+
import { VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
5
|
+
import uuid from 'short-uuid';
|
|
6
|
+
import { shaHasher as defaultHasher } from '@sphereon/ssi-sdk.core';
|
|
7
|
+
export function createAuthRequestWebappEndpoint(router, context, opts) {
|
|
8
|
+
if (opts?.enabled === false) {
|
|
27
9
|
console.log(`createAuthRequest Webapp endpoint is disabled`);
|
|
28
10
|
return;
|
|
29
11
|
}
|
|
30
|
-
const path =
|
|
31
|
-
router.post(path,
|
|
32
|
-
var _a;
|
|
12
|
+
const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests';
|
|
13
|
+
router.post(path, checkAuth(opts?.endpoint), async (request, response) => {
|
|
33
14
|
try {
|
|
34
15
|
// if (!request.agent) throw Error('No agent configured')
|
|
35
16
|
const definitionId = request.params.definitionId;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
17
|
+
if (!definitionId) {
|
|
18
|
+
return sendErrorResponse(response, 400, 'No definitionId query parameter provided');
|
|
19
|
+
}
|
|
20
|
+
const state = request.body.state ?? uuid.uuid();
|
|
21
|
+
const correlationId = request.body.correlationId ?? state;
|
|
22
|
+
const qrCodeOpts = request.body.qrCodeOpts ?? opts?.qrCodeOpts;
|
|
23
|
+
const requestByReferenceURI = uriWithBase(`/siop/definitions/${definitionId}/auth-requests/${state}`, {
|
|
24
|
+
baseURI: opts?.siopBaseURI,
|
|
40
25
|
});
|
|
41
|
-
const responseURI =
|
|
42
|
-
|
|
43
|
-
const
|
|
26
|
+
const responseURI = uriWithBase(`/siop/definitions/${definitionId}/auth-responses/${state}`, { baseURI: opts?.siopBaseURI });
|
|
27
|
+
// first version is for backwards compat
|
|
28
|
+
const responseRedirectURI = ('response_redirect_uri' in request.body && request.body.response_redirect_uri) ??
|
|
29
|
+
('responseRedirectURI' in request.body && request.body.responseRedirectURI);
|
|
30
|
+
const authRequestURI = await context.agent.siopCreateAuthRequestURI({
|
|
31
|
+
definitionId,
|
|
44
32
|
correlationId,
|
|
45
|
-
state,
|
|
33
|
+
state,
|
|
34
|
+
nonce: uuid.uuid(),
|
|
35
|
+
requestByReferenceURI,
|
|
36
|
+
responseURIType: 'response_uri',
|
|
37
|
+
responseURI,
|
|
38
|
+
...(responseRedirectURI && { responseRedirectURI }),
|
|
39
|
+
});
|
|
40
|
+
let qrCodeDataUri;
|
|
41
|
+
if (qrCodeOpts) {
|
|
42
|
+
const { AwesomeQR } = await import('awesome-qr');
|
|
43
|
+
const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI });
|
|
44
|
+
qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw()).toString('base64')}`;
|
|
45
|
+
}
|
|
46
46
|
const authRequestBody = {
|
|
47
47
|
correlationId,
|
|
48
|
+
state,
|
|
48
49
|
definitionId,
|
|
49
50
|
authRequestURI,
|
|
50
|
-
authStatusURI: `${
|
|
51
|
+
authStatusURI: `${uriWithBase(opts?.webappAuthStatusPath ?? '/webapp/auth-status', { baseURI: opts?.webappBaseURI })}`,
|
|
52
|
+
...(qrCodeDataUri && { qrCodeDataUri }),
|
|
51
53
|
};
|
|
52
54
|
console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`);
|
|
53
|
-
return response.
|
|
55
|
+
return response.json(authRequestBody);
|
|
54
56
|
}
|
|
55
57
|
catch (error) {
|
|
56
|
-
return
|
|
58
|
+
return sendErrorResponse(response, 500, 'Could not create an authorization request URI', error);
|
|
57
59
|
}
|
|
58
|
-
})
|
|
60
|
+
});
|
|
59
61
|
}
|
|
60
|
-
function authStatusWebappEndpoint(router, context, opts) {
|
|
61
|
-
|
|
62
|
-
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
62
|
+
export function authStatusWebappEndpoint(router, context, opts) {
|
|
63
|
+
if (opts?.enabled === false) {
|
|
63
64
|
console.log(`authStatus Webapp endpoint is disabled`);
|
|
64
65
|
return;
|
|
65
66
|
}
|
|
66
|
-
const path =
|
|
67
|
-
router.post(path,
|
|
68
|
-
var _a;
|
|
67
|
+
const path = opts?.path ?? '/webapp/auth-status';
|
|
68
|
+
router.post(path, checkAuth(opts?.endpoint), async (request, response) => {
|
|
69
69
|
try {
|
|
70
70
|
console.log('Received auth-status request...');
|
|
71
71
|
const correlationId = request.body.correlationId;
|
|
72
72
|
const definitionId = request.body.definitionId;
|
|
73
73
|
const requestState = correlationId && definitionId
|
|
74
|
-
?
|
|
74
|
+
? await context.agent.siopGetAuthRequestState({
|
|
75
75
|
correlationId,
|
|
76
76
|
definitionId,
|
|
77
77
|
errorOnNotFound: false,
|
|
@@ -87,63 +87,85 @@ function authStatusWebappEndpoint(router, context, opts) {
|
|
|
87
87
|
definitionId,
|
|
88
88
|
lastUpdated: requestState ? requestState.lastUpdated : Date.now(),
|
|
89
89
|
};
|
|
90
|
-
return response.
|
|
90
|
+
return response.json(statusBody);
|
|
91
91
|
}
|
|
92
|
-
let includeVerifiedData =
|
|
92
|
+
let includeVerifiedData = VerifiedDataMode.NONE;
|
|
93
93
|
if ('includeVerifiedData' in request.body) {
|
|
94
94
|
includeVerifiedData = request.body.includeVerifiedData;
|
|
95
95
|
}
|
|
96
96
|
let responseState;
|
|
97
97
|
if (requestState.status === 'sent') {
|
|
98
|
-
responseState = (
|
|
98
|
+
responseState = (await context.agent.siopGetAuthResponseState({
|
|
99
99
|
correlationId,
|
|
100
100
|
definitionId,
|
|
101
101
|
includeVerifiedData: includeVerifiedData,
|
|
102
102
|
errorOnNotFound: false,
|
|
103
103
|
}));
|
|
104
104
|
}
|
|
105
|
-
const overallState = responseState
|
|
106
|
-
const statusBody =
|
|
107
|
-
|
|
108
|
-
? {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
105
|
+
const overallState = responseState ?? requestState;
|
|
106
|
+
const statusBody = {
|
|
107
|
+
status: overallState.status,
|
|
108
|
+
...(overallState.error ? { error: overallState.error?.message } : {}),
|
|
109
|
+
correlationId,
|
|
110
|
+
definitionId,
|
|
111
|
+
lastUpdated: overallState.lastUpdated,
|
|
112
|
+
...(responseState && responseState.status === AuthorizationResponseStateStatus.VERIFIED
|
|
113
|
+
? {
|
|
114
|
+
payload: await responseState.response.mergedPayloads({ hasher: defaultHasher }),
|
|
115
|
+
verifiedData: responseState.verifiedData,
|
|
116
|
+
}
|
|
117
|
+
: {}),
|
|
118
|
+
};
|
|
119
|
+
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`);
|
|
114
120
|
if (overallState.status === 'error') {
|
|
115
121
|
response.statusCode = 500;
|
|
116
|
-
return response.
|
|
122
|
+
return response.json(statusBody);
|
|
117
123
|
}
|
|
118
124
|
response.statusCode = 200;
|
|
119
|
-
return response.
|
|
125
|
+
return response.json(statusBody);
|
|
120
126
|
}
|
|
121
127
|
catch (error) {
|
|
122
|
-
return
|
|
128
|
+
return sendErrorResponse(response, 500, error.message, error);
|
|
123
129
|
}
|
|
124
|
-
})
|
|
130
|
+
});
|
|
125
131
|
}
|
|
126
|
-
function removeAuthRequestStateWebappEndpoint(router, context, opts) {
|
|
127
|
-
|
|
128
|
-
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
132
|
+
export function removeAuthRequestStateWebappEndpoint(router, context, opts) {
|
|
133
|
+
if (opts?.enabled === false) {
|
|
129
134
|
console.log(`removeAuthStatus Webapp endpoint is disabled`);
|
|
130
135
|
return;
|
|
131
136
|
}
|
|
132
|
-
const path =
|
|
133
|
-
router.delete(path,
|
|
137
|
+
const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests/:correlationId';
|
|
138
|
+
router.delete(path, checkAuth(opts?.endpoint), async (request, response) => {
|
|
134
139
|
try {
|
|
135
140
|
const correlationId = request.params.correlationId;
|
|
136
141
|
const definitionId = request.params.definitionId;
|
|
137
142
|
if (!correlationId || !definitionId) {
|
|
138
143
|
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`);
|
|
139
|
-
return
|
|
144
|
+
return sendErrorResponse(response, 404, 'No authorization request could be found');
|
|
140
145
|
}
|
|
141
146
|
response.statusCode = 200;
|
|
142
|
-
return response.
|
|
147
|
+
return response.json(await context.agent.siopDeleteAuthState({ definitionId, correlationId }));
|
|
143
148
|
}
|
|
144
149
|
catch (error) {
|
|
145
|
-
return
|
|
150
|
+
return sendErrorResponse(response, 500, error.message, error);
|
|
146
151
|
}
|
|
147
|
-
})
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
export function getDefinitionsEndpoint(router, context, opts) {
|
|
155
|
+
if (opts?.enabled === false) {
|
|
156
|
+
console.log(`getDefinitions Webapp endpoint is disabled`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const path = opts?.path ?? '/webapp/definitions';
|
|
160
|
+
router.get(path, checkAuth(opts?.endpoint), async (request, response) => {
|
|
161
|
+
try {
|
|
162
|
+
const definitions = await context.agent.pdmGetDefinitions();
|
|
163
|
+
response.statusCode = 200;
|
|
164
|
+
return response.json(definitions);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return sendErrorResponse(response, 500, error.message, error);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
148
170
|
}
|
|
149
171
|
//# sourceMappingURL=webapp-api-functions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webapp-api-functions.js","sourceRoot":"","sources":["../src/webapp-api-functions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webapp-api-functions.js","sourceRoot":"","sources":["../src/webapp-api-functions.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -11,18 +11,19 @@
|
|
|
11
11
|
"start:dev": "ts-node __tests__/RestAPI.ts"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@sphereon/did-auth-siop": "0.
|
|
15
|
-
"@sphereon/ssi-express-support": "0.
|
|
16
|
-
"@sphereon/ssi-sdk.core": "0.
|
|
17
|
-
"@sphereon/ssi-sdk.credential-validation": "0.
|
|
18
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.
|
|
19
|
-
"@sphereon/ssi-sdk.pd-manager": "0.
|
|
20
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.
|
|
21
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.
|
|
22
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.
|
|
23
|
-
"@sphereon/ssi-types": "0.
|
|
14
|
+
"@sphereon/did-auth-siop": "0.17.0",
|
|
15
|
+
"@sphereon/ssi-express-support": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
16
|
+
"@sphereon/ssi-sdk.core": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
17
|
+
"@sphereon/ssi-sdk.credential-validation": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
18
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
19
|
+
"@sphereon/ssi-sdk.pd-manager": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
20
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
21
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
22
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
23
|
+
"@sphereon/ssi-types": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
24
24
|
"@veramo/core": "4.2.0",
|
|
25
25
|
"@veramo/credential-w3c": "4.2.0",
|
|
26
|
+
"awesome-qr": "^2.1.5-rc.0",
|
|
26
27
|
"body-parser": "^1.20.2",
|
|
27
28
|
"cookie-parser": "^1.4.6",
|
|
28
29
|
"cors": "^2.8.5",
|
|
@@ -30,16 +31,18 @@
|
|
|
30
31
|
"dotenv-flow": "^3.3.0",
|
|
31
32
|
"express": "^4.19.2",
|
|
32
33
|
"short-uuid": "^4.2.2",
|
|
34
|
+
"swagger-ui-express": "^5.0.1",
|
|
33
35
|
"uuid": "^9.0.1"
|
|
34
36
|
},
|
|
35
37
|
"devDependencies": {
|
|
36
38
|
"@decentralized-identity/ion-sdk": "^0.6.0",
|
|
39
|
+
"@sphereon/did-auth-siop-adapter": "0.17.0",
|
|
37
40
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
38
41
|
"@sphereon/pex": "5.0.0-unstable.28",
|
|
39
42
|
"@sphereon/pex-models": "^2.3.2",
|
|
40
|
-
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.
|
|
41
|
-
"@sphereon/ssi-sdk.data-store": "0.
|
|
42
|
-
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.
|
|
43
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.28.0",
|
|
44
|
+
"@sphereon/ssi-sdk.data-store": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
45
|
+
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.33.1-feature.vcdm2.4+9f634bdb",
|
|
43
46
|
"@types/body-parser": "^1.19.5",
|
|
44
47
|
"@types/cookie-parser": "^1.4.7",
|
|
45
48
|
"@types/cors": "^2.8.17",
|
|
@@ -51,6 +54,7 @@
|
|
|
51
54
|
"@types/node": "^20.17.1",
|
|
52
55
|
"@types/passport": "^1.0.16",
|
|
53
56
|
"@types/passport-http-bearer": "^1.0.41",
|
|
57
|
+
"@types/swagger-ui-express": "^4.1.7",
|
|
54
58
|
"@types/uuid": "^9.0.8",
|
|
55
59
|
"@veramo/data-store": "4.2.0",
|
|
56
60
|
"@veramo/did-manager": "4.2.0",
|
|
@@ -62,13 +66,14 @@
|
|
|
62
66
|
"@veramo/key-manager": "4.2.0",
|
|
63
67
|
"@veramo/kms-local": "4.2.0",
|
|
64
68
|
"@veramo/utils": "4.2.0",
|
|
69
|
+
"debug": "^4.4.0",
|
|
65
70
|
"did-resolver": "^4.1.0",
|
|
66
71
|
"morgan": "^1.10.0",
|
|
67
72
|
"nock": "^13.5.4",
|
|
68
73
|
"passport": "^0.6.0",
|
|
69
74
|
"passport-http-bearer": "^1.0.1",
|
|
70
75
|
"ts-node": "^10.9.2",
|
|
71
|
-
"typeorm": "^0.3.
|
|
76
|
+
"typeorm": "^0.3.21"
|
|
72
77
|
},
|
|
73
78
|
"files": [
|
|
74
79
|
".yalc/**/*",
|
|
@@ -98,5 +103,5 @@
|
|
|
98
103
|
"Authenticator"
|
|
99
104
|
],
|
|
100
105
|
"nx": {},
|
|
101
|
-
"gitHead": "
|
|
106
|
+
"gitHead": "9f634bdb714061141e277508c124b08d626f6036"
|
|
102
107
|
}
|
|
@@ -71,7 +71,7 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
71
71
|
const authorizationResponse = parseAuthorizationResponse(request)
|
|
72
72
|
console.log(`URI: ${JSON.stringify(authorizationResponse)}`)
|
|
73
73
|
|
|
74
|
-
const
|
|
74
|
+
const definitionItem = definitionItems[0]
|
|
75
75
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
76
76
|
authorizationResponse,
|
|
77
77
|
correlationId,
|
|
@@ -79,9 +79,10 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
79
79
|
presentationDefinitions: [
|
|
80
80
|
{
|
|
81
81
|
location: opts?.presentationDefinitionLocation ?? PresentationDefinitionLocation.TOPLEVEL_PRESENTATION_DEF,
|
|
82
|
-
definition,
|
|
82
|
+
definition: definitionItem.definitionPayload,
|
|
83
83
|
},
|
|
84
84
|
],
|
|
85
|
+
dcqlQuery: definitionItem.dcqlPayload,
|
|
85
86
|
})
|
|
86
87
|
|
|
87
88
|
const wrappedPresentation = verifiedResponse?.oid4vpSubmission?.presentations[0]
|
|
@@ -91,7 +92,9 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
91
92
|
console.log('PRESENTATION:' + JSON.stringify(wrappedPresentation.presentation, null, 2))
|
|
92
93
|
response.statusCode = 200
|
|
93
94
|
|
|
94
|
-
const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {
|
|
95
|
+
const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {
|
|
96
|
+
presentation_during_issuance_session: verifiedResponse.correlationId,
|
|
97
|
+
}
|
|
95
98
|
if (authorizationResponse.is_first_party) {
|
|
96
99
|
response.setHeader('Content-Type', 'application/json')
|
|
97
100
|
return response.send(JSON.stringify(authorizationChallengeValidationResponse))
|
|
@@ -3,17 +3,25 @@ import { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express
|
|
|
3
3
|
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'
|
|
4
4
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
5
5
|
import { TAgent } from '@veramo/core'
|
|
6
|
-
import express, { Express, Router } from 'express'
|
|
6
|
+
import express, { Express, Request, Response, Router } from 'express'
|
|
7
7
|
import { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'
|
|
8
8
|
import { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
authStatusWebappEndpoint,
|
|
11
|
+
createAuthRequestWebappEndpoint,
|
|
12
|
+
getDefinitionsEndpoint,
|
|
13
|
+
removeAuthRequestStateWebappEndpoint,
|
|
14
|
+
} from './webapp-api-functions'
|
|
15
|
+
import swaggerUi from 'swagger-ui-express'
|
|
10
16
|
|
|
11
17
|
export class SIOPv2RPApiServer {
|
|
12
18
|
private readonly _express: Express
|
|
13
19
|
private readonly _router: Router
|
|
14
20
|
private readonly _agent: TAgent<IPresentationExchange & ISIOPv2RP>
|
|
15
21
|
private readonly _opts?: ISIOPv2RPRestAPIOpts
|
|
22
|
+
private readonly _basePath: string
|
|
16
23
|
|
|
24
|
+
private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'
|
|
17
25
|
constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {
|
|
18
26
|
const { agent, opts } = args
|
|
19
27
|
this._agent = agent
|
|
@@ -35,6 +43,7 @@ export class SIOPv2RPApiServer {
|
|
|
35
43
|
createAuthRequestWebappEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)
|
|
36
44
|
authStatusWebappEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)
|
|
37
45
|
removeAuthRequestStateWebappEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)
|
|
46
|
+
getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)
|
|
38
47
|
}
|
|
39
48
|
|
|
40
49
|
// SIOPv2 endpoints
|
|
@@ -42,9 +51,39 @@ export class SIOPv2RPApiServer {
|
|
|
42
51
|
getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)
|
|
43
52
|
verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)
|
|
44
53
|
}
|
|
45
|
-
this.
|
|
54
|
+
this._basePath = opts?.endpointOpts?.basePath ?? ''
|
|
55
|
+
this._express.use(this._basePath, this.router)
|
|
56
|
+
this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)
|
|
57
|
+
this.setupSwaggerUi()
|
|
46
58
|
}
|
|
47
59
|
|
|
60
|
+
private setupSwaggerUi() {
|
|
61
|
+
fetch(this.OID4VP_SWAGGER_URL)
|
|
62
|
+
.then((res) => res.json())
|
|
63
|
+
.then((swagger) => {
|
|
64
|
+
const apiDocs = `${this._basePath}/api-docs`
|
|
65
|
+
console.log(`[OID4P] API docs available at ${apiDocs}`)
|
|
66
|
+
|
|
67
|
+
this._router.use(
|
|
68
|
+
'/api-docs',
|
|
69
|
+
(req: Request, res: Response, next: any) => {
|
|
70
|
+
const regex = `${apiDocs.replace(/\//, '\/')}`.replace('/oid4vp', '').replace(/\/api-docs.*/, '')
|
|
71
|
+
swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]
|
|
72
|
+
// @ts-ignore
|
|
73
|
+
req.swaggerDoc = swagger
|
|
74
|
+
next()
|
|
75
|
+
},
|
|
76
|
+
swaggerUi.serveFiles(swagger, options),
|
|
77
|
+
swaggerUi.setup(),
|
|
78
|
+
)
|
|
79
|
+
})
|
|
80
|
+
.catch((err) => {
|
|
81
|
+
console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)
|
|
82
|
+
})
|
|
83
|
+
const options = {
|
|
84
|
+
// customCss: '.swagger-ui .topbar { display: none }',
|
|
85
|
+
}
|
|
86
|
+
}
|
|
48
87
|
get express(): Express {
|
|
49
88
|
return this._express
|
|
50
89
|
}
|