@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.34.1-feature.DIIPv4.152 → 0.34.1-feature.DIIPv4.162
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.cjs +11 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -11
- package/dist/index.d.ts +17 -11
- package/dist/index.js +4 -11
- package/dist/index.js.map +1 -1
- package/package.json +17 -19
- package/src/schemas/index.ts +7 -16
- package/src/siopv2-rp-api-server.ts +2 -3
- package/src/types/types.ts +2 -3
- package/src/universal-oid4vp-api-functions.ts +4 -2
- package/src/webapp-api-functions.ts +183 -0
package/dist/index.cjs
CHANGED
|
@@ -191,7 +191,7 @@ __name(getAuthRequestSIOPv2Endpoint, "getAuthRequestSIOPv2Endpoint");
|
|
|
191
191
|
// src/universal-oid4vp-api-functions.ts
|
|
192
192
|
var import_did_auth_siop2 = require("@sphereon/did-auth-siop");
|
|
193
193
|
var import_ssi_express_support2 = require("@sphereon/ssi-express-support");
|
|
194
|
-
var
|
|
194
|
+
var import_ssi_sdk = require("@sphereon/ssi-sdk.siopv2-oid4vp-common");
|
|
195
195
|
var import_short_uuid = __toESM(require("short-uuid"), 1);
|
|
196
196
|
|
|
197
197
|
// src/middleware/validationMiddleware.ts
|
|
@@ -222,9 +222,8 @@ var validateData = /* @__PURE__ */ __name((schema) => {
|
|
|
222
222
|
}, "validateData");
|
|
223
223
|
|
|
224
224
|
// src/schemas/index.ts
|
|
225
|
-
var import_zod2 = require("zod");
|
|
226
|
-
var import_ssi_sdk = require("@sphereon/ssi-sdk.siopv2-oid4vp-common");
|
|
227
225
|
var import_did_auth_siop = require("@sphereon/did-auth-siop");
|
|
226
|
+
var import_zod2 = require("zod");
|
|
228
227
|
var ResponseTypeSchema = import_zod2.z.enum([
|
|
229
228
|
import_did_auth_siop.ResponseType.VP_TOKEN
|
|
230
229
|
]);
|
|
@@ -237,14 +236,6 @@ var requestUriMethods = [
|
|
|
237
236
|
"post"
|
|
238
237
|
];
|
|
239
238
|
var RequestUriMethodSchema = import_zod2.z.enum(requestUriMethods);
|
|
240
|
-
var AuthorizationStatusSchema = import_zod2.z.enum([
|
|
241
|
-
...import_ssi_sdk.authorizationRequestStatuses,
|
|
242
|
-
...import_ssi_sdk.authorizationResponseStatuses
|
|
243
|
-
]);
|
|
244
|
-
var CallbackOptsSchema = import_zod2.z.object({
|
|
245
|
-
url: import_zod2.z.string(),
|
|
246
|
-
status: import_zod2.z.array(AuthorizationStatusSchema).optional()
|
|
247
|
-
});
|
|
248
239
|
var QRCodeOptsSchema = import_zod2.z.object({
|
|
249
240
|
size: import_zod2.z.number().optional(),
|
|
250
241
|
color_dark: import_zod2.z.string().optional(),
|
|
@@ -261,7 +252,7 @@ var CreateAuthorizationRequestBodySchema = import_zod2.z.object({
|
|
|
261
252
|
transaction_data: import_zod2.z.array(import_zod2.z.string()).optional(),
|
|
262
253
|
qr_code: QRCodeOptsSchema.optional(),
|
|
263
254
|
direct_post_response_redirect_uri: import_zod2.z.string().optional(),
|
|
264
|
-
callback: CallbackOptsSchema.optional()
|
|
255
|
+
callback: import_did_auth_siop.CallbackOptsSchema.optional()
|
|
265
256
|
});
|
|
266
257
|
var CreateAuthorizationResponseSchema = import_zod2.z.object({
|
|
267
258
|
correlation_id: import_zod2.z.string(),
|
|
@@ -285,6 +276,7 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
285
276
|
const queryId = request.body.query_id;
|
|
286
277
|
const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri;
|
|
287
278
|
const requestUriBase = request.body.request_uri_base;
|
|
279
|
+
const callback = request.body.callback;
|
|
288
280
|
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
289
281
|
filter: [
|
|
290
282
|
{
|
|
@@ -299,10 +291,10 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
299
291
|
message: "No query could be found"
|
|
300
292
|
});
|
|
301
293
|
}
|
|
302
|
-
const requestByReferenceURI = (0,
|
|
294
|
+
const requestByReferenceURI = (0, import_ssi_sdk.uriWithBase)(`/siop/definitions/${queryId}/auth-requests/${correlationId}`, {
|
|
303
295
|
baseURI: requestUriBase ?? opts?.siopBaseURI
|
|
304
296
|
});
|
|
305
|
-
const responseURI = (0,
|
|
297
|
+
const responseURI = (0, import_ssi_sdk.uriWithBase)(`/siop/definitions/${queryId}/auth-responses/${correlationId}`, {
|
|
306
298
|
baseURI: opts?.siopBaseURI
|
|
307
299
|
});
|
|
308
300
|
const authRequestURI = await context.agent.siopCreateAuthRequestURI({
|
|
@@ -314,7 +306,8 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
314
306
|
responseURI,
|
|
315
307
|
...directPostResponseRedirectUri && {
|
|
316
308
|
responseRedirectURI: directPostResponseRedirectUri
|
|
317
|
-
}
|
|
309
|
+
},
|
|
310
|
+
callback
|
|
318
311
|
});
|
|
319
312
|
let qrCodeDataUri;
|
|
320
313
|
if (qrCodeOpts) {
|
|
@@ -329,7 +322,7 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
329
322
|
query_id: queryId,
|
|
330
323
|
correlation_id: correlationId,
|
|
331
324
|
request_uri: authRequestURI,
|
|
332
|
-
status_uri: `${(0,
|
|
325
|
+
status_uri: `${(0, import_ssi_sdk.uriWithBase)(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, {
|
|
333
326
|
baseURI: opts?.webappBaseURI
|
|
334
327
|
})}`,
|
|
335
328
|
...qrCodeDataUri && {
|
|
@@ -457,7 +450,7 @@ function getDefinitionsEndpoint(router, context, opts) {
|
|
|
457
450
|
__name(getDefinitionsEndpoint, "getDefinitionsEndpoint");
|
|
458
451
|
|
|
459
452
|
// src/siopv2-rp-api-server.ts
|
|
460
|
-
var
|
|
453
|
+
var import_ssi_sdk2 = require("@sphereon/ssi-sdk.core");
|
|
461
454
|
var import_ssi_express_support3 = require("@sphereon/ssi-express-support");
|
|
462
455
|
var import_express = __toESM(require("express"), 1);
|
|
463
456
|
var import_swagger_ui_express = __toESM(require("swagger-ui-express"), 1);
|
|
@@ -494,7 +487,7 @@ var SIOPv2RPApiServer = class {
|
|
|
494
487
|
this._opts = opts;
|
|
495
488
|
this._express = args.expressSupport.express;
|
|
496
489
|
this._router = import_express.default.Router();
|
|
497
|
-
const context = (0,
|
|
490
|
+
const context = (0, import_ssi_sdk2.agentContext)(agent);
|
|
498
491
|
const features = opts?.enableFeatures ?? [
|
|
499
492
|
"rp-status",
|
|
500
493
|
"siop"
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/siop-api-functions.ts","../src/universal-oid4vp-api-functions.ts","../src/middleware/validationMiddleware.ts","../src/schemas/index.ts","../src/siopv2-rp-api-server.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './siop-api-functions'\nexport * from './universal-oid4vp-api-functions'\nexport * from './types'\nexport * from './siopv2-rp-api-server'\n","import { AuthorizationResponsePayload } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { CredentialMapper } from '@sphereon/ssi-types'\nimport { Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType === 'application/json') {\n const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n return payload as AuthorizationResponsePayload\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n const payload = request.body as AuthorizationResponsePayload\n\n // Parse presentation_submission if it's a string\n if (typeof payload.presentation_submission === 'string') {\n console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n payload.presentation_submission = JSON.parse(payload.presentation_submission)\n }\n\n // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n if (typeof payload.vp_token === 'string') {\n const { vp_token } = payload\n\n // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n // (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)\n if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n payload.vp_token = JSON.parse(vp_token)\n }\n }\n\n return payload\n }\n\n throw new Error(\n `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n )\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, definitionId, tenantId, version } = request.params\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.log('Authorization Response (siop-sessions')\n console.log(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId, tenantId, version }] })\n if (definitionItems.length === 0) {\n console.log(`Could not get definition ${definitionId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${definitionId}`\n return response.send()\n }\n\n const authorizationResponse = parseAuthorizationResponse(request)\n console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n const definitionItem = definitionItems[0]\n const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n authorizationResponse,\n correlationId,\n dcqlQueryPayload: definitionItem.dcqlPayload,\n })\n\n // FIXME SSISDK-55 add proper support for checking for DCQL presentations\n const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n if (presentation && Object.keys(presentation).length > 0) {\n console.log('PRESENTATIONS:' + JSON.stringify(verifiedResponse?.oid4vpSubmission?.presentation, null, 2))\n response.statusCode = 200\n\n const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {\n presentation_during_issuance_session: verifiedResponse.correlationId,\n }\n if (authorizationResponse.is_first_party) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify(authorizationChallengeValidationResponse))\n }\n\n const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, queryId: definitionId, state: verifiedResponse.state })\n if (responseRedirectURI) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n }\n // todo: delete session\n } else {\n console.log('Missing Presentation (Verifiable Credentials)')\n response.statusCode = 500\n response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n }\n return response.send()\n } catch (error) {\n console.error(error)\n return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n }\n })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getAuthRequest SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-requests/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId = request.params.correlationId\n const definitionId = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId: definitionId,\n errorOnNotFound: false,\n })\n if (!requestState) {\n console.log(\n `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${definitionId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n const requestObject = await requestState.request?.requestObject?.toJwt()\n console.log('JWT Request object:')\n console.log(requestObject)\n\n let error: string | undefined\n try {\n response.statusCode = 200\n response.setHeader('Content-Type', 'application/jwt')\n return response.send(requestObject)\n } catch (e) {\n error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n } finally {\n await context.agent.siopUpdateAuthRequestState({\n correlationId,\n queryId: definitionId,\n state: 'authorization_request_created',\n error,\n })\n }\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n }\n })\n}\n","import { AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport { CreateAuthorizationRequestBodySchema } from './schemas'\nimport {\n CreateAuthorizationRequest,\n CreateAuthorizationRequestResponse,\n CreateAuthorizationResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n GetAuthStatusResponse,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext\n} from './types'\n\nexport function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`createAuthRequest universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests'\n router.post(path, checkAuth(opts?.endpoint), validateData(CreateAuthorizationRequestBodySchema), async (request: CreateAuthorizationRequest, response: CreateAuthorizationResponse) => {\n try {\n const correlationId = request.body.correlation_id ?? uuid.uuid()\n const qrCodeOpts = request.body.qr_code ?? opts?.qrCodeOpts\n const queryId = request.body.query_id\n const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri // TODO Uri not URI\n const requestUriBase = request.body.request_uri_base\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId: queryId }] })\n if (definitionItems.length === 0) {\n console.log(`No query could be found for the given id. Query id: ${queryId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })\n }\n\n const requestByReferenceURI = uriWithBase(`/siop/definitions/${queryId}/auth-requests/${correlationId}`, {\n baseURI: requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/definitions/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })\n\n const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n queryId,\n correlationId,\n nonce: uuid.uuid(),\n requestByReferenceURI,\n responseURIType: 'response_uri',\n responseURI,\n ...(directPostResponseRedirectUri && { responseRedirectURI: directPostResponseRedirectUri }),\n })\n\n let qrCodeDataUri: string | undefined\n if (qrCodeOpts) {\n const { AwesomeQR } = await import('awesome-qr')\n const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })\n qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n }\n\n const authRequestBody = {\n query_id: queryId,\n correlation_id: correlationId,\n request_uri: authRequestURI,\n status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,\n ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),\n } satisfies CreateAuthorizationRequestResponse\n console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n\n return response.status(201).json(authRequestBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)\n }\n })\n}\n\nexport function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests/:correlationId'\n router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {\n try {\n const correlationId: string = request.params.correlationId\n\n const authRequestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n if (!authRequestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n await context.agent.siopDeleteAuthState({ correlationId })\n\n return response.status(204).json()\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`authStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/status/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {\n try {\n console.log('Received auth-status request...')\n const correlationId: string = request.params.correlationId\n\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n\n if (!requestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n let responseState\n if (requestState.status === 'authorization_request_created') {\n responseState = (await context.agent.siopGetAuthResponseState({ correlationId, errorOnNotFound: false }))\n }\n const overallState = responseState ?? requestState\n\n const statusBody = {\n status: overallState.status,\n correlation_id: overallState.correlationId,\n query_id: overallState.queryId,\n last_updated: overallState.lastUpdated,\n ...((responseState?.status === AuthorizationResponseStateStatus.VERIFIED && responseState.verifiedData !== undefined) && { verified_data: responseState.verifiedData }),\n ...(overallState.error && { message: overallState.error.message })\n } satisfies GetAuthStatusResponse\n console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n\n if (overallState.status === 'error') {\n return response.status(500).json(statusBody)\n }\n return response.status(200).json(statusBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getDefinitions universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/definitions'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const definitions = await context.agent.pdmGetDefinitions()\n response.statusCode = 200\n return response.json(definitions)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { z, ZodError } from 'zod';\n\nexport const validateData = (schema: z.ZodObject<any, any>) => {\n return (req: Request, res: Response, next: NextFunction) => {\n try {\n schema.parse(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n const errorMessages = error.issues.map((issue: any) => ({\n message: `${issue.path.join('.')} is ${issue.message}`,\n }))\n res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message });\n } else {\n res.status(500).json({ status: 500, message: 'Internal Server Error' });\n }\n }\n };\n}\n","import { z } from 'zod';\nimport {\n authorizationRequestStatuses,\n authorizationResponseStatuses\n} from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { ResponseMode, ResponseType, RequestUriMethod } from '@sphereon/did-auth-siop'\n\nexport const ResponseTypeSchema = z.enum([ResponseType.VP_TOKEN]);\n\nexport const ResponseModeSchema = z.enum([ResponseMode.DIRECT_POST, ResponseMode.DIRECT_POST_JWT]);\n\nconst requestUriMethods = [\"get\", \"post\"] as const satisfies Array<RequestUriMethod>;\nexport const RequestUriMethodSchema = z.enum(requestUriMethods);\n\nexport const AuthorizationStatusSchema = z.enum([\n ...authorizationRequestStatuses,\n ...authorizationResponseStatuses\n]);\n\nexport const CallbackOptsSchema = z.object({\n url: z.string(),\n status: z.array(AuthorizationStatusSchema).optional(),\n});\n\nexport const QRCodeOptsSchema = z.object({\n size: z.number().optional(),\n color_dark: z.string().optional(),\n color_light: z.string().optional(),\n});\n\nexport const CreateAuthorizationRequestBodySchema = z.object({\n query_id: z.string(),\n client_id: z.string().optional(),\n request_uri_base: z.string().optional(),\n correlation_id: z.string().optional(),\n request_uri_method: RequestUriMethodSchema.optional(),\n response_type: ResponseTypeSchema.optional(),\n response_mode: ResponseModeSchema.optional(),\n transaction_data: z.array(z.string()).optional(),\n qr_code: QRCodeOptsSchema.optional(),\n direct_post_response_redirect_uri: z.string().optional(),\n callback: CallbackOptsSchema.optional(),\n});\n\nexport const CreateAuthorizationResponseSchema = z.object({\n correlation_id: z.string(),\n query_id: z.string(),\n request_uri: z.string(),\n status_uri: z.string(),\n qr_uri: z.string().optional(),\n});\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n authStatusUniversalOID4VPEndpoint,\n createAuthRequestUniversalOID4VPEndpoint,\n getDefinitionsEndpoint,\n removeAuthRequestStateUniversalOID4VPEndpoint,\n} from './universal-oid4vp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n private readonly _express: Express\n private readonly _router: Router\n private readonly _agent: TAgent<IPresentationExchange & ISIOPv2RP>\n private readonly _opts?: ISIOPv2RPRestAPIOpts\n private readonly _basePath: string\n\n private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest'] })\n if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n // Webapp endpoints\n if (features.includes('rp-status')) {\n createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n }\n\n // SIOPv2 endpoints\n if (features.includes('siop')) {\n getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n }\n this._basePath = opts?.endpointOpts?.basePath ?? ''\n this._express.use(this._basePath, this.router)\n this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n this.setupSwaggerUi()\n }\n\n private setupSwaggerUi() {\n fetch(this.OID4VP_SWAGGER_URL)\n .then((res) => res.json())\n .then((swagger: any) => {\n const apiDocs = `${this._basePath}/api-docs`\n console.log(`[OID4P] API docs available at ${apiDocs}`)\n\n this._router.use(\n '/api-docs',\n (req: Request, res: Response, next: any) => {\n const regex = `${apiDocs.replace(/\\//, '\\/')}`.replace('/oid4vp', '').replace(/\\/api-docs.*/, '')\n swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]\n // @ts-ignore\n req.swaggerDoc = swagger\n next()\n },\n swaggerUi.serveFiles(swagger, options),\n swaggerUi.setup(),\n )\n })\n .catch((err) => {\n console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n })\n const options = {\n // customCss: '.swagger-ui .topbar { display: none }',\n }\n }\n get express(): Express {\n return this._express\n }\n\n get router(): Router {\n return this._router\n }\n\n get agent(): TAgent<IPresentationExchange & ISIOPv2RP> {\n return this._agent\n }\n\n get opts(): ISIOPv2RPRestAPIOpts | undefined {\n return this._opts\n }\n}\n"],"mappings":"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","names":["parseAuthorizationResponse","request","contentType","header","payload","body","JSON","parse","presentation_submission","console","log","vp_token","startsWith","endsWith","CredentialMapper","isJsonLdAsString","Error","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","definitionId","tenantId","version","params","sendErrorResponse","stringify","definitionItems","agent","pdmGetDefinitions","filter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQueryPayload","dcqlPayload","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","queryId","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","import_did_auth_siop","import_ssi_express_support","import_ssi_sdk","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","import_zod","ResponseTypeSchema","z","enum","ResponseType","VP_TOKEN","ResponseModeSchema","ResponseMode","DIRECT_POST","DIRECT_POST_JWT","requestUriMethods","RequestUriMethodSchema","AuthorizationStatusSchema","authorizationRequestStatuses","authorizationResponseStatuses","CallbackOptsSchema","object","url","string","status","array","optional","QRCodeOptsSchema","size","number","color_dark","color_light","CreateAuthorizationRequestBodySchema","query_id","client_id","request_uri_base","correlation_id","request_uri_method","response_type","response_mode","transaction_data","qr_code","direct_post_response_redirect_uri","callback","CreateAuthorizationResponseSchema","request_uri","status_uri","qr_uri","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestBodySchema","request","response","correlationId","body","correlation_id","uuid","qrCodeOpts","qr_code","queryId","query_id","directPostResponseRedirectUri","direct_post_response_redirect_uri","requestUriBase","request_uri_base","definitionItems","agent","pdmGetDefinitions","filter","definitionId","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","responseRedirectURI","qrCodeDataUri","AwesomeQR","qrCode","text","draw","toString","authRequestBody","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","AuthorizationResponseStateStatus","VERIFIED","verifiedData","undefined","verified_data","debug","getDefinitionsEndpoint","definitions","statusCode","import_ssi_sdk","import_ssi_express_support","SIOPv2RPApiServer","_express","_router","_agent","_opts","_basePath","OID4VP_SWAGGER_URL","args","agent","opts","copyGlobalAuthToEndpoints","keys","endpointOpts","globalAuth","secureSiopEndpoints","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createAuthRequestUniversalOID4VPEndpoint","webappCreateAuthRequest","authStatusUniversalOID4VPEndpoint","webappAuthStatus","removeAuthRequestStateUniversalOID4VPEndpoint","webappDeleteAuthRequest","getDefinitionsEndpoint","webappGetDefinitions","getAuthRequestSIOPv2Endpoint","siopGetAuthRequest","verifyAuthResponseSIOPv2Endpoint","siopVerifyAuthResponse","basePath","use","router","set","trustProxy","setupSwaggerUi","fetch","then","res","json","swagger","apiDocs","req","next","regex","replace","servers","url","protocol","get","description","swaggerDoc","swaggerUi","serveFiles","options","setup","catch","err"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/siop-api-functions.ts","../src/universal-oid4vp-api-functions.ts","../src/middleware/validationMiddleware.ts","../src/schemas/index.ts","../src/siopv2-rp-api-server.ts"],"sourcesContent":["/**\n * @public\n */\nexport * from './siop-api-functions'\nexport * from './universal-oid4vp-api-functions'\nexport * from './types'\nexport * from './siopv2-rp-api-server'\n","import { AuthorizationResponsePayload } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { CredentialMapper } from '@sphereon/ssi-types'\nimport { Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType === 'application/json') {\n const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n return payload as AuthorizationResponsePayload\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n const payload = request.body as AuthorizationResponsePayload\n\n // Parse presentation_submission if it's a string\n if (typeof payload.presentation_submission === 'string') {\n console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n payload.presentation_submission = JSON.parse(payload.presentation_submission)\n }\n\n // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n if (typeof payload.vp_token === 'string') {\n const { vp_token } = payload\n\n // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n // (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)\n if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n payload.vp_token = JSON.parse(vp_token)\n }\n }\n\n return payload\n }\n\n throw new Error(\n `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n )\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, definitionId, tenantId, version } = request.params\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.log('Authorization Response (siop-sessions')\n console.log(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId, tenantId, version }] })\n if (definitionItems.length === 0) {\n console.log(`Could not get definition ${definitionId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${definitionId}`\n return response.send()\n }\n\n const authorizationResponse = parseAuthorizationResponse(request)\n console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n const definitionItem = definitionItems[0]\n const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n authorizationResponse,\n correlationId,\n dcqlQueryPayload: definitionItem.dcqlPayload,\n })\n\n // FIXME SSISDK-55 add proper support for checking for DCQL presentations\n const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n if (presentation && Object.keys(presentation).length > 0) {\n console.log('PRESENTATIONS:' + JSON.stringify(verifiedResponse?.oid4vpSubmission?.presentation, null, 2))\n response.statusCode = 200\n\n const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {\n presentation_during_issuance_session: verifiedResponse.correlationId,\n }\n if (authorizationResponse.is_first_party) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify(authorizationChallengeValidationResponse))\n }\n\n const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, queryId: definitionId, state: verifiedResponse.state })\n if (responseRedirectURI) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n }\n // todo: delete session\n } else {\n console.log('Missing Presentation (Verifiable Credentials)')\n response.statusCode = 500\n response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n }\n return response.send()\n } catch (error) {\n console.error(error)\n return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n }\n })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getAuthRequest SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-requests/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId = request.params.correlationId\n const definitionId = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId: definitionId,\n errorOnNotFound: false,\n })\n if (!requestState) {\n console.log(\n `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${definitionId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n const requestObject = await requestState.request?.requestObject?.toJwt()\n console.log('JWT Request object:')\n console.log(requestObject)\n\n let error: string | undefined\n try {\n response.statusCode = 200\n response.setHeader('Content-Type', 'application/jwt')\n return response.send(requestObject)\n } catch (e) {\n error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n } finally {\n await context.agent.siopUpdateAuthRequestState({\n correlationId,\n queryId: definitionId,\n state: 'authorization_request_created',\n error,\n })\n }\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n }\n })\n}\n","import { AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport { CreateAuthorizationRequestBodySchema } from './schemas'\nimport {\n CreateAuthorizationRequest,\n CreateAuthorizationRequestResponse,\n CreateAuthorizationResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n AuthStatusResponse,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext\n} from './types'\n\nexport function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`createAuthRequest universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests'\n router.post(path, checkAuth(opts?.endpoint), validateData(CreateAuthorizationRequestBodySchema), async (request: CreateAuthorizationRequest, response: CreateAuthorizationResponse) => {\n try {\n const correlationId = request.body.correlation_id ?? uuid.uuid()\n const qrCodeOpts = request.body.qr_code ?? opts?.qrCodeOpts\n const queryId = request.body.query_id\n const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri // TODO Uri not URI\n const requestUriBase = request.body.request_uri_base\n const callback = request.body.callback\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId: queryId }] })\n if (definitionItems.length === 0) {\n console.log(`No query could be found for the given id. Query id: ${queryId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })\n }\n\n const requestByReferenceURI = uriWithBase(`/siop/definitions/${queryId}/auth-requests/${correlationId}`, {\n baseURI: requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/definitions/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })\n\n const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n queryId,\n correlationId,\n nonce: uuid.uuid(),\n requestByReferenceURI,\n responseURIType: 'response_uri',\n responseURI,\n ...(directPostResponseRedirectUri && { responseRedirectURI: directPostResponseRedirectUri }),\n callback\n })\n\n let qrCodeDataUri: string | undefined\n if (qrCodeOpts) {\n const { AwesomeQR } = await import('awesome-qr')\n const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })\n qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n }\n\n const authRequestBody = {\n query_id: queryId,\n correlation_id: correlationId,\n request_uri: authRequestURI,\n status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,\n ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),\n } satisfies CreateAuthorizationRequestResponse\n console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n\n return response.status(201).json(authRequestBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)\n }\n })\n}\n\nexport function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests/:correlationId'\n router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {\n try {\n const correlationId: string = request.params.correlationId\n\n const authRequestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n if (!authRequestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n await context.agent.siopDeleteAuthState({ correlationId })\n\n return response.status(204).json()\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`authStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/status/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {\n try {\n console.log('Received auth-status request...')\n const correlationId: string = request.params.correlationId\n\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n\n if (!requestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n let responseState\n if (requestState.status === 'authorization_request_created') {\n responseState = (await context.agent.siopGetAuthResponseState({ correlationId, errorOnNotFound: false }))\n }\n const overallState = responseState ?? requestState\n\n const statusBody = {\n status: overallState.status,\n correlation_id: overallState.correlationId,\n query_id: overallState.queryId,\n last_updated: overallState.lastUpdated,\n ...((responseState?.status === AuthorizationResponseStateStatus.VERIFIED && responseState.verifiedData !== undefined) && { verified_data: responseState.verifiedData }),\n ...(overallState.error && { message: overallState.error.message })\n } satisfies AuthStatusResponse\n console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n\n if (overallState.status === 'error') {\n return response.status(500).json(statusBody)\n }\n return response.status(200).json(statusBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getDefinitions universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/definitions'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const definitions = await context.agent.pdmGetDefinitions()\n response.statusCode = 200\n return response.json(definitions)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { z, ZodError } from 'zod';\n\nexport const validateData = (schema: z.ZodObject<any, any>) => {\n return (req: Request, res: Response, next: NextFunction) => {\n try {\n schema.parse(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n const errorMessages = error.issues.map((issue: any) => ({\n message: `${issue.path.join('.')} is ${issue.message}`,\n }))\n res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message });\n } else {\n res.status(500).json({ status: 500, message: 'Internal Server Error' });\n }\n }\n };\n}\n","import {\n CallbackOptsSchema,\n RequestUriMethod,\n ResponseMode,\n ResponseType\n} from '@sphereon/did-auth-siop'\nimport { z } from 'zod'\n\nexport const ResponseTypeSchema = z.enum([ResponseType.VP_TOKEN]);\n\nexport const ResponseModeSchema = z.enum([ResponseMode.DIRECT_POST, ResponseMode.DIRECT_POST_JWT]);\n\nconst requestUriMethods = ['get', 'post'] as const satisfies Array<RequestUriMethod>;\nexport const RequestUriMethodSchema = z.enum(requestUriMethods);\n\nexport const QRCodeOptsSchema = z.object({\n size: z.number().optional(),\n color_dark: z.string().optional(),\n color_light: z.string().optional(),\n});\n\nexport const CreateAuthorizationRequestBodySchema = z.object({\n query_id: z.string(),\n client_id: z.string().optional(),\n request_uri_base: z.string().optional(),\n correlation_id: z.string().optional(),\n request_uri_method: RequestUriMethodSchema.optional(),\n response_type: ResponseTypeSchema.optional(),\n response_mode: ResponseModeSchema.optional(),\n transaction_data: z.array(z.string()).optional(),\n qr_code: QRCodeOptsSchema.optional(),\n direct_post_response_redirect_uri: z.string().optional(),\n callback: CallbackOptsSchema.optional(),\n});\n\nexport const CreateAuthorizationResponseSchema = z.object({\n correlation_id: z.string(),\n query_id: z.string(),\n request_uri: z.string(),\n status_uri: z.string(),\n qr_uri: z.string().optional(),\n});\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n authStatusUniversalOID4VPEndpoint,\n createAuthRequestUniversalOID4VPEndpoint,\n getDefinitionsEndpoint,\n removeAuthRequestStateUniversalOID4VPEndpoint,\n} from './universal-oid4vp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n private readonly _express: Express\n private readonly _router: Router\n private readonly _agent: TAgent<ISIOPv2RP>\n private readonly _opts?: ISIOPv2RPRestAPIOpts\n private readonly _basePath: string\n\n private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest'] })\n if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n // Webapp endpoints\n if (features.includes('rp-status')) {\n createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n }\n\n // SIOPv2 endpoints\n if (features.includes('siop')) {\n getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n }\n this._basePath = opts?.endpointOpts?.basePath ?? ''\n this._express.use(this._basePath, this.router)\n this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n this.setupSwaggerUi()\n }\n\n private setupSwaggerUi() {\n fetch(this.OID4VP_SWAGGER_URL)\n .then((res) => res.json())\n .then((swagger: any) => {\n const apiDocs = `${this._basePath}/api-docs`\n console.log(`[OID4P] API docs available at ${apiDocs}`)\n\n this._router.use(\n '/api-docs',\n (req: Request, res: Response, next: any) => {\n const regex = `${apiDocs.replace(/\\//, '\\/')}`.replace('/oid4vp', '').replace(/\\/api-docs.*/, '')\n swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]\n // @ts-ignore\n req.swaggerDoc = swagger\n next()\n },\n swaggerUi.serveFiles(swagger, options),\n swaggerUi.setup(),\n )\n })\n .catch((err) => {\n console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n })\n const options = {\n // customCss: '.swagger-ui .topbar { display: none }',\n }\n }\n get express(): Express {\n return this._express\n }\n\n get router(): Router {\n return this._router\n }\n\n get agent(): TAgent<ISIOPv2RP> {\n return this._agent\n }\n\n get opts(): ISIOPv2RPRestAPIOpts | undefined {\n return this._opts\n }\n}\n"],"mappings":"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","names":["parseAuthorizationResponse","request","contentType","header","payload","body","JSON","parse","presentation_submission","console","log","vp_token","startsWith","endsWith","CredentialMapper","isJsonLdAsString","Error","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","definitionId","tenantId","version","params","sendErrorResponse","stringify","definitionItems","agent","pdmGetDefinitions","filter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQueryPayload","dcqlPayload","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","queryId","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","import_did_auth_siop","import_ssi_express_support","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","import_zod","ResponseTypeSchema","z","enum","ResponseType","VP_TOKEN","ResponseModeSchema","ResponseMode","DIRECT_POST","DIRECT_POST_JWT","requestUriMethods","RequestUriMethodSchema","QRCodeOptsSchema","object","size","number","optional","color_dark","string","color_light","CreateAuthorizationRequestBodySchema","query_id","client_id","request_uri_base","correlation_id","request_uri_method","response_type","response_mode","transaction_data","array","qr_code","direct_post_response_redirect_uri","callback","CallbackOptsSchema","CreateAuthorizationResponseSchema","request_uri","status_uri","qr_uri","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestBodySchema","request","response","correlationId","body","correlation_id","uuid","qrCodeOpts","qr_code","queryId","query_id","directPostResponseRedirectUri","direct_post_response_redirect_uri","requestUriBase","request_uri_base","callback","definitionItems","agent","pdmGetDefinitions","filter","definitionId","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","responseRedirectURI","qrCodeDataUri","AwesomeQR","qrCode","text","draw","toString","authRequestBody","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","AuthorizationResponseStateStatus","VERIFIED","verifiedData","undefined","verified_data","debug","getDefinitionsEndpoint","definitions","statusCode","import_ssi_sdk","import_ssi_express_support","SIOPv2RPApiServer","_express","_router","_agent","_opts","_basePath","OID4VP_SWAGGER_URL","args","agent","opts","copyGlobalAuthToEndpoints","keys","endpointOpts","globalAuth","secureSiopEndpoints","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createAuthRequestUniversalOID4VPEndpoint","webappCreateAuthRequest","authStatusUniversalOID4VPEndpoint","webappAuthStatus","removeAuthRequestStateUniversalOID4VPEndpoint","webappDeleteAuthRequest","getDefinitionsEndpoint","webappGetDefinitions","getAuthRequestSIOPv2Endpoint","siopGetAuthRequest","verifyAuthResponseSIOPv2Endpoint","siopVerifyAuthResponse","basePath","use","router","set","trustProxy","setupSwaggerUi","fetch","then","res","json","swagger","apiDocs","req","next","regex","replace","servers","url","protocol","get","description","swaggerDoc","swaggerUi","serveFiles","options","setup","catch","err"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ISingleEndpointOpts, GenericAuthArgs, ExpressSupport } from '@sphereon/ssi-express-support';
|
|
2
2
|
import { Request, Response, Router, Express } from 'express';
|
|
3
3
|
import { IAgentContext, ICredentialVerifier, TAgent } from '@veramo/core';
|
|
4
|
-
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange';
|
|
5
4
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
6
5
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager';
|
|
7
6
|
import { AdditionalClaims } from '@sphereon/ssi-types';
|
|
8
7
|
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common';
|
|
9
8
|
import { z } from 'zod';
|
|
9
|
+
import * as _sphereon_did_auth_siop from '@sphereon/did-auth-siop';
|
|
10
10
|
import { ResponseType, ResponseMode } from '@sphereon/did-auth-siop';
|
|
11
11
|
|
|
12
12
|
declare const CreateAuthorizationRequestBodySchema: z.ZodObject<{
|
|
@@ -34,12 +34,18 @@ declare const CreateAuthorizationRequestBodySchema: z.ZodObject<{
|
|
|
34
34
|
direct_post_response_redirect_uri: z.ZodOptional<z.ZodString>;
|
|
35
35
|
callback: z.ZodOptional<z.ZodObject<{
|
|
36
36
|
url: z.ZodString;
|
|
37
|
+
verified_data: z.ZodOptional<z.ZodObject<{
|
|
38
|
+
modes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
39
|
+
authorization_response: _sphereon_did_auth_siop.VerifiedDataMode.AUTHORIZATION_RESPONSE;
|
|
40
|
+
credential_claims_deserialized: _sphereon_did_auth_siop.VerifiedDataMode.CREDENTIAL_CLAIMS_DESERIALIZED;
|
|
41
|
+
vp_token: _sphereon_did_auth_siop.VerifiedDataMode.VP_TOKEN;
|
|
42
|
+
}>>>;
|
|
43
|
+
}, z.core.$strip>>;
|
|
37
44
|
status: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
38
|
-
authorization_request_created:
|
|
39
|
-
authorization_request_retrieved:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
authorization_response_verified: "authorization_response_verified";
|
|
45
|
+
authorization_request_created: _sphereon_did_auth_siop.AuthorizationRequestStateStatus.CREATED;
|
|
46
|
+
authorization_request_retrieved: _sphereon_did_auth_siop.AuthorizationRequestStateStatus.RETRIEVED;
|
|
47
|
+
authorization_response_received: _sphereon_did_auth_siop.AuthorizationResponseStateStatus.RECEIVED;
|
|
48
|
+
authorization_response_verified: _sphereon_did_auth_siop.AuthorizationResponseStateStatus.VERIFIED;
|
|
43
49
|
}>>>;
|
|
44
50
|
}, z.core.$strip>>;
|
|
45
51
|
}, z.core.$strip>;
|
|
@@ -279,7 +285,7 @@ interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpts {
|
|
|
279
285
|
webappBaseURI?: string;
|
|
280
286
|
responseRedirectURI?: string;
|
|
281
287
|
}
|
|
282
|
-
type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP &
|
|
288
|
+
type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPDManager;
|
|
283
289
|
type IRequiredContext = IAgentContext<IRequiredPlugins>;
|
|
284
290
|
type CreateAuthorizationRequest = Request<Record<string, never>, any, CreateAuthorizationRequestBody, Record<string, never>>;
|
|
285
291
|
type CreateAuthorizationRequestBody = z.infer<typeof CreateAuthorizationRequestBodySchema>;
|
|
@@ -298,14 +304,14 @@ type RequestError = {
|
|
|
298
304
|
message: string;
|
|
299
305
|
error_details?: string;
|
|
300
306
|
};
|
|
301
|
-
|
|
307
|
+
interface AuthStatusResponse {
|
|
302
308
|
status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus;
|
|
303
309
|
correlation_id: string;
|
|
304
310
|
query_id: string;
|
|
305
311
|
last_updated: number;
|
|
306
312
|
verified_data?: VerifiedData;
|
|
307
313
|
error?: RequestError;
|
|
308
|
-
}
|
|
314
|
+
}
|
|
309
315
|
type VerifiedData = {
|
|
310
316
|
authorization_response?: AuthorizationResponse;
|
|
311
317
|
credential_claims?: AdditionalClaims;
|
|
@@ -345,8 +351,8 @@ declare class SIOPv2RPApiServer {
|
|
|
345
351
|
private setupSwaggerUi;
|
|
346
352
|
get express(): Express;
|
|
347
353
|
get router(): Router;
|
|
348
|
-
get agent(): TAgent<
|
|
354
|
+
get agent(): TAgent<ISIOPv2RP>;
|
|
349
355
|
get opts(): ISIOPv2RPRestAPIOpts | undefined;
|
|
350
356
|
}
|
|
351
357
|
|
|
352
|
-
export { type AuthorizationResponse, type ComponentOptions, type CreateAuthorizationRequest, type CreateAuthorizationRequestBody, type CreateAuthorizationRequestResponse, type CreateAuthorizationResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type
|
|
358
|
+
export { type AuthStatusResponse, type AuthorizationResponse, type ComponentOptions, type CreateAuthorizationRequest, type CreateAuthorizationRequestBody, type CreateAuthorizationRequestResponse, type CreateAuthorizationResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type GetAuthorizationRequestStatus, type GetAuthorizationRequestStatusPathParameters, type ICreateAuthRequestWebappEndpointOpts, type IRequiredContext, type IRequiredPlugins, type ISIOPv2RPRestAPIOpts, type MultipleVpTokenDCQL, type MultipleVpTokens, type QRCodeOpts, type RequestError, SIOPv2RPApiServer, type SingleObjectVpTokenPE, type SingleStringVpTokenPE, type SiopFeatures, type VerifiedData, type VpToken, authStatusUniversalOID4VPEndpoint, createAuthRequestUniversalOID4VPEndpoint, getAuthRequestSIOPv2Endpoint, getDefinitionsEndpoint, removeAuthRequestStateUniversalOID4VPEndpoint, verifyAuthResponseSIOPv2Endpoint };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ISingleEndpointOpts, GenericAuthArgs, ExpressSupport } from '@sphereon/ssi-express-support';
|
|
2
2
|
import { Request, Response, Router, Express } from 'express';
|
|
3
3
|
import { IAgentContext, ICredentialVerifier, TAgent } from '@veramo/core';
|
|
4
|
-
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange';
|
|
5
4
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
6
5
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager';
|
|
7
6
|
import { AdditionalClaims } from '@sphereon/ssi-types';
|
|
8
7
|
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common';
|
|
9
8
|
import { z } from 'zod';
|
|
9
|
+
import * as _sphereon_did_auth_siop from '@sphereon/did-auth-siop';
|
|
10
10
|
import { ResponseType, ResponseMode } from '@sphereon/did-auth-siop';
|
|
11
11
|
|
|
12
12
|
declare const CreateAuthorizationRequestBodySchema: z.ZodObject<{
|
|
@@ -34,12 +34,18 @@ declare const CreateAuthorizationRequestBodySchema: z.ZodObject<{
|
|
|
34
34
|
direct_post_response_redirect_uri: z.ZodOptional<z.ZodString>;
|
|
35
35
|
callback: z.ZodOptional<z.ZodObject<{
|
|
36
36
|
url: z.ZodString;
|
|
37
|
+
verified_data: z.ZodOptional<z.ZodObject<{
|
|
38
|
+
modes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
39
|
+
authorization_response: _sphereon_did_auth_siop.VerifiedDataMode.AUTHORIZATION_RESPONSE;
|
|
40
|
+
credential_claims_deserialized: _sphereon_did_auth_siop.VerifiedDataMode.CREDENTIAL_CLAIMS_DESERIALIZED;
|
|
41
|
+
vp_token: _sphereon_did_auth_siop.VerifiedDataMode.VP_TOKEN;
|
|
42
|
+
}>>>;
|
|
43
|
+
}, z.core.$strip>>;
|
|
37
44
|
status: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
38
|
-
authorization_request_created:
|
|
39
|
-
authorization_request_retrieved:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
authorization_response_verified: "authorization_response_verified";
|
|
45
|
+
authorization_request_created: _sphereon_did_auth_siop.AuthorizationRequestStateStatus.CREATED;
|
|
46
|
+
authorization_request_retrieved: _sphereon_did_auth_siop.AuthorizationRequestStateStatus.RETRIEVED;
|
|
47
|
+
authorization_response_received: _sphereon_did_auth_siop.AuthorizationResponseStateStatus.RECEIVED;
|
|
48
|
+
authorization_response_verified: _sphereon_did_auth_siop.AuthorizationResponseStateStatus.VERIFIED;
|
|
43
49
|
}>>>;
|
|
44
50
|
}, z.core.$strip>>;
|
|
45
51
|
}, z.core.$strip>;
|
|
@@ -279,7 +285,7 @@ interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpts {
|
|
|
279
285
|
webappBaseURI?: string;
|
|
280
286
|
responseRedirectURI?: string;
|
|
281
287
|
}
|
|
282
|
-
type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP &
|
|
288
|
+
type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPDManager;
|
|
283
289
|
type IRequiredContext = IAgentContext<IRequiredPlugins>;
|
|
284
290
|
type CreateAuthorizationRequest = Request<Record<string, never>, any, CreateAuthorizationRequestBody, Record<string, never>>;
|
|
285
291
|
type CreateAuthorizationRequestBody = z.infer<typeof CreateAuthorizationRequestBodySchema>;
|
|
@@ -298,14 +304,14 @@ type RequestError = {
|
|
|
298
304
|
message: string;
|
|
299
305
|
error_details?: string;
|
|
300
306
|
};
|
|
301
|
-
|
|
307
|
+
interface AuthStatusResponse {
|
|
302
308
|
status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus;
|
|
303
309
|
correlation_id: string;
|
|
304
310
|
query_id: string;
|
|
305
311
|
last_updated: number;
|
|
306
312
|
verified_data?: VerifiedData;
|
|
307
313
|
error?: RequestError;
|
|
308
|
-
}
|
|
314
|
+
}
|
|
309
315
|
type VerifiedData = {
|
|
310
316
|
authorization_response?: AuthorizationResponse;
|
|
311
317
|
credential_claims?: AdditionalClaims;
|
|
@@ -345,8 +351,8 @@ declare class SIOPv2RPApiServer {
|
|
|
345
351
|
private setupSwaggerUi;
|
|
346
352
|
get express(): Express;
|
|
347
353
|
get router(): Router;
|
|
348
|
-
get agent(): TAgent<
|
|
354
|
+
get agent(): TAgent<ISIOPv2RP>;
|
|
349
355
|
get opts(): ISIOPv2RPRestAPIOpts | undefined;
|
|
350
356
|
}
|
|
351
357
|
|
|
352
|
-
export { type AuthorizationResponse, type ComponentOptions, type CreateAuthorizationRequest, type CreateAuthorizationRequestBody, type CreateAuthorizationRequestResponse, type CreateAuthorizationResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type
|
|
358
|
+
export { type AuthStatusResponse, type AuthorizationResponse, type ComponentOptions, type CreateAuthorizationRequest, type CreateAuthorizationRequestBody, type CreateAuthorizationRequestResponse, type CreateAuthorizationResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type GetAuthorizationRequestStatus, type GetAuthorizationRequestStatusPathParameters, type ICreateAuthRequestWebappEndpointOpts, type IRequiredContext, type IRequiredPlugins, type ISIOPv2RPRestAPIOpts, type MultipleVpTokenDCQL, type MultipleVpTokens, type QRCodeOpts, type RequestError, SIOPv2RPApiServer, type SingleObjectVpTokenPE, type SingleStringVpTokenPE, type SiopFeatures, type VerifiedData, type VpToken, authStatusUniversalOID4VPEndpoint, createAuthRequestUniversalOID4VPEndpoint, getAuthRequestSIOPv2Endpoint, getDefinitionsEndpoint, removeAuthRequestStateUniversalOID4VPEndpoint, verifyAuthResponseSIOPv2Endpoint };
|
package/dist/index.js
CHANGED
|
@@ -182,9 +182,8 @@ var validateData = /* @__PURE__ */ __name((schema) => {
|
|
|
182
182
|
}, "validateData");
|
|
183
183
|
|
|
184
184
|
// src/schemas/index.ts
|
|
185
|
+
import { CallbackOptsSchema, ResponseMode, ResponseType } from "@sphereon/did-auth-siop";
|
|
185
186
|
import { z } from "zod";
|
|
186
|
-
import { authorizationRequestStatuses, authorizationResponseStatuses } from "@sphereon/ssi-sdk.siopv2-oid4vp-common";
|
|
187
|
-
import { ResponseMode, ResponseType } from "@sphereon/did-auth-siop";
|
|
188
187
|
var ResponseTypeSchema = z.enum([
|
|
189
188
|
ResponseType.VP_TOKEN
|
|
190
189
|
]);
|
|
@@ -197,14 +196,6 @@ var requestUriMethods = [
|
|
|
197
196
|
"post"
|
|
198
197
|
];
|
|
199
198
|
var RequestUriMethodSchema = z.enum(requestUriMethods);
|
|
200
|
-
var AuthorizationStatusSchema = z.enum([
|
|
201
|
-
...authorizationRequestStatuses,
|
|
202
|
-
...authorizationResponseStatuses
|
|
203
|
-
]);
|
|
204
|
-
var CallbackOptsSchema = z.object({
|
|
205
|
-
url: z.string(),
|
|
206
|
-
status: z.array(AuthorizationStatusSchema).optional()
|
|
207
|
-
});
|
|
208
199
|
var QRCodeOptsSchema = z.object({
|
|
209
200
|
size: z.number().optional(),
|
|
210
201
|
color_dark: z.string().optional(),
|
|
@@ -245,6 +236,7 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
245
236
|
const queryId = request.body.query_id;
|
|
246
237
|
const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri;
|
|
247
238
|
const requestUriBase = request.body.request_uri_base;
|
|
239
|
+
const callback = request.body.callback;
|
|
248
240
|
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
249
241
|
filter: [
|
|
250
242
|
{
|
|
@@ -274,7 +266,8 @@ function createAuthRequestUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
274
266
|
responseURI,
|
|
275
267
|
...directPostResponseRedirectUri && {
|
|
276
268
|
responseRedirectURI: directPostResponseRedirectUri
|
|
277
|
-
}
|
|
269
|
+
},
|
|
270
|
+
callback
|
|
278
271
|
});
|
|
279
272
|
let qrCodeDataUri;
|
|
280
273
|
if (qrCodeOpts) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/siop-api-functions.ts","../src/universal-oid4vp-api-functions.ts","../src/middleware/validationMiddleware.ts","../src/schemas/index.ts","../src/siopv2-rp-api-server.ts"],"sourcesContent":["import { AuthorizationResponsePayload } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { CredentialMapper } from '@sphereon/ssi-types'\nimport { Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType === 'application/json') {\n const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n return payload as AuthorizationResponsePayload\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n const payload = request.body as AuthorizationResponsePayload\n\n // Parse presentation_submission if it's a string\n if (typeof payload.presentation_submission === 'string') {\n console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n payload.presentation_submission = JSON.parse(payload.presentation_submission)\n }\n\n // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n if (typeof payload.vp_token === 'string') {\n const { vp_token } = payload\n\n // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n // (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)\n if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n payload.vp_token = JSON.parse(vp_token)\n }\n }\n\n return payload\n }\n\n throw new Error(\n `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n )\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, definitionId, tenantId, version } = request.params\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.log('Authorization Response (siop-sessions')\n console.log(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId, tenantId, version }] })\n if (definitionItems.length === 0) {\n console.log(`Could not get definition ${definitionId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${definitionId}`\n return response.send()\n }\n\n const authorizationResponse = parseAuthorizationResponse(request)\n console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n const definitionItem = definitionItems[0]\n const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n authorizationResponse,\n correlationId,\n dcqlQueryPayload: definitionItem.dcqlPayload,\n })\n\n // FIXME SSISDK-55 add proper support for checking for DCQL presentations\n const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n if (presentation && Object.keys(presentation).length > 0) {\n console.log('PRESENTATIONS:' + JSON.stringify(verifiedResponse?.oid4vpSubmission?.presentation, null, 2))\n response.statusCode = 200\n\n const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {\n presentation_during_issuance_session: verifiedResponse.correlationId,\n }\n if (authorizationResponse.is_first_party) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify(authorizationChallengeValidationResponse))\n }\n\n const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, queryId: definitionId, state: verifiedResponse.state })\n if (responseRedirectURI) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n }\n // todo: delete session\n } else {\n console.log('Missing Presentation (Verifiable Credentials)')\n response.statusCode = 500\n response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n }\n return response.send()\n } catch (error) {\n console.error(error)\n return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n }\n })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getAuthRequest SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-requests/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId = request.params.correlationId\n const definitionId = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId: definitionId,\n errorOnNotFound: false,\n })\n if (!requestState) {\n console.log(\n `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${definitionId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n const requestObject = await requestState.request?.requestObject?.toJwt()\n console.log('JWT Request object:')\n console.log(requestObject)\n\n let error: string | undefined\n try {\n response.statusCode = 200\n response.setHeader('Content-Type', 'application/jwt')\n return response.send(requestObject)\n } catch (e) {\n error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n } finally {\n await context.agent.siopUpdateAuthRequestState({\n correlationId,\n queryId: definitionId,\n state: 'authorization_request_created',\n error,\n })\n }\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n }\n })\n}\n","import { AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport { CreateAuthorizationRequestBodySchema } from './schemas'\nimport {\n CreateAuthorizationRequest,\n CreateAuthorizationRequestResponse,\n CreateAuthorizationResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n GetAuthStatusResponse,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext\n} from './types'\n\nexport function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`createAuthRequest universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests'\n router.post(path, checkAuth(opts?.endpoint), validateData(CreateAuthorizationRequestBodySchema), async (request: CreateAuthorizationRequest, response: CreateAuthorizationResponse) => {\n try {\n const correlationId = request.body.correlation_id ?? uuid.uuid()\n const qrCodeOpts = request.body.qr_code ?? opts?.qrCodeOpts\n const queryId = request.body.query_id\n const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri // TODO Uri not URI\n const requestUriBase = request.body.request_uri_base\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId: queryId }] })\n if (definitionItems.length === 0) {\n console.log(`No query could be found for the given id. Query id: ${queryId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })\n }\n\n const requestByReferenceURI = uriWithBase(`/siop/definitions/${queryId}/auth-requests/${correlationId}`, {\n baseURI: requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/definitions/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })\n\n const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n queryId,\n correlationId,\n nonce: uuid.uuid(),\n requestByReferenceURI,\n responseURIType: 'response_uri',\n responseURI,\n ...(directPostResponseRedirectUri && { responseRedirectURI: directPostResponseRedirectUri }),\n })\n\n let qrCodeDataUri: string | undefined\n if (qrCodeOpts) {\n const { AwesomeQR } = await import('awesome-qr')\n const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })\n qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n }\n\n const authRequestBody = {\n query_id: queryId,\n correlation_id: correlationId,\n request_uri: authRequestURI,\n status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,\n ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),\n } satisfies CreateAuthorizationRequestResponse\n console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n\n return response.status(201).json(authRequestBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)\n }\n })\n}\n\nexport function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests/:correlationId'\n router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {\n try {\n const correlationId: string = request.params.correlationId\n\n const authRequestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n if (!authRequestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n await context.agent.siopDeleteAuthState({ correlationId })\n\n return response.status(204).json()\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`authStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/status/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {\n try {\n console.log('Received auth-status request...')\n const correlationId: string = request.params.correlationId\n\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n\n if (!requestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n let responseState\n if (requestState.status === 'authorization_request_created') {\n responseState = (await context.agent.siopGetAuthResponseState({ correlationId, errorOnNotFound: false }))\n }\n const overallState = responseState ?? requestState\n\n const statusBody = {\n status: overallState.status,\n correlation_id: overallState.correlationId,\n query_id: overallState.queryId,\n last_updated: overallState.lastUpdated,\n ...((responseState?.status === AuthorizationResponseStateStatus.VERIFIED && responseState.verifiedData !== undefined) && { verified_data: responseState.verifiedData }),\n ...(overallState.error && { message: overallState.error.message })\n } satisfies GetAuthStatusResponse\n console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n\n if (overallState.status === 'error') {\n return response.status(500).json(statusBody)\n }\n return response.status(200).json(statusBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getDefinitions universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/definitions'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const definitions = await context.agent.pdmGetDefinitions()\n response.statusCode = 200\n return response.json(definitions)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { z, ZodError } from 'zod';\n\nexport const validateData = (schema: z.ZodObject<any, any>) => {\n return (req: Request, res: Response, next: NextFunction) => {\n try {\n schema.parse(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n const errorMessages = error.issues.map((issue: any) => ({\n message: `${issue.path.join('.')} is ${issue.message}`,\n }))\n res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message });\n } else {\n res.status(500).json({ status: 500, message: 'Internal Server Error' });\n }\n }\n };\n}\n","import { z } from 'zod';\nimport {\n authorizationRequestStatuses,\n authorizationResponseStatuses\n} from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { ResponseMode, ResponseType, RequestUriMethod } from '@sphereon/did-auth-siop'\n\nexport const ResponseTypeSchema = z.enum([ResponseType.VP_TOKEN]);\n\nexport const ResponseModeSchema = z.enum([ResponseMode.DIRECT_POST, ResponseMode.DIRECT_POST_JWT]);\n\nconst requestUriMethods = [\"get\", \"post\"] as const satisfies Array<RequestUriMethod>;\nexport const RequestUriMethodSchema = z.enum(requestUriMethods);\n\nexport const AuthorizationStatusSchema = z.enum([\n ...authorizationRequestStatuses,\n ...authorizationResponseStatuses\n]);\n\nexport const CallbackOptsSchema = z.object({\n url: z.string(),\n status: z.array(AuthorizationStatusSchema).optional(),\n});\n\nexport const QRCodeOptsSchema = z.object({\n size: z.number().optional(),\n color_dark: z.string().optional(),\n color_light: z.string().optional(),\n});\n\nexport const CreateAuthorizationRequestBodySchema = z.object({\n query_id: z.string(),\n client_id: z.string().optional(),\n request_uri_base: z.string().optional(),\n correlation_id: z.string().optional(),\n request_uri_method: RequestUriMethodSchema.optional(),\n response_type: ResponseTypeSchema.optional(),\n response_mode: ResponseModeSchema.optional(),\n transaction_data: z.array(z.string()).optional(),\n qr_code: QRCodeOptsSchema.optional(),\n direct_post_response_redirect_uri: z.string().optional(),\n callback: CallbackOptsSchema.optional(),\n});\n\nexport const CreateAuthorizationResponseSchema = z.object({\n correlation_id: z.string(),\n query_id: z.string(),\n request_uri: z.string(),\n status_uri: z.string(),\n qr_uri: z.string().optional(),\n});\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n authStatusUniversalOID4VPEndpoint,\n createAuthRequestUniversalOID4VPEndpoint,\n getDefinitionsEndpoint,\n removeAuthRequestStateUniversalOID4VPEndpoint,\n} from './universal-oid4vp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n private readonly _express: Express\n private readonly _router: Router\n private readonly _agent: TAgent<IPresentationExchange & ISIOPv2RP>\n private readonly _opts?: ISIOPv2RPRestAPIOpts\n private readonly _basePath: string\n\n private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest'] })\n if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n // Webapp endpoints\n if (features.includes('rp-status')) {\n createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n }\n\n // SIOPv2 endpoints\n if (features.includes('siop')) {\n getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n }\n this._basePath = opts?.endpointOpts?.basePath ?? ''\n this._express.use(this._basePath, this.router)\n this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n this.setupSwaggerUi()\n }\n\n private setupSwaggerUi() {\n fetch(this.OID4VP_SWAGGER_URL)\n .then((res) => res.json())\n .then((swagger: any) => {\n const apiDocs = `${this._basePath}/api-docs`\n console.log(`[OID4P] API docs available at ${apiDocs}`)\n\n this._router.use(\n '/api-docs',\n (req: Request, res: Response, next: any) => {\n const regex = `${apiDocs.replace(/\\//, '\\/')}`.replace('/oid4vp', '').replace(/\\/api-docs.*/, '')\n swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]\n // @ts-ignore\n req.swaggerDoc = swagger\n next()\n },\n swaggerUi.serveFiles(swagger, options),\n swaggerUi.setup(),\n )\n })\n .catch((err) => {\n console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n })\n const options = {\n // customCss: '.swagger-ui .topbar { display: none }',\n }\n }\n get express(): Express {\n return this._express\n }\n\n get router(): Router {\n return this._router\n }\n\n get agent(): TAgent<IPresentationExchange & ISIOPv2RP> {\n return this._agent\n }\n\n get opts(): ISIOPv2RPRestAPIOpts | undefined {\n return this._opts\n }\n}\n"],"mappings":"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","names":["checkAuth","sendErrorResponse","CredentialMapper","parseAuthorizationResponse","request","contentType","header","payload","body","JSON","parse","presentation_submission","console","log","vp_token","startsWith","endsWith","CredentialMapper","isJsonLdAsString","Error","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","definitionId","tenantId","version","params","sendErrorResponse","stringify","definitionItems","agent","pdmGetDefinitions","filter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQueryPayload","dcqlPayload","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","queryId","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","AuthorizationResponseStateStatus","checkAuth","sendErrorResponse","uriWithBase","uuid","ZodError","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","z","authorizationRequestStatuses","authorizationResponseStatuses","ResponseMode","ResponseType","ResponseTypeSchema","enum","VP_TOKEN","ResponseModeSchema","DIRECT_POST","DIRECT_POST_JWT","requestUriMethods","RequestUriMethodSchema","AuthorizationStatusSchema","CallbackOptsSchema","object","url","string","status","array","optional","QRCodeOptsSchema","size","number","color_dark","color_light","CreateAuthorizationRequestBodySchema","query_id","client_id","request_uri_base","correlation_id","request_uri_method","response_type","response_mode","transaction_data","qr_code","direct_post_response_redirect_uri","callback","CreateAuthorizationResponseSchema","request_uri","status_uri","qr_uri","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestBodySchema","request","response","correlationId","body","correlation_id","uuid","qrCodeOpts","qr_code","queryId","query_id","directPostResponseRedirectUri","direct_post_response_redirect_uri","requestUriBase","request_uri_base","definitionItems","agent","pdmGetDefinitions","filter","definitionId","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","responseRedirectURI","qrCodeDataUri","AwesomeQR","qrCode","text","draw","toString","authRequestBody","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","AuthorizationResponseStateStatus","VERIFIED","verifiedData","undefined","verified_data","debug","getDefinitionsEndpoint","definitions","statusCode","agentContext","copyGlobalAuthToEndpoints","express","swaggerUi","SIOPv2RPApiServer","_express","_router","_agent","_opts","_basePath","OID4VP_SWAGGER_URL","args","agent","opts","copyGlobalAuthToEndpoints","keys","endpointOpts","globalAuth","secureSiopEndpoints","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createAuthRequestUniversalOID4VPEndpoint","webappCreateAuthRequest","authStatusUniversalOID4VPEndpoint","webappAuthStatus","removeAuthRequestStateUniversalOID4VPEndpoint","webappDeleteAuthRequest","getDefinitionsEndpoint","webappGetDefinitions","getAuthRequestSIOPv2Endpoint","siopGetAuthRequest","verifyAuthResponseSIOPv2Endpoint","siopVerifyAuthResponse","basePath","use","router","set","trustProxy","setupSwaggerUi","fetch","then","res","json","swagger","apiDocs","req","next","regex","replace","servers","url","protocol","get","description","swaggerDoc","swaggerUi","serveFiles","options","setup","catch","err"]}
|
|
1
|
+
{"version":3,"sources":["../src/siop-api-functions.ts","../src/universal-oid4vp-api-functions.ts","../src/middleware/validationMiddleware.ts","../src/schemas/index.ts","../src/siopv2-rp-api-server.ts"],"sourcesContent":["import { AuthorizationResponsePayload } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { CredentialMapper } from '@sphereon/ssi-types'\nimport { Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType === 'application/json') {\n const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n return payload as AuthorizationResponsePayload\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n const payload = request.body as AuthorizationResponsePayload\n\n // Parse presentation_submission if it's a string\n if (typeof payload.presentation_submission === 'string') {\n console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n payload.presentation_submission = JSON.parse(payload.presentation_submission)\n }\n\n // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n if (typeof payload.vp_token === 'string') {\n const { vp_token } = payload\n\n // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n // (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)\n if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n payload.vp_token = JSON.parse(vp_token)\n }\n }\n\n return payload\n }\n\n throw new Error(\n `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n )\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, definitionId, tenantId, version } = request.params\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.log('Authorization Response (siop-sessions')\n console.log(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId, tenantId, version }] })\n if (definitionItems.length === 0) {\n console.log(`Could not get definition ${definitionId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${definitionId}`\n return response.send()\n }\n\n const authorizationResponse = parseAuthorizationResponse(request)\n console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n const definitionItem = definitionItems[0]\n const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n authorizationResponse,\n correlationId,\n dcqlQueryPayload: definitionItem.dcqlPayload,\n })\n\n // FIXME SSISDK-55 add proper support for checking for DCQL presentations\n const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n if (presentation && Object.keys(presentation).length > 0) {\n console.log('PRESENTATIONS:' + JSON.stringify(verifiedResponse?.oid4vpSubmission?.presentation, null, 2))\n response.statusCode = 200\n\n const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {\n presentation_during_issuance_session: verifiedResponse.correlationId,\n }\n if (authorizationResponse.is_first_party) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify(authorizationChallengeValidationResponse))\n }\n\n const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, queryId: definitionId, state: verifiedResponse.state })\n if (responseRedirectURI) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n }\n // todo: delete session\n } else {\n console.log('Missing Presentation (Verifiable Credentials)')\n response.statusCode = 500\n response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n }\n return response.send()\n } catch (error) {\n console.error(error)\n return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n }\n })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getAuthRequest SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-requests/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId = request.params.correlationId\n const definitionId = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId: definitionId,\n errorOnNotFound: false,\n })\n if (!requestState) {\n console.log(\n `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${definitionId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n const requestObject = await requestState.request?.requestObject?.toJwt()\n console.log('JWT Request object:')\n console.log(requestObject)\n\n let error: string | undefined\n try {\n response.statusCode = 200\n response.setHeader('Content-Type', 'application/jwt')\n return response.send(requestObject)\n } catch (e) {\n error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n } finally {\n await context.agent.siopUpdateAuthRequestState({\n correlationId,\n queryId: definitionId,\n state: 'authorization_request_created',\n error,\n })\n }\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n }\n })\n}\n","import { AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport { CreateAuthorizationRequestBodySchema } from './schemas'\nimport {\n CreateAuthorizationRequest,\n CreateAuthorizationRequestResponse,\n CreateAuthorizationResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n AuthStatusResponse,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext\n} from './types'\n\nexport function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`createAuthRequest universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests'\n router.post(path, checkAuth(opts?.endpoint), validateData(CreateAuthorizationRequestBodySchema), async (request: CreateAuthorizationRequest, response: CreateAuthorizationResponse) => {\n try {\n const correlationId = request.body.correlation_id ?? uuid.uuid()\n const qrCodeOpts = request.body.qr_code ?? opts?.qrCodeOpts\n const queryId = request.body.query_id\n const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri // TODO Uri not URI\n const requestUriBase = request.body.request_uri_base\n const callback = request.body.callback\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId: queryId }] })\n if (definitionItems.length === 0) {\n console.log(`No query could be found for the given id. Query id: ${queryId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })\n }\n\n const requestByReferenceURI = uriWithBase(`/siop/definitions/${queryId}/auth-requests/${correlationId}`, {\n baseURI: requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/definitions/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })\n\n const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n queryId,\n correlationId,\n nonce: uuid.uuid(),\n requestByReferenceURI,\n responseURIType: 'response_uri',\n responseURI,\n ...(directPostResponseRedirectUri && { responseRedirectURI: directPostResponseRedirectUri }),\n callback\n })\n\n let qrCodeDataUri: string | undefined\n if (qrCodeOpts) {\n const { AwesomeQR } = await import('awesome-qr')\n const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })\n qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n }\n\n const authRequestBody = {\n query_id: queryId,\n correlation_id: correlationId,\n request_uri: authRequestURI,\n status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,\n ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),\n } satisfies CreateAuthorizationRequestResponse\n console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n\n return response.status(201).json(authRequestBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)\n }\n })\n}\n\nexport function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/requests/:correlationId'\n router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {\n try {\n const correlationId: string = request.params.correlationId\n\n const authRequestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n if (!authRequestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n await context.agent.siopDeleteAuthState({ correlationId })\n\n return response.status(204).json()\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`authStatus universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/auth/status/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {\n try {\n console.log('Received auth-status request...')\n const correlationId: string = request.params.correlationId\n\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n errorOnNotFound: false\n })\n\n if (!requestState) {\n console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })\n }\n\n let responseState\n if (requestState.status === 'authorization_request_created') {\n responseState = (await context.agent.siopGetAuthResponseState({ correlationId, errorOnNotFound: false }))\n }\n const overallState = responseState ?? requestState\n\n const statusBody = {\n status: overallState.status,\n correlation_id: overallState.correlationId,\n query_id: overallState.queryId,\n last_updated: overallState.lastUpdated,\n ...((responseState?.status === AuthorizationResponseStateStatus.VERIFIED && responseState.verifiedData !== undefined) && { verified_data: responseState.verifiedData }),\n ...(overallState.error && { message: overallState.error.message })\n } satisfies AuthStatusResponse\n console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n\n if (overallState.status === 'error') {\n return response.status(500).json(statusBody)\n }\n return response.status(200).json(statusBody)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n\nexport function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getDefinitions universal OID4VP endpoint is disabled`)\n return\n }\n\n const path = opts?.path ?? '/backend/definitions'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const definitions = await context.agent.pdmGetDefinitions()\n response.statusCode = 200\n return response.json(definitions)\n } catch (error) {\n return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)\n }\n })\n}\n","import { Request, Response, NextFunction } from 'express';\nimport { z, ZodError } from 'zod';\n\nexport const validateData = (schema: z.ZodObject<any, any>) => {\n return (req: Request, res: Response, next: NextFunction) => {\n try {\n schema.parse(req.body);\n next();\n } catch (error) {\n if (error instanceof ZodError) {\n const errorMessages = error.issues.map((issue: any) => ({\n message: `${issue.path.join('.')} is ${issue.message}`,\n }))\n res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message });\n } else {\n res.status(500).json({ status: 500, message: 'Internal Server Error' });\n }\n }\n };\n}\n","import {\n CallbackOptsSchema,\n RequestUriMethod,\n ResponseMode,\n ResponseType\n} from '@sphereon/did-auth-siop'\nimport { z } from 'zod'\n\nexport const ResponseTypeSchema = z.enum([ResponseType.VP_TOKEN]);\n\nexport const ResponseModeSchema = z.enum([ResponseMode.DIRECT_POST, ResponseMode.DIRECT_POST_JWT]);\n\nconst requestUriMethods = ['get', 'post'] as const satisfies Array<RequestUriMethod>;\nexport const RequestUriMethodSchema = z.enum(requestUriMethods);\n\nexport const QRCodeOptsSchema = z.object({\n size: z.number().optional(),\n color_dark: z.string().optional(),\n color_light: z.string().optional(),\n});\n\nexport const CreateAuthorizationRequestBodySchema = z.object({\n query_id: z.string(),\n client_id: z.string().optional(),\n request_uri_base: z.string().optional(),\n correlation_id: z.string().optional(),\n request_uri_method: RequestUriMethodSchema.optional(),\n response_type: ResponseTypeSchema.optional(),\n response_mode: ResponseModeSchema.optional(),\n transaction_data: z.array(z.string()).optional(),\n qr_code: QRCodeOptsSchema.optional(),\n direct_post_response_redirect_uri: z.string().optional(),\n callback: CallbackOptsSchema.optional(),\n});\n\nexport const CreateAuthorizationResponseSchema = z.object({\n correlation_id: z.string(),\n query_id: z.string(),\n request_uri: z.string(),\n status_uri: z.string(),\n qr_uri: z.string().optional(),\n});\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n authStatusUniversalOID4VPEndpoint,\n createAuthRequestUniversalOID4VPEndpoint,\n getDefinitionsEndpoint,\n removeAuthRequestStateUniversalOID4VPEndpoint,\n} from './universal-oid4vp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n private readonly _express: Express\n private readonly _router: Router\n private readonly _agent: TAgent<ISIOPv2RP>\n private readonly _opts?: ISIOPv2RPRestAPIOpts\n private readonly _basePath: string\n\n private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest'] })\n if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n // Webapp endpoints\n if (features.includes('rp-status')) {\n createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n }\n\n // SIOPv2 endpoints\n if (features.includes('siop')) {\n getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n }\n this._basePath = opts?.endpointOpts?.basePath ?? ''\n this._express.use(this._basePath, this.router)\n this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n this.setupSwaggerUi()\n }\n\n private setupSwaggerUi() {\n fetch(this.OID4VP_SWAGGER_URL)\n .then((res) => res.json())\n .then((swagger: any) => {\n const apiDocs = `${this._basePath}/api-docs`\n console.log(`[OID4P] API docs available at ${apiDocs}`)\n\n this._router.use(\n '/api-docs',\n (req: Request, res: Response, next: any) => {\n const regex = `${apiDocs.replace(/\\//, '\\/')}`.replace('/oid4vp', '').replace(/\\/api-docs.*/, '')\n swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]\n // @ts-ignore\n req.swaggerDoc = swagger\n next()\n },\n swaggerUi.serveFiles(swagger, options),\n swaggerUi.setup(),\n )\n })\n .catch((err) => {\n console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n })\n const options = {\n // customCss: '.swagger-ui .topbar { display: none }',\n }\n }\n get express(): Express {\n return this._express\n }\n\n get router(): Router {\n return this._router\n }\n\n get agent(): TAgent<ISIOPv2RP> {\n return this._agent\n }\n\n get opts(): ISIOPv2RPRestAPIOpts | undefined {\n return this._opts\n }\n}\n"],"mappings":"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","names":["checkAuth","sendErrorResponse","CredentialMapper","parseAuthorizationResponse","request","contentType","header","payload","body","JSON","parse","presentation_submission","console","log","vp_token","startsWith","endsWith","CredentialMapper","isJsonLdAsString","Error","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","definitionId","tenantId","version","params","sendErrorResponse","stringify","definitionItems","agent","pdmGetDefinitions","filter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQueryPayload","dcqlPayload","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","queryId","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","AuthorizationResponseStateStatus","checkAuth","sendErrorResponse","uriWithBase","uuid","ZodError","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","CallbackOptsSchema","ResponseMode","ResponseType","z","ResponseTypeSchema","enum","VP_TOKEN","ResponseModeSchema","DIRECT_POST","DIRECT_POST_JWT","requestUriMethods","RequestUriMethodSchema","QRCodeOptsSchema","object","size","number","optional","color_dark","string","color_light","CreateAuthorizationRequestBodySchema","query_id","client_id","request_uri_base","correlation_id","request_uri_method","response_type","response_mode","transaction_data","array","qr_code","direct_post_response_redirect_uri","callback","CreateAuthorizationResponseSchema","request_uri","status_uri","qr_uri","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestBodySchema","request","response","correlationId","body","correlation_id","uuid","qrCodeOpts","qr_code","queryId","query_id","directPostResponseRedirectUri","direct_post_response_redirect_uri","requestUriBase","request_uri_base","callback","definitionItems","agent","pdmGetDefinitions","filter","definitionId","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","responseRedirectURI","qrCodeDataUri","AwesomeQR","qrCode","text","draw","toString","authRequestBody","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","AuthorizationResponseStateStatus","VERIFIED","verifiedData","undefined","verified_data","debug","getDefinitionsEndpoint","definitions","statusCode","agentContext","copyGlobalAuthToEndpoints","express","swaggerUi","SIOPv2RPApiServer","_express","_router","_agent","_opts","_basePath","OID4VP_SWAGGER_URL","args","agent","opts","copyGlobalAuthToEndpoints","keys","endpointOpts","globalAuth","secureSiopEndpoints","expressSupport","express","Router","context","agentContext","features","enableFeatures","console","log","JSON","stringify","includes","createAuthRequestUniversalOID4VPEndpoint","webappCreateAuthRequest","authStatusUniversalOID4VPEndpoint","webappAuthStatus","removeAuthRequestStateUniversalOID4VPEndpoint","webappDeleteAuthRequest","getDefinitionsEndpoint","webappGetDefinitions","getAuthRequestSIOPv2Endpoint","siopGetAuthRequest","verifyAuthResponseSIOPv2Endpoint","siopVerifyAuthResponse","basePath","use","router","set","trustProxy","setupSwaggerUi","fetch","then","res","json","swagger","apiDocs","req","next","regex","replace","servers","url","protocol","get","description","swaggerDoc","swaggerUi","serveFiles","options","setup","catch","err"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api",
|
|
3
|
-
"version": "0.34.1-feature.DIIPv4.
|
|
3
|
+
"version": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@sphereon/did-auth-siop": "0.19.1-feature.DIIPv4.126",
|
|
27
|
-
"@sphereon/ssi-express-support": "0.34.1-feature.DIIPv4.
|
|
28
|
-
"@sphereon/ssi-sdk.core": "0.34.1-feature.DIIPv4.
|
|
29
|
-
"@sphereon/ssi-sdk.credential-validation": "0.34.1-feature.DIIPv4.
|
|
30
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.34.1-feature.DIIPv4.
|
|
31
|
-
"@sphereon/ssi-sdk.pd-manager": "0.34.1-feature.DIIPv4.
|
|
32
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.34.1-feature.DIIPv4.
|
|
33
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.34.1-feature.DIIPv4.
|
|
34
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.34.1-feature.DIIPv4.
|
|
35
|
-
"@sphereon/ssi-types": "0.34.1-feature.DIIPv4.
|
|
27
|
+
"@sphereon/ssi-express-support": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
28
|
+
"@sphereon/ssi-sdk.core": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
29
|
+
"@sphereon/ssi-sdk.credential-validation": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
30
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
31
|
+
"@sphereon/ssi-sdk.pd-manager": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
32
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
33
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
34
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
35
|
+
"@sphereon/ssi-types": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
36
36
|
"@veramo/core": "4.2.0",
|
|
37
37
|
"@veramo/credential-w3c": "4.2.0",
|
|
38
38
|
"awesome-qr": "^2.1.5-rc.0",
|
|
@@ -51,14 +51,12 @@
|
|
|
51
51
|
"@decentralized-identity/ion-sdk": "^0.6.0",
|
|
52
52
|
"@sphereon/did-auth-siop-adapter": "0.19.1-feature.DIIPv4.126",
|
|
53
53
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
54
|
-
"@sphereon/
|
|
55
|
-
"@sphereon/
|
|
56
|
-
"@sphereon/ssi-sdk-ext.
|
|
57
|
-
"@sphereon/ssi-sdk
|
|
58
|
-
"@sphereon/ssi-sdk
|
|
59
|
-
"@sphereon/ssi-sdk.
|
|
60
|
-
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.DIIPv4.152+83b31d2d",
|
|
61
|
-
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.DIIPv4.152+83b31d2d",
|
|
54
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
55
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
56
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
57
|
+
"@sphereon/ssi-sdk.credential-vcdm": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
58
|
+
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
59
|
+
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.DIIPv4.162+cb4c5d44",
|
|
62
60
|
"@types/body-parser": "^1.19.5",
|
|
63
61
|
"@types/cookie-parser": "^1.4.7",
|
|
64
62
|
"@types/cors": "^2.8.17",
|
|
@@ -117,5 +115,5 @@
|
|
|
117
115
|
"OpenID Connect",
|
|
118
116
|
"Authenticator"
|
|
119
117
|
],
|
|
120
|
-
"gitHead": "
|
|
118
|
+
"gitHead": "cb4c5d44790435c33e31006889ab8ea061210cf7"
|
|
121
119
|
}
|
package/src/schemas/index.ts
CHANGED
|
@@ -1,27 +1,18 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
1
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
CallbackOptsSchema,
|
|
3
|
+
RequestUriMethod,
|
|
4
|
+
ResponseMode,
|
|
5
|
+
ResponseType
|
|
6
|
+
} from '@sphereon/did-auth-siop'
|
|
7
|
+
import { z } from 'zod'
|
|
7
8
|
|
|
8
9
|
export const ResponseTypeSchema = z.enum([ResponseType.VP_TOKEN]);
|
|
9
10
|
|
|
10
11
|
export const ResponseModeSchema = z.enum([ResponseMode.DIRECT_POST, ResponseMode.DIRECT_POST_JWT]);
|
|
11
12
|
|
|
12
|
-
const requestUriMethods = [
|
|
13
|
+
const requestUriMethods = ['get', 'post'] as const satisfies Array<RequestUriMethod>;
|
|
13
14
|
export const RequestUriMethodSchema = z.enum(requestUriMethods);
|
|
14
15
|
|
|
15
|
-
export const AuthorizationStatusSchema = z.enum([
|
|
16
|
-
...authorizationRequestStatuses,
|
|
17
|
-
...authorizationResponseStatuses
|
|
18
|
-
]);
|
|
19
|
-
|
|
20
|
-
export const CallbackOptsSchema = z.object({
|
|
21
|
-
url: z.string(),
|
|
22
|
-
status: z.array(AuthorizationStatusSchema).optional(),
|
|
23
|
-
});
|
|
24
|
-
|
|
25
16
|
export const QRCodeOptsSchema = z.object({
|
|
26
17
|
size: z.number().optional(),
|
|
27
18
|
color_dark: z.string().optional(),
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { agentContext } from '@sphereon/ssi-sdk.core'
|
|
2
2
|
import { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'
|
|
3
|
-
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'
|
|
4
3
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
5
4
|
import { TAgent } from '@veramo/core'
|
|
6
5
|
import express, { Express, Request, Response, Router } from 'express'
|
|
@@ -17,7 +16,7 @@ import swaggerUi from 'swagger-ui-express'
|
|
|
17
16
|
export class SIOPv2RPApiServer {
|
|
18
17
|
private readonly _express: Express
|
|
19
18
|
private readonly _router: Router
|
|
20
|
-
private readonly _agent: TAgent<
|
|
19
|
+
private readonly _agent: TAgent<ISIOPv2RP>
|
|
21
20
|
private readonly _opts?: ISIOPv2RPRestAPIOpts
|
|
22
21
|
private readonly _basePath: string
|
|
23
22
|
|
|
@@ -92,7 +91,7 @@ export class SIOPv2RPApiServer {
|
|
|
92
91
|
return this._router
|
|
93
92
|
}
|
|
94
93
|
|
|
95
|
-
get agent(): TAgent<
|
|
94
|
+
get agent(): TAgent<ISIOPv2RP> {
|
|
96
95
|
return this._agent
|
|
97
96
|
}
|
|
98
97
|
|
package/src/types/types.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { IAgentContext, ICredentialVerifier } from '@veramo/core'
|
|
2
2
|
import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'
|
|
3
|
-
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'
|
|
4
3
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
5
4
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager'
|
|
6
5
|
import { AdditionalClaims } from '@sphereon/ssi-types'
|
|
@@ -34,7 +33,7 @@ export interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpt
|
|
|
34
33
|
responseRedirectURI?: string
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP &
|
|
36
|
+
export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPDManager
|
|
38
37
|
export type IRequiredContext = IAgentContext<IRequiredPlugins>
|
|
39
38
|
|
|
40
39
|
export type CreateAuthorizationRequest = Request<Record<string, never>, any, CreateAuthorizationRequestBody, Record<string, never>>
|
|
@@ -63,7 +62,7 @@ export type RequestError = {
|
|
|
63
62
|
error_details?: string
|
|
64
63
|
}
|
|
65
64
|
|
|
66
|
-
export
|
|
65
|
+
export interface AuthStatusResponse {
|
|
67
66
|
status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus
|
|
68
67
|
correlation_id: string
|
|
69
68
|
query_id: string
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
CreateAuthorizationResponse,
|
|
12
12
|
DeleteAuthorizationRequest,
|
|
13
13
|
GetAuthorizationRequestStatus,
|
|
14
|
-
|
|
14
|
+
AuthStatusResponse,
|
|
15
15
|
ICreateAuthRequestWebappEndpointOpts,
|
|
16
16
|
IRequiredContext
|
|
17
17
|
} from './types'
|
|
@@ -30,6 +30,7 @@ export function createAuthRequestUniversalOID4VPEndpoint(router: Router, context
|
|
|
30
30
|
const queryId = request.body.query_id
|
|
31
31
|
const directPostResponseRedirectUri = request.body.direct_post_response_redirect_uri // TODO Uri not URI
|
|
32
32
|
const requestUriBase = request.body.request_uri_base
|
|
33
|
+
const callback = request.body.callback
|
|
33
34
|
|
|
34
35
|
const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId: queryId }] })
|
|
35
36
|
if (definitionItems.length === 0) {
|
|
@@ -50,6 +51,7 @@ export function createAuthRequestUniversalOID4VPEndpoint(router: Router, context
|
|
|
50
51
|
responseURIType: 'response_uri',
|
|
51
52
|
responseURI,
|
|
52
53
|
...(directPostResponseRedirectUri && { responseRedirectURI: directPostResponseRedirectUri }),
|
|
54
|
+
callback
|
|
53
55
|
})
|
|
54
56
|
|
|
55
57
|
let qrCodeDataUri: string | undefined
|
|
@@ -139,7 +141,7 @@ export function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequ
|
|
|
139
141
|
last_updated: overallState.lastUpdated,
|
|
140
142
|
...((responseState?.status === AuthorizationResponseStateStatus.VERIFIED && responseState.verifiedData !== undefined) && { verified_data: responseState.verifiedData }),
|
|
141
143
|
...(overallState.error && { message: overallState.error.message })
|
|
142
|
-
} satisfies
|
|
144
|
+
} satisfies AuthStatusResponse
|
|
143
145
|
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
|
|
144
146
|
|
|
145
147
|
if (overallState.status === 'error') {
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { AuthorizationRequestState, AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'
|
|
2
|
+
import { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
|
|
3
|
+
import { AuthStatusResponse, GenerateAuthRequestURIResponse, uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
4
|
+
import { AuthorizationResponseStateWithVerifiedData, VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
5
|
+
import { shaHasher as defaultHasher } from '@sphereon/ssi-sdk.core'
|
|
6
|
+
import { Request, Response, Router } from 'express'
|
|
7
|
+
import uuid from 'short-uuid'
|
|
8
|
+
import { ICreateAuthRequestWebappEndpointOpts, IRequiredContext } from './types'
|
|
9
|
+
|
|
10
|
+
export function createAuthRequestWebappEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {
|
|
11
|
+
if (opts?.enabled === false) {
|
|
12
|
+
console.log(`createAuthRequest Webapp endpoint is disabled`)
|
|
13
|
+
return
|
|
14
|
+
}
|
|
15
|
+
const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests'
|
|
16
|
+
router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
17
|
+
try {
|
|
18
|
+
// if (!request.agent) throw Error('No agent configured')
|
|
19
|
+
const definitionId = request.params.definitionId
|
|
20
|
+
if (!definitionId) {
|
|
21
|
+
return sendErrorResponse(response, 400, 'No definitionId query parameter provided')
|
|
22
|
+
}
|
|
23
|
+
const state: string = request.body.state ?? uuid.uuid()
|
|
24
|
+
const correlationId = request.body.correlationId ?? state
|
|
25
|
+
const qrCodeOpts = request.body.qrCodeOpts ?? opts?.qrCodeOpts
|
|
26
|
+
|
|
27
|
+
const requestByReferenceURI = uriWithBase(`/siop/definitions/${definitionId}/auth-requests/${state}`, {
|
|
28
|
+
baseURI: opts?.siopBaseURI,
|
|
29
|
+
})
|
|
30
|
+
const responseURI = uriWithBase(`/siop/definitions/${definitionId}/auth-responses/${state}`, { baseURI: opts?.siopBaseURI })
|
|
31
|
+
// first version is for backwards compat
|
|
32
|
+
const responseRedirectURI =
|
|
33
|
+
('response_redirect_uri' in request.body && (request.body.response_redirect_uri as string | undefined)) ??
|
|
34
|
+
('responseRedirectURI' in request.body && (request.body.responseRedirectURI as string | undefined))
|
|
35
|
+
|
|
36
|
+
const authRequestURI = await context.agent.siopCreateAuthRequestURI({
|
|
37
|
+
definitionId,
|
|
38
|
+
correlationId,
|
|
39
|
+
state,
|
|
40
|
+
nonce: uuid.uuid(),
|
|
41
|
+
requestByReferenceURI,
|
|
42
|
+
responseURIType: 'response_uri',
|
|
43
|
+
responseURI,
|
|
44
|
+
...(responseRedirectURI && { responseRedirectURI }),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
let qrCodeDataUri: string | undefined
|
|
48
|
+
if (qrCodeOpts) {
|
|
49
|
+
const { AwesomeQR } = await import('awesome-qr')
|
|
50
|
+
const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })
|
|
51
|
+
qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`
|
|
52
|
+
}
|
|
53
|
+
const authRequestBody: GenerateAuthRequestURIResponse = {
|
|
54
|
+
correlationId,
|
|
55
|
+
state,
|
|
56
|
+
definitionId,
|
|
57
|
+
authRequestURI,
|
|
58
|
+
authStatusURI: `${uriWithBase(opts?.webappAuthStatusPath ?? '/webapp/auth-status', { baseURI: opts?.webappBaseURI })}`,
|
|
59
|
+
...(qrCodeDataUri && { qrCodeDataUri }),
|
|
60
|
+
}
|
|
61
|
+
console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)
|
|
62
|
+
return response.json(authRequestBody)
|
|
63
|
+
} catch (error) {
|
|
64
|
+
return sendErrorResponse(response, 500, 'Could not create an authorization request URI', error)
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function authStatusWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
70
|
+
if (opts?.enabled === false) {
|
|
71
|
+
console.log(`authStatus Webapp endpoint is disabled`)
|
|
72
|
+
return
|
|
73
|
+
}
|
|
74
|
+
const path = opts?.path ?? '/webapp/auth-status'
|
|
75
|
+
router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
76
|
+
try {
|
|
77
|
+
console.log('Received auth-status request...')
|
|
78
|
+
const correlationId: string = request.body.correlationId as string
|
|
79
|
+
const definitionId: string = request.body.definitionId as string
|
|
80
|
+
|
|
81
|
+
const requestState =
|
|
82
|
+
correlationId && definitionId
|
|
83
|
+
? await context.agent.siopGetAuthRequestState({
|
|
84
|
+
correlationId,
|
|
85
|
+
definitionId,
|
|
86
|
+
errorOnNotFound: false,
|
|
87
|
+
})
|
|
88
|
+
: undefined
|
|
89
|
+
if (!requestState || !definitionId || !correlationId) {
|
|
90
|
+
console.log(
|
|
91
|
+
`No authentication request mapping could be found for the given URL. correlation: ${correlationId}, definitionId: ${definitionId}`,
|
|
92
|
+
)
|
|
93
|
+
response.statusCode = 404
|
|
94
|
+
const statusBody: AuthStatusResponse = {
|
|
95
|
+
status: requestState ? requestState.status : 'error',
|
|
96
|
+
error: 'No authentication request mapping could be found for the given URL.',
|
|
97
|
+
correlationId,
|
|
98
|
+
definitionId,
|
|
99
|
+
lastUpdated: requestState ? requestState.lastUpdated : Date.now(),
|
|
100
|
+
}
|
|
101
|
+
return response.json(statusBody)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let includeVerifiedData: VerifiedDataMode = VerifiedDataMode.NONE
|
|
105
|
+
if ('includeVerifiedData' in request.body) {
|
|
106
|
+
includeVerifiedData = request.body.includeVerifiedData as VerifiedDataMode
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
let responseState
|
|
110
|
+
if (requestState.status === 'sent') {
|
|
111
|
+
responseState = (await context.agent.siopGetAuthResponseState({
|
|
112
|
+
correlationId,
|
|
113
|
+
definitionId,
|
|
114
|
+
includeVerifiedData: includeVerifiedData,
|
|
115
|
+
errorOnNotFound: false,
|
|
116
|
+
})) as AuthorizationResponseStateWithVerifiedData
|
|
117
|
+
}
|
|
118
|
+
const overallState: AuthorizationRequestState | AuthorizationResponseStateWithVerifiedData = responseState ?? requestState
|
|
119
|
+
|
|
120
|
+
const statusBody: AuthStatusResponse = {
|
|
121
|
+
status: overallState.status,
|
|
122
|
+
...(overallState.error ? { error: overallState.error?.message } : {}),
|
|
123
|
+
correlationId,
|
|
124
|
+
definitionId,
|
|
125
|
+
lastUpdated: overallState.lastUpdated,
|
|
126
|
+
...(responseState && responseState.status === AuthorizationResponseStateStatus.VERIFIED
|
|
127
|
+
? {
|
|
128
|
+
payload: await responseState.response.mergedPayloads({ hasher: defaultHasher }),
|
|
129
|
+
verifiedData: responseState.verifiedData,
|
|
130
|
+
}
|
|
131
|
+
: {}),
|
|
132
|
+
}
|
|
133
|
+
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
|
|
134
|
+
if (overallState.status === 'error') {
|
|
135
|
+
response.statusCode = 500
|
|
136
|
+
return response.json(statusBody)
|
|
137
|
+
}
|
|
138
|
+
response.statusCode = 200
|
|
139
|
+
return response.json(statusBody)
|
|
140
|
+
} catch (error) {
|
|
141
|
+
return sendErrorResponse(response, 500, error.message, error)
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function removeAuthRequestStateWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
147
|
+
if (opts?.enabled === false) {
|
|
148
|
+
console.log(`removeAuthStatus Webapp endpoint is disabled`)
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests/:correlationId'
|
|
152
|
+
router.delete(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
153
|
+
try {
|
|
154
|
+
const correlationId: string = request.params.correlationId
|
|
155
|
+
const definitionId: string = request.params.definitionId
|
|
156
|
+
if (!correlationId || !definitionId) {
|
|
157
|
+
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)
|
|
158
|
+
return sendErrorResponse(response, 404, 'No authorization request could be found')
|
|
159
|
+
}
|
|
160
|
+
response.statusCode = 200
|
|
161
|
+
return response.json(await context.agent.siopDeleteAuthState({ definitionId, correlationId }))
|
|
162
|
+
} catch (error) {
|
|
163
|
+
return sendErrorResponse(response, 500, error.message, error)
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
169
|
+
if (opts?.enabled === false) {
|
|
170
|
+
console.log(`getDefinitions Webapp endpoint is disabled`)
|
|
171
|
+
return
|
|
172
|
+
}
|
|
173
|
+
const path = opts?.path ?? '/webapp/definitions'
|
|
174
|
+
router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
175
|
+
try {
|
|
176
|
+
const definitions = await context.agent.pdmGetDefinitions()
|
|
177
|
+
response.statusCode = 200
|
|
178
|
+
return response.json(definitions)
|
|
179
|
+
} catch (error) {
|
|
180
|
+
return sendErrorResponse(response, 500, error.message, error)
|
|
181
|
+
}
|
|
182
|
+
})
|
|
183
|
+
}
|