@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.34.1-feature.SSISDK.62.225 → 0.34.1-feature.SSISDK.62.239
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 +20 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -18
- package/dist/index.d.ts +2 -18
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/package.json +20 -20
- package/src/siop-api-functions.ts +10 -3
- package/src/types/types.ts +1 -23
- package/src/universal-oid4vp-api-functions.ts +3 -7
- package/src/webapp-api-functions.ts +0 -181
package/dist/index.cjs
CHANGED
|
@@ -109,7 +109,6 @@ function verifyAuthResponseSIOPv2Endpoint(router, context, opts) {
|
|
|
109
109
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
110
110
|
authorizationResponse,
|
|
111
111
|
correlationId,
|
|
112
|
-
queryId,
|
|
113
112
|
dcqlQuery: definitionItem.query
|
|
114
113
|
});
|
|
115
114
|
const presentation = verifiedResponse?.oid4vpSubmission?.presentation;
|
|
@@ -163,13 +162,27 @@ function getAuthRequestSIOPv2Endpoint(router, context, opts) {
|
|
|
163
162
|
}
|
|
164
163
|
const requestState = await context.agent.siopGetAuthRequestState({
|
|
165
164
|
correlationId,
|
|
166
|
-
queryId,
|
|
167
165
|
errorOnNotFound: false
|
|
168
166
|
});
|
|
169
167
|
if (!requestState) {
|
|
170
168
|
console.log(`No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${queryId}`);
|
|
171
169
|
return (0, import_ssi_express_support.sendErrorResponse)(response, 404, `No authorization request could be found`);
|
|
172
170
|
}
|
|
171
|
+
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
172
|
+
filter: [
|
|
173
|
+
{
|
|
174
|
+
queryId
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
});
|
|
178
|
+
if (definitionItems.length === 0) {
|
|
179
|
+
console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`);
|
|
180
|
+
response.statusCode = 404;
|
|
181
|
+
response.statusMessage = `No definition ${queryId}`;
|
|
182
|
+
return response.send();
|
|
183
|
+
}
|
|
184
|
+
const payload = requestState.request?.requestObject?.getPayload();
|
|
185
|
+
payload.dcql_query = definitionItems[0].query;
|
|
173
186
|
const requestObject = await requestState.request?.requestObject?.toJwt();
|
|
174
187
|
console.log("JWT Request object:");
|
|
175
188
|
console.log(requestObject);
|
|
@@ -184,7 +197,6 @@ function getAuthRequestSIOPv2Endpoint(router, context, opts) {
|
|
|
184
197
|
} finally {
|
|
185
198
|
await context.agent.siopUpdateAuthRequestState({
|
|
186
199
|
correlationId,
|
|
187
|
-
queryId,
|
|
188
200
|
state: "authorization_request_created",
|
|
189
201
|
error
|
|
190
202
|
});
|
|
@@ -200,7 +212,6 @@ __name(getAuthRequestSIOPv2Endpoint, "getAuthRequestSIOPv2Endpoint");
|
|
|
200
212
|
var import_did_auth_siop = require("@sphereon/did-auth-siop");
|
|
201
213
|
var import_ssi_express_support2 = require("@sphereon/ssi-express-support");
|
|
202
214
|
var import_ssi_sdk = require("@sphereon/ssi-sdk.siopv2-oid4vp-common");
|
|
203
|
-
var import_ssi_sdk2 = require("@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth");
|
|
204
215
|
var import_short_uuid = __toESM(require("short-uuid"), 1);
|
|
205
216
|
|
|
206
217
|
// src/middleware/validationMiddleware.ts
|
|
@@ -373,8 +384,7 @@ function authStatusUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
373
384
|
if (requestState.status === import_did_auth_siop.AuthorizationRequestStateStatus.RETRIEVED) {
|
|
374
385
|
responseState = await context.agent.siopGetAuthResponseState({
|
|
375
386
|
correlationId,
|
|
376
|
-
errorOnNotFound: false
|
|
377
|
-
includeVerifiedData: import_ssi_sdk2.VerifiedDataMode.VERIFIED_PRESENTATION
|
|
387
|
+
errorOnNotFound: false
|
|
378
388
|
});
|
|
379
389
|
}
|
|
380
390
|
const overallState = responseState ?? requestState;
|
|
@@ -383,8 +393,8 @@ function authStatusUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
383
393
|
correlation_id: overallState.correlationId,
|
|
384
394
|
query_id: overallState.queryId,
|
|
385
395
|
last_updated: overallState.lastUpdated,
|
|
386
|
-
...
|
|
387
|
-
verified_data:
|
|
396
|
+
..."verifiedData" in overallState && {
|
|
397
|
+
verified_data: overallState.verifiedData
|
|
388
398
|
},
|
|
389
399
|
...overallState.error && {
|
|
390
400
|
message: overallState.error.message
|
|
@@ -426,7 +436,7 @@ function getDefinitionsEndpoint(router, context, opts) {
|
|
|
426
436
|
__name(getDefinitionsEndpoint, "getDefinitionsEndpoint");
|
|
427
437
|
|
|
428
438
|
// src/siopv2-rp-api-server.ts
|
|
429
|
-
var
|
|
439
|
+
var import_ssi_sdk2 = require("@sphereon/ssi-sdk.core");
|
|
430
440
|
var import_ssi_express_support3 = require("@sphereon/ssi-express-support");
|
|
431
441
|
var import_express = __toESM(require("express"), 1);
|
|
432
442
|
var import_swagger_ui_express = __toESM(require("swagger-ui-express"), 1);
|
|
@@ -463,7 +473,7 @@ var SIOPv2RPApiServer = class {
|
|
|
463
473
|
this._opts = opts;
|
|
464
474
|
this._express = args.expressSupport.express;
|
|
465
475
|
this._router = import_express.default.Router();
|
|
466
|
-
const context = (0,
|
|
476
|
+
const context = (0, import_ssi_sdk2.agentContext)(agent);
|
|
467
477
|
const features = opts?.enableFeatures ?? [
|
|
468
478
|
"rp-status",
|
|
469
479
|
"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/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/queries/:queryId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, queryId, tenantId, version } = request.params\n if (!correlationId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.debug('Authorization Response (siop-sessions') // TODO use logger\n console.debug(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n {\n queryId,\n ...(tenantId && { tenantId }),\n ...(version && { version }),\n },\n {\n id: queryId,\n },\n ],\n })\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\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 queryId,\n dcqlQuery: definitionItem.query,\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, 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/queries/:queryId/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 queryId = request.params.queryId\n if (!correlationId || !queryId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId,\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: ${queryId}`,\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: queryId,\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 {\n AuthorizationRequestStateStatus,\n AuthorizationResponseStateStatus,\n CreateAuthorizationRequest,\n createAuthorizationRequestFromPayload,\n CreateAuthorizationRequestPayloadSchema,\n CreateAuthorizationResponsePayload,\n} from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport {\n AuthStatusResponse,\n CreateAuthorizationRequestPayloadRequest,\n CreateAuthorizationResponsePayloadResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext,\n QRCodeOpts,\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(\n path,\n checkAuth(opts?.endpoint),\n validateData(CreateAuthorizationRequestPayloadSchema),\n async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {\n try {\n const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)\n const correlationId = authRequest.correlationId ?? uuid.uuid()\n const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts\n const queryId = authRequest.queryId\n\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n { id: queryId }, // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\n { queryId },\n ],\n })\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/queries/${queryId}/auth-requests/${correlationId}`, {\n baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/queries/${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 ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),\n ...(authRequest.callback && { callback: authRequest.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 } else {\n qrCodeDataUri = authRequestURI\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 CreateAuthorizationResponsePayload\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}\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 === AuthorizationRequestStateStatus.RETRIEVED) {\n responseState = await context.agent.siopGetAuthResponseState({\n correlationId,\n errorOnNotFound: false,\n includeVerifiedData: VerifiedDataMode.VERIFIED_PRESENTATION,\n })\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 &&\n 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 { 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","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","id","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","query","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","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","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestPayloadSchema","request","response","authRequest","createAuthorizationRequestFromPayload","body","correlationId","uuid","qrCodeOpts","qrCode","queryId","definitionItems","agent","pdmGetDefinitions","filter","id","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","draw","toString","authRequestBody","query_id","correlation_id","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","AuthorizationRequestStateStatus","RETRIEVED","siopGetAuthResponseState","includeVerifiedData","VerifiedDataMode","VERIFIED_PRESENTATION","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/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/queries/:queryId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, queryId, tenantId, version } = request.params\n if (!correlationId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.debug('Authorization Response (siop-sessions') // TODO use logger\n console.debug(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n {\n queryId,\n ...(tenantId && { tenantId }),\n ...(version && { version }),\n },\n {\n id: queryId,\n },\n ],\n })\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\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 dcqlQuery: definitionItem.query,\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, 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/queries/:queryId/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 queryId = request.params.queryId\n if (!correlationId || !queryId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\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: ${queryId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ queryId }] });\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\n return response.send()\n }\n const payload = requestState.request?.requestObject?.getPayload()!\n payload.dcql_query = definitionItems[0].query\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 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 {\n AuthorizationRequestStateStatus,\n CreateAuthorizationRequest,\n createAuthorizationRequestFromPayload,\n CreateAuthorizationRequestPayloadSchema,\n CreateAuthorizationResponsePayload,\n} 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 {\n AuthStatusResponse,\n CreateAuthorizationRequestPayloadRequest,\n CreateAuthorizationResponsePayloadResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext,\n QRCodeOpts,\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(\n path,\n checkAuth(opts?.endpoint),\n validateData(CreateAuthorizationRequestPayloadSchema),\n async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {\n try {\n const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)\n const correlationId = authRequest.correlationId ?? uuid.uuid()\n const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts\n const queryId = authRequest.queryId\n\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n { id: queryId }, // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\n { queryId },\n ],\n })\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/queries/${queryId}/auth-requests/${correlationId}`, {\n baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/queries/${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 ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),\n ...(authRequest.callback && { callback: authRequest.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 } else {\n qrCodeDataUri = authRequestURI\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 CreateAuthorizationResponsePayload\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}\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 === AuthorizationRequestStateStatus.RETRIEVED) {\n responseState = await context.agent.siopGetAuthResponseState({\n correlationId,\n errorOnNotFound: false\n })\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 ...('verifiedData' in overallState && { verified_data: overallState.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 { 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","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","id","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","query","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","getPayload","dcql_query","toJwt","e","message","undefined","siopUpdateAuthRequestState","import_ssi_express_support","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestPayloadSchema","request","response","authRequest","createAuthorizationRequestFromPayload","body","correlationId","uuid","qrCodeOpts","qrCode","queryId","definitionItems","agent","pdmGetDefinitions","filter","id","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","draw","toString","authRequestBody","query_id","correlation_id","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","AuthorizationRequestStateStatus","RETRIEVED","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","verified_data","verifiedData","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,10 +1,9 @@
|
|
|
1
1
|
import { ISingleEndpointOpts, GenericAuthArgs, ExpressSupport } from '@sphereon/ssi-express-support';
|
|
2
2
|
import { Request, Response, Router, Express } from 'express';
|
|
3
|
-
import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload } from '@sphereon/did-auth-siop';
|
|
3
|
+
import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload, VerifiedData } from '@sphereon/did-auth-siop';
|
|
4
4
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager';
|
|
5
5
|
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common';
|
|
6
6
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
7
|
-
import { AdditionalClaims } from '@sphereon/ssi-types';
|
|
8
7
|
import { IAgentContext, ICredentialVerifier, TAgent } from '@veramo/core';
|
|
9
8
|
|
|
10
9
|
interface ComponentOptions {
|
|
@@ -260,21 +259,6 @@ interface AuthStatusResponse {
|
|
|
260
259
|
verified_data?: VerifiedData;
|
|
261
260
|
error?: RequestError;
|
|
262
261
|
}
|
|
263
|
-
type VerifiedData = {
|
|
264
|
-
authorization_response?: AuthorizationResponse;
|
|
265
|
-
credential_claims?: AdditionalClaims;
|
|
266
|
-
};
|
|
267
|
-
type AuthorizationResponse = {
|
|
268
|
-
presentation_submission?: Record<string, any>;
|
|
269
|
-
vp_token?: VpToken;
|
|
270
|
-
};
|
|
271
|
-
type SingleObjectVpTokenPE = Record<string, any>;
|
|
272
|
-
type SingleStringVpTokenPE = string;
|
|
273
|
-
type MultipleVpTokens = Array<SingleObjectVpTokenPE> | Array<SingleStringVpTokenPE>;
|
|
274
|
-
type MultipleVpTokenDCQL = {
|
|
275
|
-
[key: string]: MultipleVpTokens;
|
|
276
|
-
};
|
|
277
|
-
type VpToken = SingleObjectVpTokenPE | SingleStringVpTokenPE | MultipleVpTokens | MultipleVpTokenDCQL;
|
|
278
262
|
|
|
279
263
|
declare function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
280
264
|
declare function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
@@ -303,4 +287,4 @@ declare class SIOPv2RPApiServer {
|
|
|
303
287
|
get opts(): ISIOPv2RPRestAPIOpts | undefined;
|
|
304
288
|
}
|
|
305
289
|
|
|
306
|
-
export { type AuthStatusResponse, type
|
|
290
|
+
export { type AuthStatusResponse, type ComponentOptions, type CreateAuthorizationRequestPayloadRequest, type CreateAuthorizationResponsePayloadResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type GetAuthorizationRequestStatus, type GetAuthorizationRequestStatusPathParameters, type ICreateAuthRequestWebappEndpointOpts, type IRequiredContext, type IRequiredPlugins, type ISIOPv2RPRestAPIOpts, type QRCodeOpts, type RequestError, SIOPv2RPApiServer, type SiopFeatures, authStatusUniversalOID4VPEndpoint, createAuthRequestUniversalOID4VPEndpoint, getAuthRequestSIOPv2Endpoint, getDefinitionsEndpoint, removeAuthRequestStateUniversalOID4VPEndpoint, verifyAuthResponseSIOPv2Endpoint };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ISingleEndpointOpts, GenericAuthArgs, ExpressSupport } from '@sphereon/ssi-express-support';
|
|
2
2
|
import { Request, Response, Router, Express } from 'express';
|
|
3
|
-
import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload } from '@sphereon/did-auth-siop';
|
|
3
|
+
import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload, VerifiedData } from '@sphereon/did-auth-siop';
|
|
4
4
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager';
|
|
5
5
|
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common';
|
|
6
6
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth';
|
|
7
|
-
import { AdditionalClaims } from '@sphereon/ssi-types';
|
|
8
7
|
import { IAgentContext, ICredentialVerifier, TAgent } from '@veramo/core';
|
|
9
8
|
|
|
10
9
|
interface ComponentOptions {
|
|
@@ -260,21 +259,6 @@ interface AuthStatusResponse {
|
|
|
260
259
|
verified_data?: VerifiedData;
|
|
261
260
|
error?: RequestError;
|
|
262
261
|
}
|
|
263
|
-
type VerifiedData = {
|
|
264
|
-
authorization_response?: AuthorizationResponse;
|
|
265
|
-
credential_claims?: AdditionalClaims;
|
|
266
|
-
};
|
|
267
|
-
type AuthorizationResponse = {
|
|
268
|
-
presentation_submission?: Record<string, any>;
|
|
269
|
-
vp_token?: VpToken;
|
|
270
|
-
};
|
|
271
|
-
type SingleObjectVpTokenPE = Record<string, any>;
|
|
272
|
-
type SingleStringVpTokenPE = string;
|
|
273
|
-
type MultipleVpTokens = Array<SingleObjectVpTokenPE> | Array<SingleStringVpTokenPE>;
|
|
274
|
-
type MultipleVpTokenDCQL = {
|
|
275
|
-
[key: string]: MultipleVpTokens;
|
|
276
|
-
};
|
|
277
|
-
type VpToken = SingleObjectVpTokenPE | SingleStringVpTokenPE | MultipleVpTokens | MultipleVpTokenDCQL;
|
|
278
262
|
|
|
279
263
|
declare function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
280
264
|
declare function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts): void;
|
|
@@ -303,4 +287,4 @@ declare class SIOPv2RPApiServer {
|
|
|
303
287
|
get opts(): ISIOPv2RPRestAPIOpts | undefined;
|
|
304
288
|
}
|
|
305
289
|
|
|
306
|
-
export { type AuthStatusResponse, type
|
|
290
|
+
export { type AuthStatusResponse, type ComponentOptions, type CreateAuthorizationRequestPayloadRequest, type CreateAuthorizationResponsePayloadResponse, type DeleteAuthorizationRequest, type DeleteAuthorizationRequestPathParameters, type GetAuthorizationRequestStatus, type GetAuthorizationRequestStatusPathParameters, type ICreateAuthRequestWebappEndpointOpts, type IRequiredContext, type IRequiredPlugins, type ISIOPv2RPRestAPIOpts, type QRCodeOpts, type RequestError, SIOPv2RPApiServer, type SiopFeatures, authStatusUniversalOID4VPEndpoint, createAuthRequestUniversalOID4VPEndpoint, getAuthRequestSIOPv2Endpoint, getDefinitionsEndpoint, removeAuthRequestStateUniversalOID4VPEndpoint, verifyAuthResponseSIOPv2Endpoint };
|
package/dist/index.js
CHANGED
|
@@ -69,7 +69,6 @@ function verifyAuthResponseSIOPv2Endpoint(router, context, opts) {
|
|
|
69
69
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
70
70
|
authorizationResponse,
|
|
71
71
|
correlationId,
|
|
72
|
-
queryId,
|
|
73
72
|
dcqlQuery: definitionItem.query
|
|
74
73
|
});
|
|
75
74
|
const presentation = verifiedResponse?.oid4vpSubmission?.presentation;
|
|
@@ -123,13 +122,27 @@ function getAuthRequestSIOPv2Endpoint(router, context, opts) {
|
|
|
123
122
|
}
|
|
124
123
|
const requestState = await context.agent.siopGetAuthRequestState({
|
|
125
124
|
correlationId,
|
|
126
|
-
queryId,
|
|
127
125
|
errorOnNotFound: false
|
|
128
126
|
});
|
|
129
127
|
if (!requestState) {
|
|
130
128
|
console.log(`No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${queryId}`);
|
|
131
129
|
return sendErrorResponse(response, 404, `No authorization request could be found`);
|
|
132
130
|
}
|
|
131
|
+
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
132
|
+
filter: [
|
|
133
|
+
{
|
|
134
|
+
queryId
|
|
135
|
+
}
|
|
136
|
+
]
|
|
137
|
+
});
|
|
138
|
+
if (definitionItems.length === 0) {
|
|
139
|
+
console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`);
|
|
140
|
+
response.statusCode = 404;
|
|
141
|
+
response.statusMessage = `No definition ${queryId}`;
|
|
142
|
+
return response.send();
|
|
143
|
+
}
|
|
144
|
+
const payload = requestState.request?.requestObject?.getPayload();
|
|
145
|
+
payload.dcql_query = definitionItems[0].query;
|
|
133
146
|
const requestObject = await requestState.request?.requestObject?.toJwt();
|
|
134
147
|
console.log("JWT Request object:");
|
|
135
148
|
console.log(requestObject);
|
|
@@ -144,7 +157,6 @@ function getAuthRequestSIOPv2Endpoint(router, context, opts) {
|
|
|
144
157
|
} finally {
|
|
145
158
|
await context.agent.siopUpdateAuthRequestState({
|
|
146
159
|
correlationId,
|
|
147
|
-
queryId,
|
|
148
160
|
state: "authorization_request_created",
|
|
149
161
|
error
|
|
150
162
|
});
|
|
@@ -157,10 +169,9 @@ function getAuthRequestSIOPv2Endpoint(router, context, opts) {
|
|
|
157
169
|
__name(getAuthRequestSIOPv2Endpoint, "getAuthRequestSIOPv2Endpoint");
|
|
158
170
|
|
|
159
171
|
// src/universal-oid4vp-api-functions.ts
|
|
160
|
-
import { AuthorizationRequestStateStatus,
|
|
172
|
+
import { AuthorizationRequestStateStatus, createAuthorizationRequestFromPayload, CreateAuthorizationRequestPayloadSchema } from "@sphereon/did-auth-siop";
|
|
161
173
|
import { checkAuth as checkAuth2, sendErrorResponse as sendErrorResponse2 } from "@sphereon/ssi-express-support";
|
|
162
174
|
import { uriWithBase } from "@sphereon/ssi-sdk.siopv2-oid4vp-common";
|
|
163
|
-
import { VerifiedDataMode } from "@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth";
|
|
164
175
|
import uuid from "short-uuid";
|
|
165
176
|
|
|
166
177
|
// src/middleware/validationMiddleware.ts
|
|
@@ -333,8 +344,7 @@ function authStatusUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
333
344
|
if (requestState.status === AuthorizationRequestStateStatus.RETRIEVED) {
|
|
334
345
|
responseState = await context.agent.siopGetAuthResponseState({
|
|
335
346
|
correlationId,
|
|
336
|
-
errorOnNotFound: false
|
|
337
|
-
includeVerifiedData: VerifiedDataMode.VERIFIED_PRESENTATION
|
|
347
|
+
errorOnNotFound: false
|
|
338
348
|
});
|
|
339
349
|
}
|
|
340
350
|
const overallState = responseState ?? requestState;
|
|
@@ -343,8 +353,8 @@ function authStatusUniversalOID4VPEndpoint(router, context, opts) {
|
|
|
343
353
|
correlation_id: overallState.correlationId,
|
|
344
354
|
query_id: overallState.queryId,
|
|
345
355
|
last_updated: overallState.lastUpdated,
|
|
346
|
-
...
|
|
347
|
-
verified_data:
|
|
356
|
+
..."verifiedData" in overallState && {
|
|
357
|
+
verified_data: overallState.verifiedData
|
|
348
358
|
},
|
|
349
359
|
...overallState.error && {
|
|
350
360
|
message: overallState.error.message
|
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/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/queries/:queryId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, queryId, tenantId, version } = request.params\n if (!correlationId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.debug('Authorization Response (siop-sessions') // TODO use logger\n console.debug(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n {\n queryId,\n ...(tenantId && { tenantId }),\n ...(version && { version }),\n },\n {\n id: queryId,\n },\n ],\n })\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\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 queryId,\n dcqlQuery: definitionItem.query,\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, 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/queries/:queryId/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 queryId = request.params.queryId\n if (!correlationId || !queryId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n queryId,\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: ${queryId}`,\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: queryId,\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 {\n AuthorizationRequestStateStatus,\n AuthorizationResponseStateStatus,\n CreateAuthorizationRequest,\n createAuthorizationRequestFromPayload,\n CreateAuthorizationRequestPayloadSchema,\n CreateAuthorizationResponsePayload,\n} from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { validateData } from './middleware/validationMiddleware'\nimport {\n AuthStatusResponse,\n CreateAuthorizationRequestPayloadRequest,\n CreateAuthorizationResponsePayloadResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext,\n QRCodeOpts,\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(\n path,\n checkAuth(opts?.endpoint),\n validateData(CreateAuthorizationRequestPayloadSchema),\n async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {\n try {\n const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)\n const correlationId = authRequest.correlationId ?? uuid.uuid()\n const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts\n const queryId = authRequest.queryId\n\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n { id: queryId }, // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\n { queryId },\n ],\n })\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/queries/${queryId}/auth-requests/${correlationId}`, {\n baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/queries/${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 ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),\n ...(authRequest.callback && { callback: authRequest.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 } else {\n qrCodeDataUri = authRequestURI\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 CreateAuthorizationResponsePayload\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}\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 === AuthorizationRequestStateStatus.RETRIEVED) {\n responseState = await context.agent.siopGetAuthResponseState({\n correlationId,\n errorOnNotFound: false,\n includeVerifiedData: VerifiedDataMode.VERIFIED_PRESENTATION,\n })\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 &&\n 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 { 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","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","id","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","query","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","toJwt","e","message","undefined","siopUpdateAuthRequestState","AuthorizationRequestStateStatus","AuthorizationResponseStateStatus","createAuthorizationRequestFromPayload","CreateAuthorizationRequestPayloadSchema","checkAuth","sendErrorResponse","uriWithBase","VerifiedDataMode","uuid","ZodError","validateData","schema","req","res","next","parse","body","error","ZodError","errorMessages","issues","map","issue","message","path","join","status","json","error_details","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestPayloadSchema","request","response","authRequest","createAuthorizationRequestFromPayload","body","correlationId","uuid","qrCodeOpts","qrCode","queryId","definitionItems","agent","pdmGetDefinitions","filter","id","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","draw","toString","authRequestBody","query_id","correlation_id","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","AuthorizationRequestStateStatus","RETRIEVED","siopGetAuthResponseState","includeVerifiedData","VerifiedDataMode","VERIFIED_PRESENTATION","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/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/queries/:queryId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, queryId, tenantId, version } = request.params\n if (!correlationId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.debug('Authorization Response (siop-sessions') // TODO use logger\n console.debug(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n {\n queryId,\n ...(tenantId && { tenantId }),\n ...(version && { version }),\n },\n {\n id: queryId,\n },\n ],\n })\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\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 dcqlQuery: definitionItem.query,\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, 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/queries/:queryId/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 queryId = request.params.queryId\n if (!correlationId || !queryId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\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: ${queryId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ queryId }] });\n if (definitionItems.length === 0) {\n console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${queryId}`\n return response.send()\n }\n const payload = requestState.request?.requestObject?.getPayload()!\n payload.dcql_query = definitionItems[0].query\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 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 {\n AuthorizationRequestStateStatus,\n CreateAuthorizationRequest,\n createAuthorizationRequestFromPayload,\n CreateAuthorizationRequestPayloadSchema,\n CreateAuthorizationResponsePayload,\n} 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 {\n AuthStatusResponse,\n CreateAuthorizationRequestPayloadRequest,\n CreateAuthorizationResponsePayloadResponse,\n DeleteAuthorizationRequest,\n GetAuthorizationRequestStatus,\n ICreateAuthRequestWebappEndpointOpts,\n IRequiredContext,\n QRCodeOpts,\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(\n path,\n checkAuth(opts?.endpoint),\n validateData(CreateAuthorizationRequestPayloadSchema),\n async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {\n try {\n const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)\n const correlationId = authRequest.correlationId ?? uuid.uuid()\n const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts\n const queryId = authRequest.queryId\n\n const definitionItems = await context.agent.pdmGetDefinitions({\n filter: [\n { id: queryId }, // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\n { queryId },\n ],\n })\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/queries/${queryId}/auth-requests/${correlationId}`, {\n baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/queries/${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 ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),\n ...(authRequest.callback && { callback: authRequest.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 } else {\n qrCodeDataUri = authRequestURI\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 CreateAuthorizationResponsePayload\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}\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 === AuthorizationRequestStateStatus.RETRIEVED) {\n responseState = await context.agent.siopGetAuthResponseState({\n correlationId,\n errorOnNotFound: false\n })\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 ...('verifiedData' in overallState && { verified_data: overallState.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 { 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","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","id","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","query","presentation","oid4vpSubmission","Object","keys","authorizationChallengeValidationResponse","presentation_during_issuance_session","is_first_party","setHeader","responseRedirectURI","siopGetRedirectURI","state","redirect_uri","error","getAuthRequestSIOPv2Endpoint","get","requestState","siopGetAuthRequestState","errorOnNotFound","requestObject","getPayload","dcql_query","toJwt","e","message","undefined","siopUpdateAuthRequestState","AuthorizationRequestStateStatus","createAuthorizationRequestFromPayload","CreateAuthorizationRequestPayloadSchema","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","createAuthRequestUniversalOID4VPEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","validateData","CreateAuthorizationRequestPayloadSchema","request","response","authRequest","createAuthorizationRequestFromPayload","body","correlationId","uuid","qrCodeOpts","qrCode","queryId","definitionItems","agent","pdmGetDefinitions","filter","id","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","draw","toString","authRequestBody","query_id","correlation_id","request_uri","status_uri","webappAuthStatusPath","webappBaseURI","qr_uri","JSON","stringify","json","error","removeAuthRequestStateUniversalOID4VPEndpoint","delete","params","authRequestState","siopGetAuthRequestState","errorOnNotFound","siopDeleteAuthState","authStatusUniversalOID4VPEndpoint","get","requestState","responseState","AuthorizationRequestStateStatus","RETRIEVED","siopGetAuthResponseState","overallState","statusBody","last_updated","lastUpdated","verified_data","verifiedData","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.SSISDK.62.
|
|
3
|
+
"version": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
"start:dev": "ts-node __tests__/RestAPI.ts"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@sphereon/did-auth-siop": "0.19.1-feature.
|
|
27
|
-
"@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.62.
|
|
28
|
-
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.62.
|
|
29
|
-
"@sphereon/ssi-sdk.credential-validation": "0.34.1-feature.SSISDK.62.
|
|
30
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.34.1-feature.SSISDK.62.
|
|
31
|
-
"@sphereon/ssi-sdk.pd-manager": "0.34.1-feature.SSISDK.62.
|
|
32
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.34.1-feature.SSISDK.62.
|
|
33
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.34.1-feature.SSISDK.62.
|
|
34
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.34.1-feature.SSISDK.62.
|
|
35
|
-
"@sphereon/ssi-types": "0.34.1-feature.SSISDK.62.
|
|
26
|
+
"@sphereon/did-auth-siop": "0.19.1-feature.DIIPv4.173",
|
|
27
|
+
"@sphereon/ssi-express-support": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
28
|
+
"@sphereon/ssi-sdk.core": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
29
|
+
"@sphereon/ssi-sdk.credential-validation": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
30
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
31
|
+
"@sphereon/ssi-sdk.pd-manager": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
32
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
33
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
34
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
35
|
+
"@sphereon/ssi-types": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
36
36
|
"@veramo/core": "4.2.0",
|
|
37
37
|
"@veramo/credential-w3c": "4.2.0",
|
|
38
38
|
"awesome-qr": "^2.1.5-rc.0",
|
|
@@ -49,17 +49,17 @@
|
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@decentralized-identity/ion-sdk": "^0.6.0",
|
|
52
|
-
"@sphereon/did-auth-siop-adapter": "0.19.1-feature.
|
|
52
|
+
"@sphereon/did-auth-siop-adapter": "0.19.1-feature.DIIPv4.173",
|
|
53
53
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
54
54
|
"@sphereon/pex": "5.0.0-unstable.28",
|
|
55
55
|
"@sphereon/pex-models": "^2.3.2",
|
|
56
|
-
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.34.1-feature.SSISDK.62.
|
|
57
|
-
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.34.1-feature.SSISDK.62.
|
|
58
|
-
"@sphereon/ssi-sdk-ext.jwt-service": "0.34.1-feature.SSISDK.62.
|
|
59
|
-
"@sphereon/ssi-sdk.credential-vcdm": "0.34.1-feature.SSISDK.62.
|
|
60
|
-
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.SSISDK.62.
|
|
61
|
-
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.62.
|
|
62
|
-
"@sphereon/ssi-sdk.data-store-types": "0.34.1-feature.SSISDK.62.
|
|
56
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
57
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
58
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
59
|
+
"@sphereon/ssi-sdk.credential-vcdm": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
60
|
+
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
61
|
+
"@sphereon/ssi-sdk.data-store": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
62
|
+
"@sphereon/ssi-sdk.data-store-types": "0.34.1-feature.SSISDK.62.239+f50c542f",
|
|
63
63
|
"@types/body-parser": "^1.19.5",
|
|
64
64
|
"@types/cookie-parser": "^1.4.7",
|
|
65
65
|
"@types/cors": "^2.8.17",
|
|
@@ -118,5 +118,5 @@
|
|
|
118
118
|
"OpenID Connect",
|
|
119
119
|
"Authenticator"
|
|
120
120
|
],
|
|
121
|
-
"gitHead": "
|
|
121
|
+
"gitHead": "f50c542fcad1ecf148f40bfb40293016ba09a257"
|
|
122
122
|
}
|
|
@@ -82,7 +82,6 @@ export function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequi
|
|
|
82
82
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
83
83
|
authorizationResponse,
|
|
84
84
|
correlationId,
|
|
85
|
-
queryId,
|
|
86
85
|
dcqlQuery: definitionItem.query,
|
|
87
86
|
})
|
|
88
87
|
|
|
@@ -135,7 +134,6 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
135
134
|
}
|
|
136
135
|
const requestState = await context.agent.siopGetAuthRequestState({
|
|
137
136
|
correlationId,
|
|
138
|
-
queryId,
|
|
139
137
|
errorOnNotFound: false,
|
|
140
138
|
})
|
|
141
139
|
if (!requestState) {
|
|
@@ -144,6 +142,16 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
144
142
|
)
|
|
145
143
|
return sendErrorResponse(response, 404, `No authorization request could be found`)
|
|
146
144
|
}
|
|
145
|
+
|
|
146
|
+
const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ queryId }] });
|
|
147
|
+
if (definitionItems.length === 0) {
|
|
148
|
+
console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)
|
|
149
|
+
response.statusCode = 404
|
|
150
|
+
response.statusMessage = `No definition ${queryId}`
|
|
151
|
+
return response.send()
|
|
152
|
+
}
|
|
153
|
+
const payload = requestState.request?.requestObject?.getPayload()!
|
|
154
|
+
payload.dcql_query = definitionItems[0].query
|
|
147
155
|
const requestObject = await requestState.request?.requestObject?.toJwt()
|
|
148
156
|
console.log('JWT Request object:')
|
|
149
157
|
console.log(requestObject)
|
|
@@ -159,7 +167,6 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
159
167
|
} finally {
|
|
160
168
|
await context.agent.siopUpdateAuthRequestState({
|
|
161
169
|
correlationId,
|
|
162
|
-
queryId: queryId,
|
|
163
170
|
state: 'authorization_request_created',
|
|
164
171
|
error,
|
|
165
172
|
})
|
package/src/types/types.ts
CHANGED
|
@@ -3,10 +3,10 @@ import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-supp
|
|
|
3
3
|
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager'
|
|
4
4
|
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
5
5
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
6
|
-
import { AdditionalClaims } from '@sphereon/ssi-types'
|
|
7
6
|
import { IAgentContext, ICredentialVerifier } from '@veramo/core'
|
|
8
7
|
import { Request, Response } from 'express'
|
|
9
8
|
import { QRCodeOpts } from './QRCode.types'
|
|
9
|
+
import { VerifiedData } from '@sphereon/did-auth-siop'
|
|
10
10
|
|
|
11
11
|
export type SiopFeatures = 'rp-status' | 'siop'
|
|
12
12
|
|
|
@@ -65,25 +65,3 @@ export interface AuthStatusResponse {
|
|
|
65
65
|
verified_data?: VerifiedData
|
|
66
66
|
error?: RequestError
|
|
67
67
|
}
|
|
68
|
-
|
|
69
|
-
export type VerifiedData = {
|
|
70
|
-
authorization_response?: AuthorizationResponse
|
|
71
|
-
credential_claims?: AdditionalClaims
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export type AuthorizationResponse = {
|
|
75
|
-
presentation_submission?: Record<string, any>
|
|
76
|
-
vp_token?: VpToken
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export type SingleObjectVpTokenPE = Record<string, any>
|
|
80
|
-
|
|
81
|
-
export type SingleStringVpTokenPE = string
|
|
82
|
-
|
|
83
|
-
export type MultipleVpTokens = Array<SingleObjectVpTokenPE> | Array<SingleStringVpTokenPE>
|
|
84
|
-
|
|
85
|
-
export type MultipleVpTokenDCQL = {
|
|
86
|
-
[key: string]: MultipleVpTokens
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export type VpToken = SingleObjectVpTokenPE | SingleStringVpTokenPE | MultipleVpTokens | MultipleVpTokenDCQL
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AuthorizationRequestStateStatus,
|
|
3
|
-
AuthorizationResponseStateStatus,
|
|
4
3
|
CreateAuthorizationRequest,
|
|
5
4
|
createAuthorizationRequestFromPayload,
|
|
6
5
|
CreateAuthorizationRequestPayloadSchema,
|
|
@@ -8,7 +7,6 @@ import {
|
|
|
8
7
|
} from '@sphereon/did-auth-siop'
|
|
9
8
|
import { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
|
|
10
9
|
import { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
11
|
-
import { VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
12
10
|
import { Request, Response, Router } from 'express'
|
|
13
11
|
import uuid from 'short-uuid'
|
|
14
12
|
import { validateData } from './middleware/validationMiddleware'
|
|
@@ -149,8 +147,7 @@ export function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequ
|
|
|
149
147
|
if (requestState.status === AuthorizationRequestStateStatus.RETRIEVED) {
|
|
150
148
|
responseState = await context.agent.siopGetAuthResponseState({
|
|
151
149
|
correlationId,
|
|
152
|
-
errorOnNotFound: false
|
|
153
|
-
includeVerifiedData: VerifiedDataMode.VERIFIED_PRESENTATION,
|
|
150
|
+
errorOnNotFound: false
|
|
154
151
|
})
|
|
155
152
|
}
|
|
156
153
|
const overallState = responseState ?? requestState
|
|
@@ -160,9 +157,8 @@ export function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequ
|
|
|
160
157
|
correlation_id: overallState.correlationId,
|
|
161
158
|
query_id: overallState.queryId,
|
|
162
159
|
last_updated: overallState.lastUpdated,
|
|
163
|
-
...(
|
|
164
|
-
|
|
165
|
-
...(overallState.error && { message: overallState.error.message }),
|
|
160
|
+
...('verifiedData' in overallState && { verified_data: overallState.verifiedData }),
|
|
161
|
+
...(overallState.error && { message: overallState.error.message })
|
|
166
162
|
} satisfies AuthStatusResponse
|
|
167
163
|
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
|
|
168
164
|
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { AuthorizationRequestState, AuthorizationResponseStateStatus, AuthorizationResponseStateWithVerifiedData } 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 { 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/queries/:queryId/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 queryId = request.params.queryId
|
|
20
|
-
if (!queryId) {
|
|
21
|
-
return sendErrorResponse(response, 400, 'No queryId 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/queries/${queryId}/auth-requests/${state}`, {
|
|
28
|
-
baseURI: opts?.siopBaseURI,
|
|
29
|
-
})
|
|
30
|
-
const responseURI = uriWithBase(`/siop/queries/${queryId}/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
|
-
queryId,
|
|
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
|
-
queryId,
|
|
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 queryId: string = request.body.queryId as string
|
|
80
|
-
|
|
81
|
-
const requestState =
|
|
82
|
-
correlationId && queryId
|
|
83
|
-
? await context.agent.siopGetAuthRequestState({
|
|
84
|
-
correlationId,
|
|
85
|
-
queryId,
|
|
86
|
-
errorOnNotFound: false,
|
|
87
|
-
})
|
|
88
|
-
: undefined
|
|
89
|
-
if (!requestState || !queryId || !correlationId) {
|
|
90
|
-
console.log(`No authentication request mapping could be found for the given URL. correlation: ${correlationId}, queryId: ${queryId}`)
|
|
91
|
-
response.statusCode = 404
|
|
92
|
-
const statusBody: AuthStatusResponse = {
|
|
93
|
-
status: requestState ? requestState.status : 'error',
|
|
94
|
-
error: 'No authentication request mapping could be found for the given URL.',
|
|
95
|
-
correlationId,
|
|
96
|
-
queryId,
|
|
97
|
-
lastUpdated: requestState ? requestState.lastUpdated : Date.now(),
|
|
98
|
-
}
|
|
99
|
-
return response.json(statusBody)
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
let includeVerifiedData: VerifiedDataMode = VerifiedDataMode.NONE
|
|
103
|
-
if ('includeVerifiedData' in request.body) {
|
|
104
|
-
includeVerifiedData = request.body.includeVerifiedData as VerifiedDataMode
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
let responseState
|
|
108
|
-
if (requestState.status === 'authorization_request_retrieved') {
|
|
109
|
-
responseState = (await context.agent.siopGetAuthResponseState({
|
|
110
|
-
correlationId,
|
|
111
|
-
queryId,
|
|
112
|
-
includeVerifiedData: includeVerifiedData,
|
|
113
|
-
errorOnNotFound: false,
|
|
114
|
-
})) as AuthorizationResponseStateWithVerifiedData
|
|
115
|
-
}
|
|
116
|
-
const overallState: AuthorizationRequestState | AuthorizationResponseStateWithVerifiedData = responseState ?? requestState
|
|
117
|
-
|
|
118
|
-
const statusBody: AuthStatusResponse = {
|
|
119
|
-
status: overallState.status,
|
|
120
|
-
...(overallState.error ? { error: overallState.error?.message } : {}),
|
|
121
|
-
correlationId,
|
|
122
|
-
queryId,
|
|
123
|
-
lastUpdated: overallState.lastUpdated,
|
|
124
|
-
...(responseState && responseState.status === AuthorizationResponseStateStatus.VERIFIED
|
|
125
|
-
? {
|
|
126
|
-
payload: await responseState.response.mergedPayloads({ hasher: defaultHasher }),
|
|
127
|
-
verifiedData: responseState.verifiedData,
|
|
128
|
-
}
|
|
129
|
-
: {}),
|
|
130
|
-
}
|
|
131
|
-
console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
|
|
132
|
-
if (overallState.status === 'error') {
|
|
133
|
-
response.statusCode = 500
|
|
134
|
-
return response.json(statusBody)
|
|
135
|
-
}
|
|
136
|
-
response.statusCode = 200
|
|
137
|
-
return response.json(statusBody)
|
|
138
|
-
} catch (error) {
|
|
139
|
-
return sendErrorResponse(response, 500, error.message, error)
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
export function removeAuthRequestStateWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
145
|
-
if (opts?.enabled === false) {
|
|
146
|
-
console.log(`removeAuthStatus Webapp endpoint is disabled`)
|
|
147
|
-
return
|
|
148
|
-
}
|
|
149
|
-
const path = opts?.path ?? '/webapp/queries/:queryId/auth-requests/:correlationId'
|
|
150
|
-
router.delete(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
151
|
-
try {
|
|
152
|
-
const correlationId: string = request.params.correlationId
|
|
153
|
-
const queryId: string = request.params.queryId
|
|
154
|
-
if (!correlationId || !queryId) {
|
|
155
|
-
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)
|
|
156
|
-
return sendErrorResponse(response, 404, 'No authorization request could be found')
|
|
157
|
-
}
|
|
158
|
-
response.statusCode = 200
|
|
159
|
-
return response.json(await context.agent.siopDeleteAuthState({ queryId, correlationId }))
|
|
160
|
-
} catch (error) {
|
|
161
|
-
return sendErrorResponse(response, 500, error.message, error)
|
|
162
|
-
}
|
|
163
|
-
})
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
167
|
-
if (opts?.enabled === false) {
|
|
168
|
-
console.log(`getDefinitions Webapp endpoint is disabled`)
|
|
169
|
-
return
|
|
170
|
-
}
|
|
171
|
-
const path = opts?.path ?? '/webapp/queries'
|
|
172
|
-
router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
173
|
-
try {
|
|
174
|
-
const definitions = await context.agent.pdmGetDefinitions()
|
|
175
|
-
response.statusCode = 200
|
|
176
|
-
return response.json(definitions)
|
|
177
|
-
} catch (error) {
|
|
178
|
-
return sendErrorResponse(response, 500, error.message, error)
|
|
179
|
-
}
|
|
180
|
-
})
|
|
181
|
-
}
|