@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.32.1-next.18 → 0.32.1-next.287
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/siop-api-functions.d.ts.map +1 -1
- package/dist/siop-api-functions.js +39 -17
- 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 +31 -4
- 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 +3 -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 +19 -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.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 +69 -18
- package/dist/webapp-api-functions.js.map +1 -1
- package/package.json +21 -16
- package/src/siop-api-functions.ts +52 -18
- 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.map +0 -1
- /package/dist/{types.js → types/types.js} +0 -0
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -15,6 +38,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
38
|
exports.createAuthRequestWebappEndpoint = createAuthRequestWebappEndpoint;
|
|
16
39
|
exports.authStatusWebappEndpoint = authStatusWebappEndpoint;
|
|
17
40
|
exports.removeAuthRequestStateWebappEndpoint = removeAuthRequestStateWebappEndpoint;
|
|
41
|
+
exports.getDefinitionsEndpoint = getDefinitionsEndpoint;
|
|
18
42
|
const did_auth_siop_1 = require("@sphereon/did-auth-siop");
|
|
19
43
|
const ssi_express_support_1 = require("@sphereon/ssi-express-support");
|
|
20
44
|
const ssi_sdk_siopv2_oid4vp_common_1 = require("@sphereon/ssi-sdk.siopv2-oid4vp-common");
|
|
@@ -29,28 +53,37 @@ function createAuthRequestWebappEndpoint(router, context, opts) {
|
|
|
29
53
|
}
|
|
30
54
|
const path = (_a = opts === null || opts === void 0 ? void 0 : opts.path) !== null && _a !== void 0 ? _a : '/webapp/definitions/:definitionId/auth-requests';
|
|
31
55
|
router.post(path, (0, ssi_express_support_1.checkAuth)(opts === null || opts === void 0 ? void 0 : opts.endpoint), (request, response) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
-
var _a;
|
|
56
|
+
var _a, _b, _c, _d, _e;
|
|
33
57
|
try {
|
|
34
58
|
// if (!request.agent) throw Error('No agent configured')
|
|
35
59
|
const definitionId = request.params.definitionId;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
60
|
+
if (!definitionId) {
|
|
61
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 400, 'No definitionId query parameter provided');
|
|
62
|
+
}
|
|
63
|
+
const state = (_a = request.body.state) !== null && _a !== void 0 ? _a : short_uuid_1.default.uuid();
|
|
64
|
+
const correlationId = (_b = request.body.correlationId) !== null && _b !== void 0 ? _b : state;
|
|
65
|
+
const qrCodeOpts = (_c = request.body.qrCodeOpts) !== null && _c !== void 0 ? _c : opts === null || opts === void 0 ? void 0 : opts.qrCodeOpts;
|
|
66
|
+
const requestByReferenceURI = (0, ssi_sdk_siopv2_oid4vp_common_1.uriWithBase)(`/siop/definitions/${definitionId}/auth-requests/${state}`, {
|
|
39
67
|
baseURI: opts === null || opts === void 0 ? void 0 : opts.siopBaseURI,
|
|
40
68
|
});
|
|
41
|
-
const responseURI = (0, ssi_sdk_siopv2_oid4vp_common_1.uriWithBase)(`/siop/definitions/${definitionId}/auth-responses/${
|
|
42
|
-
|
|
69
|
+
const responseURI = (0, ssi_sdk_siopv2_oid4vp_common_1.uriWithBase)(`/siop/definitions/${definitionId}/auth-responses/${state}`, { baseURI: opts === null || opts === void 0 ? void 0 : opts.siopBaseURI });
|
|
70
|
+
// first version is for backwards compat
|
|
71
|
+
const responseRedirectURI = (_d = ('response_redirect_uri' in request.body && request.body.response_redirect_uri)) !== null && _d !== void 0 ? _d : ('responseRedirectURI' in request.body && request.body.responseRedirectURI);
|
|
43
72
|
const authRequestURI = yield context.agent.siopCreateAuthRequestURI(Object.assign({ definitionId,
|
|
44
73
|
correlationId,
|
|
45
|
-
state, nonce:
|
|
46
|
-
|
|
47
|
-
|
|
74
|
+
state, nonce: short_uuid_1.default.uuid(), requestByReferenceURI, responseURIType: 'response_uri', responseURI }, (responseRedirectURI && { responseRedirectURI })));
|
|
75
|
+
let qrCodeDataUri;
|
|
76
|
+
if (qrCodeOpts) {
|
|
77
|
+
const { AwesomeQR } = yield Promise.resolve().then(() => __importStar(require('awesome-qr')));
|
|
78
|
+
const qrCode = new AwesomeQR(Object.assign(Object.assign({}, qrCodeOpts), { text: authRequestURI }));
|
|
79
|
+
qrCodeDataUri = `data:image/png;base64,${(yield qrCode.draw()).toString('base64')}`;
|
|
80
|
+
}
|
|
81
|
+
const authRequestBody = Object.assign({ correlationId,
|
|
82
|
+
state,
|
|
48
83
|
definitionId,
|
|
49
|
-
authRequestURI,
|
|
50
|
-
authStatusURI: `${(0, ssi_sdk_siopv2_oid4vp_common_1.uriWithBase)((_a = opts === null || opts === void 0 ? void 0 : opts.webappAuthStatusPath) !== null && _a !== void 0 ? _a : '/webapp/auth-status', { baseURI: opts === null || opts === void 0 ? void 0 : opts.webappBaseURI })}`,
|
|
51
|
-
};
|
|
84
|
+
authRequestURI, authStatusURI: `${(0, ssi_sdk_siopv2_oid4vp_common_1.uriWithBase)((_e = opts === null || opts === void 0 ? void 0 : opts.webappAuthStatusPath) !== null && _e !== void 0 ? _e : '/webapp/auth-status', { baseURI: opts === null || opts === void 0 ? void 0 : opts.webappBaseURI })}` }, (qrCodeDataUri && { qrCodeDataUri }));
|
|
52
85
|
console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`);
|
|
53
|
-
return response.
|
|
86
|
+
return response.json(authRequestBody);
|
|
54
87
|
}
|
|
55
88
|
catch (error) {
|
|
56
89
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, 'Could not create an authorization request URI', error);
|
|
@@ -87,7 +120,7 @@ function authStatusWebappEndpoint(router, context, opts) {
|
|
|
87
120
|
definitionId,
|
|
88
121
|
lastUpdated: requestState ? requestState.lastUpdated : Date.now(),
|
|
89
122
|
};
|
|
90
|
-
return response.
|
|
123
|
+
return response.json(statusBody);
|
|
91
124
|
}
|
|
92
125
|
let includeVerifiedData = ssi_sdk_siopv2_oid4vp_rp_auth_1.VerifiedDataMode.NONE;
|
|
93
126
|
if ('includeVerifiedData' in request.body) {
|
|
@@ -110,13 +143,13 @@ function authStatusWebappEndpoint(router, context, opts) {
|
|
|
110
143
|
verifiedData: responseState.verifiedData,
|
|
111
144
|
}
|
|
112
145
|
: {}));
|
|
113
|
-
console.
|
|
146
|
+
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`);
|
|
114
147
|
if (overallState.status === 'error') {
|
|
115
148
|
response.statusCode = 500;
|
|
116
|
-
return response.
|
|
149
|
+
return response.json(statusBody);
|
|
117
150
|
}
|
|
118
151
|
response.statusCode = 200;
|
|
119
|
-
return response.
|
|
152
|
+
return response.json(statusBody);
|
|
120
153
|
}
|
|
121
154
|
catch (error) {
|
|
122
155
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, error.message, error);
|
|
@@ -139,7 +172,25 @@ function removeAuthRequestStateWebappEndpoint(router, context, opts) {
|
|
|
139
172
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 404, 'No authorization request could be found');
|
|
140
173
|
}
|
|
141
174
|
response.statusCode = 200;
|
|
142
|
-
return response.
|
|
175
|
+
return response.json(yield context.agent.siopDeleteAuthState({ definitionId, correlationId }));
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, error.message, error);
|
|
179
|
+
}
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
function getDefinitionsEndpoint(router, context, opts) {
|
|
183
|
+
var _a;
|
|
184
|
+
if ((opts === null || opts === void 0 ? void 0 : opts.enabled) === false) {
|
|
185
|
+
console.log(`getDefinitions Webapp endpoint is disabled`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const path = (_a = opts === null || opts === void 0 ? void 0 : opts.path) !== null && _a !== void 0 ? _a : '/webapp/definitions';
|
|
189
|
+
router.get(path, (0, ssi_express_support_1.checkAuth)(opts === null || opts === void 0 ? void 0 : opts.endpoint), (request, response) => __awaiter(this, void 0, void 0, function* () {
|
|
190
|
+
try {
|
|
191
|
+
const definitions = yield context.agent.pdmGetDefinitions();
|
|
192
|
+
response.statusCode = 200;
|
|
193
|
+
return response.json(definitions);
|
|
143
194
|
}
|
|
144
195
|
catch (error) {
|
|
145
196
|
return (0, ssi_express_support_1.sendErrorResponse)(response, 500, error.message, error);
|
|
@@ -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.32.1-next.
|
|
3
|
+
"version": "0.32.1-next.287+5f85ee8f",
|
|
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.32.1-next.
|
|
16
|
-
"@sphereon/ssi-sdk.core": "0.32.1-next.
|
|
17
|
-
"@sphereon/ssi-sdk.credential-validation": "0.32.1-next.
|
|
18
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.32.1-next.
|
|
19
|
-
"@sphereon/ssi-sdk.pd-manager": "0.32.1-next.
|
|
20
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.32.1-next.
|
|
21
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.32.1-next.
|
|
22
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.32.1-next.
|
|
23
|
-
"@sphereon/ssi-types": "0.32.1-next.
|
|
14
|
+
"@sphereon/did-auth-siop": "0.17.0",
|
|
15
|
+
"@sphereon/ssi-express-support": "0.32.1-next.287+5f85ee8f",
|
|
16
|
+
"@sphereon/ssi-sdk.core": "0.32.1-next.287+5f85ee8f",
|
|
17
|
+
"@sphereon/ssi-sdk.credential-validation": "0.32.1-next.287+5f85ee8f",
|
|
18
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.32.1-next.287+5f85ee8f",
|
|
19
|
+
"@sphereon/ssi-sdk.pd-manager": "0.32.1-next.287+5f85ee8f",
|
|
20
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.32.1-next.287+5f85ee8f",
|
|
21
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.32.1-next.287+5f85ee8f",
|
|
22
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.32.1-next.287+5f85ee8f",
|
|
23
|
+
"@sphereon/ssi-types": "0.32.1-next.287+5f85ee8f",
|
|
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.32.1-next.
|
|
42
|
-
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.32.1-next.
|
|
43
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.28.0",
|
|
44
|
+
"@sphereon/ssi-sdk.data-store": "0.32.1-next.287+5f85ee8f",
|
|
45
|
+
"@sphereon/ssi-sdk.vc-handler-ld-local": "0.32.1-next.287+5f85ee8f",
|
|
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": "5f85ee8fef1e0fce3d20d150f187b00c7c70f093"
|
|
102
107
|
}
|
|
@@ -1,9 +1,46 @@
|
|
|
1
1
|
import { AuthorizationResponsePayload, PresentationDefinitionLocation } from '@sphereon/did-auth-siop'
|
|
2
2
|
import { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
|
|
3
|
-
import {
|
|
3
|
+
import { CredentialMapper } from '@sphereon/ssi-types'
|
|
4
|
+
import { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
4
5
|
import { Request, Response, Router } from 'express'
|
|
5
6
|
import { IRequiredContext } from './types'
|
|
6
7
|
|
|
8
|
+
const parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {
|
|
9
|
+
const contentType = request.header('content-type')
|
|
10
|
+
|
|
11
|
+
if (contentType === 'application/json') {
|
|
12
|
+
const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body
|
|
13
|
+
return payload as AuthorizationResponsePayload
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (contentType === 'application/x-www-form-urlencoded') {
|
|
17
|
+
const payload = request.body as AuthorizationResponsePayload
|
|
18
|
+
|
|
19
|
+
// Parse presentation_submission if it's a string
|
|
20
|
+
if (typeof payload.presentation_submission === 'string') {
|
|
21
|
+
console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)
|
|
22
|
+
payload.presentation_submission = JSON.parse(payload.presentation_submission)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.
|
|
26
|
+
if (typeof payload.vp_token === 'string') {
|
|
27
|
+
const { vp_token } = payload
|
|
28
|
+
|
|
29
|
+
// The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array
|
|
30
|
+
// (Leaving the vp_token JsonLdAsString causes problems because the original credential will remain string and will be interpreted as JWT in some parts of the code)
|
|
31
|
+
if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {
|
|
32
|
+
payload.vp_token = JSON.parse(vp_token)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return payload
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
7
44
|
export function verifyAuthResponseSIOPv2Endpoint(
|
|
8
45
|
router: Router,
|
|
9
46
|
context: IRequiredContext,
|
|
@@ -31,23 +68,10 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
31
68
|
return response.send()
|
|
32
69
|
}
|
|
33
70
|
|
|
34
|
-
const authorizationResponse =
|
|
35
|
-
typeof request.body === 'string' ? (JSON.parse(request.body) as AuthorizationResponsePayload) : (request.body as AuthorizationResponsePayload)
|
|
36
|
-
if (typeof authorizationResponse.presentation_submission === 'string') {
|
|
37
|
-
console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)
|
|
38
|
-
authorizationResponse.presentation_submission = JSON.parse(authorizationResponse.presentation_submission) as PresentationSubmission
|
|
39
|
-
}
|
|
40
|
-
if (typeof authorizationResponse.vp_token === 'string') {
|
|
41
|
-
// arrays pass as string when using FORM_URL_ENCODED
|
|
42
|
-
if (authorizationResponse.vp_token.startsWith('[') && authorizationResponse.vp_token.endsWith(']')) {
|
|
43
|
-
authorizationResponse.vp_token = JSON.parse(authorizationResponse.vp_token)
|
|
44
|
-
} else {
|
|
45
|
-
authorizationResponse.vp_token = [authorizationResponse.vp_token]
|
|
46
|
-
}
|
|
47
|
-
}
|
|
71
|
+
const authorizationResponse = parseAuthorizationResponse(request)
|
|
48
72
|
console.log(`URI: ${JSON.stringify(authorizationResponse)}`)
|
|
49
73
|
|
|
50
|
-
const
|
|
74
|
+
const definitionItem = definitionItems[0]
|
|
51
75
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
52
76
|
authorizationResponse,
|
|
53
77
|
correlationId,
|
|
@@ -55,9 +79,10 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
55
79
|
presentationDefinitions: [
|
|
56
80
|
{
|
|
57
81
|
location: opts?.presentationDefinitionLocation ?? PresentationDefinitionLocation.TOPLEVEL_PRESENTATION_DEF,
|
|
58
|
-
definition,
|
|
82
|
+
definition: definitionItem.definitionPayload,
|
|
59
83
|
},
|
|
60
84
|
],
|
|
85
|
+
dcqlQuery: definitionItem.dcqlPayload,
|
|
61
86
|
})
|
|
62
87
|
|
|
63
88
|
const wrappedPresentation = verifiedResponse?.oid4vpSubmission?.presentations[0]
|
|
@@ -65,8 +90,17 @@ export function verifyAuthResponseSIOPv2Endpoint(
|
|
|
65
90
|
// const credentialSubject = wrappedPresentation.presentation.verifiableCredential[0]?.credential?.credentialSubject
|
|
66
91
|
// console.log(JSON.stringify(credentialSubject, null, 2))
|
|
67
92
|
console.log('PRESENTATION:' + JSON.stringify(wrappedPresentation.presentation, null, 2))
|
|
68
|
-
const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, definitionId, state: verifiedResponse.state })
|
|
69
93
|
response.statusCode = 200
|
|
94
|
+
|
|
95
|
+
const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {
|
|
96
|
+
presentation_during_issuance_session: verifiedResponse.correlationId,
|
|
97
|
+
}
|
|
98
|
+
if (authorizationResponse.is_first_party) {
|
|
99
|
+
response.setHeader('Content-Type', 'application/json')
|
|
100
|
+
return response.send(JSON.stringify(authorizationChallengeValidationResponse))
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, definitionId, state: verifiedResponse.state })
|
|
70
104
|
if (responseRedirectURI) {
|
|
71
105
|
response.setHeader('Content-Type', 'application/json')
|
|
72
106
|
return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))
|
|
@@ -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
|
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
export interface ComponentOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Component options for data/ECC.
|
|
4
|
+
*/
|
|
5
|
+
data?: {
|
|
6
|
+
/**
|
|
7
|
+
* Scale factor for data/ECC dots.
|
|
8
|
+
* @default 1
|
|
9
|
+
*/
|
|
10
|
+
scale?: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Component options for timing patterns.
|
|
15
|
+
*/
|
|
16
|
+
timing?: {
|
|
17
|
+
/**
|
|
18
|
+
* Scale factor for timing patterns.
|
|
19
|
+
* @default 1
|
|
20
|
+
*/
|
|
21
|
+
scale?: number
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Protector for timing patterns.
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
protectors?: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Component options for alignment patterns.
|
|
32
|
+
*/
|
|
33
|
+
alignment?: {
|
|
34
|
+
/**
|
|
35
|
+
* Scale factor for alignment patterns.
|
|
36
|
+
* @default 1
|
|
37
|
+
*/
|
|
38
|
+
scale?: number
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Protector for alignment patterns.
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
protectors?: boolean
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Component options for alignment pattern on the bottom-right corner.
|
|
49
|
+
*/
|
|
50
|
+
cornerAlignment?: {
|
|
51
|
+
/**
|
|
52
|
+
* Scale factor for alignment pattern on the bottom-right corner.
|
|
53
|
+
* @default 1
|
|
54
|
+
*/
|
|
55
|
+
scale?: number
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Protector for alignment pattern on the bottom-right corner.
|
|
59
|
+
* @default true
|
|
60
|
+
*/
|
|
61
|
+
protectors?: boolean
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface QRCodeOpts {
|
|
66
|
+
/**
|
|
67
|
+
* Size of the QR code in pixel.
|
|
68
|
+
*
|
|
69
|
+
* @defaultValue 400
|
|
70
|
+
*/
|
|
71
|
+
size?: number
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Size of margins around the QR code body in pixel.
|
|
75
|
+
*
|
|
76
|
+
* @defaultValue 20
|
|
77
|
+
*/
|
|
78
|
+
margin?: number
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Error correction level of the QR code.
|
|
82
|
+
*
|
|
83
|
+
* Accepts a value provided by _QRErrorCorrectLevel_.
|
|
84
|
+
*
|
|
85
|
+
* For more information, please refer to [https://www.qrcode.com/en/about/error_correction.html](https://www.qrcode.com/en/about/error_correction.html).
|
|
86
|
+
*
|
|
87
|
+
* @defaultValue 0
|
|
88
|
+
*/
|
|
89
|
+
correctLevel?: number
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* **This is an advanced option.**
|
|
93
|
+
*
|
|
94
|
+
* Specify the mask pattern to be used in QR code encoding.
|
|
95
|
+
*
|
|
96
|
+
* Accepts a value provided by _QRMaskPattern_.
|
|
97
|
+
*
|
|
98
|
+
* To find out all eight mask patterns, please refer to [https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg](https://en.wikipedia.org/wiki/File:QR_Code_Mask_Patterns.svg)
|
|
99
|
+
*
|
|
100
|
+
* For more information, please refer to [https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking](https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Masking).
|
|
101
|
+
*/
|
|
102
|
+
maskPattern?: number
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* **This is an advanced option.**
|
|
106
|
+
*
|
|
107
|
+
* Specify the version to be used in QR code encoding.
|
|
108
|
+
*
|
|
109
|
+
* Accepts an integer in range [1, 40].
|
|
110
|
+
*
|
|
111
|
+
* For more information, please refer to [https://www.qrcode.com/en/about/version.html](https://www.qrcode.com/en/about/version.html).
|
|
112
|
+
*/
|
|
113
|
+
version?: number
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Options to control components in the QR code.
|
|
117
|
+
*
|
|
118
|
+
* @deafultValue undefined
|
|
119
|
+
*/
|
|
120
|
+
components?: ComponentOptions
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Color of the blocks on the QR code.
|
|
124
|
+
*
|
|
125
|
+
* Accepts a CSS <color>.
|
|
126
|
+
*
|
|
127
|
+
* For more information about CSS <color>, please refer to [https://developer.mozilla.org/en-US/docs/Web/CSS/color_value](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).
|
|
128
|
+
*
|
|
129
|
+
* @defaultValue "#000000"
|
|
130
|
+
*/
|
|
131
|
+
colorDark?: string
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Color of the empty areas on the QR code.
|
|
135
|
+
*
|
|
136
|
+
* Accepts a CSS <color>.
|
|
137
|
+
*
|
|
138
|
+
* For more information about CSS <color>, please refer to [https://developer.mozilla.org/en-US/docs/Web/CSS/color_value](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).
|
|
139
|
+
*
|
|
140
|
+
* @defaultValue "#ffffff"
|
|
141
|
+
*/
|
|
142
|
+
colorLight?: string
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Automatically calculate the _colorLight_ value from the QR code's background.
|
|
146
|
+
*
|
|
147
|
+
* @defaultValue true
|
|
148
|
+
*/
|
|
149
|
+
autoColor?: boolean
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Background image to be used in the QR code.
|
|
153
|
+
*
|
|
154
|
+
* Accepts a `data:` string in web browsers or a Buffer in Node.js.
|
|
155
|
+
*
|
|
156
|
+
* @defaultValue undefined
|
|
157
|
+
*/
|
|
158
|
+
backgroundImage?: string | Buffer
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Color of the dimming mask above the background image.
|
|
162
|
+
*
|
|
163
|
+
* Accepts a CSS <color>.
|
|
164
|
+
*
|
|
165
|
+
* For more information about CSS <color>, please refer to [https://developer.mozilla.org/en-US/docs/Web/CSS/color_value](https://developer.mozilla.org/en-US/docs/Web/CSS/color_value).
|
|
166
|
+
*
|
|
167
|
+
* @defaultValue "rgba(0, 0, 0, 0)"
|
|
168
|
+
*/
|
|
169
|
+
backgroundDimming?: string
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* GIF background image to be used in the QR code.
|
|
173
|
+
*
|
|
174
|
+
* @defaultValue undefined
|
|
175
|
+
*/
|
|
176
|
+
gifBackground?: ArrayBuffer
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Use a white margin instead of a transparent one which reveals the background of the QR code on margins.
|
|
180
|
+
*
|
|
181
|
+
* @defaultValue true
|
|
182
|
+
*/
|
|
183
|
+
whiteMargin?: boolean
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Logo image to be displayed at the center of the QR code.
|
|
187
|
+
*
|
|
188
|
+
* Accepts a `data:` string in web browsers or a Buffer in Node.js.
|
|
189
|
+
*
|
|
190
|
+
* When set to `undefined` or `null`, the logo is disabled.
|
|
191
|
+
*
|
|
192
|
+
* @defaultValue undefined
|
|
193
|
+
*/
|
|
194
|
+
logoImage?: string | Buffer
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Ratio of the logo size to the QR code size.
|
|
198
|
+
*
|
|
199
|
+
* @defaultValue 0.2
|
|
200
|
+
*/
|
|
201
|
+
logoScale?: number
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Size of margins around the logo image in pixels.
|
|
205
|
+
*
|
|
206
|
+
* @defaultValue 6
|
|
207
|
+
*/
|
|
208
|
+
logoMargin?: number
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Corner radius of the logo image in pixels.
|
|
212
|
+
*
|
|
213
|
+
* @defaultValue 8
|
|
214
|
+
*/
|
|
215
|
+
logoCornerRadius?: number
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* @deprecated
|
|
219
|
+
*
|
|
220
|
+
* Ratio of the real size to the full size of the blocks.
|
|
221
|
+
*
|
|
222
|
+
* This can be helpful when you want to make more parts of the background visible.
|
|
223
|
+
*
|
|
224
|
+
* @deafultValue 0.4
|
|
225
|
+
*/
|
|
226
|
+
dotScale?: number
|
|
227
|
+
}
|