@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.34.1-next.88 → 0.36.0
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 +209 -144
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -9
- package/dist/index.d.ts +40 -9
- package/dist/index.js +208 -143
- package/dist/index.js.map +1 -1
- package/package.json +23 -18
- package/src/index.ts +1 -1
- package/src/middleware/validationMiddleware.ts +20 -0
- package/src/siop-api-functions.ts +52 -29
- package/src/siopv2-rp-api-server.ts +9 -10
- package/src/types/types.ts +38 -3
- package/src/universal-oid4vp-api-functions.ts +194 -0
- package/src/webapp-api-functions.ts +0 -183
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/siop-api-functions.ts","../src/webapp-api-functions.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 { CredentialMapper } from '@sphereon/ssi-types'\nimport { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { Request, Response, Router } from 'express'\nimport { IRequiredContext } from './types'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType === 'application/json') {\n const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body\n return payload as AuthorizationResponsePayload\n }\n\n if (contentType === 'application/x-www-form-urlencoded') {\n const payload = request.body as AuthorizationResponsePayload\n\n // Parse presentation_submission if it's a string\n if (typeof payload.presentation_submission === 'string') {\n console.log(`Supplied presentation_submission was a string instead of JSON. Correcting, but external party should fix their implementation!`)\n payload.presentation_submission = JSON.parse(payload.presentation_submission)\n }\n\n // when using FORM_URL_ENCODED, vp_token comes back as string not matter whether the input was string, object or array. Handled below.\n if (typeof payload.vp_token === 'string') {\n const { vp_token } = payload\n\n // The only use case where vp_object is an object is JsonLdAsString atm. For arrays, any objects will be parsed along with the array\n // (Leaving the vp_token JsonLdAsString causes problems because the original credential will remain string and will be interpreted as JWT in some parts of the code)\n if ((vp_token.startsWith('[') && vp_token.endsWith(']')) || CredentialMapper.isJsonLdAsString(vp_token)) {\n payload.vp_token = JSON.parse(vp_token)\n }\n }\n\n return payload\n }\n\n throw new Error(\n `Unsupported content type: ${contentType}. Currently only application/x-www-form-urlencoded and application/json (for direct_post) are supported`,\n )\n}\n\nexport function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`verifyAuthResponse SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-responses/:correlationId'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const { correlationId, definitionId, tenantId, version, credentialQueryId } = request.params // TODO Can credentialQueryId be a request param\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n console.log('Authorization Response (siop-sessions')\n console.log(JSON.stringify(request.body, null, 2))\n const definitionItems = await context.agent.pdmGetDefinitions({ filter: [{ definitionId, tenantId, version }] })\n if (definitionItems.length === 0) {\n console.log(`Could not get definition ${definitionId} from agent. Will return 404`)\n response.statusCode = 404\n response.statusMessage = `No definition ${definitionId}`\n return response.send()\n }\n\n const authorizationResponse = parseAuthorizationResponse(request)\n console.log(`URI: ${JSON.stringify(authorizationResponse)}`)\n\n const definitionItem = definitionItems[0]\n const verifiedResponse = await context.agent.siopVerifyAuthResponse({\n authorizationResponse,\n correlationId,\n definitionId,\n dcqlQuery: definitionItem.dcqlPayload,\n })\n\n const wrappedPresentation = verifiedResponse?.oid4vpSubmission?.presentation[credentialQueryId]\n if (wrappedPresentation) {\n // const credentialSubject = wrappedPresentation.presentation.verifiableCredential[0]?.credential?.credentialSubject\n // console.log(JSON.stringify(credentialSubject, null, 2))\n console.log('PRESENTATION:' + JSON.stringify(wrappedPresentation.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, definitionId, state: verifiedResponse.state })\n if (responseRedirectURI) {\n response.setHeader('Content-Type', 'application/json')\n return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))\n }\n // todo: delete session\n } else {\n console.log('Missing Presentation (Verifiable Credentials)')\n response.statusCode = 500\n response.statusMessage = 'Missing Presentation (Verifiable Credentials)'\n }\n return response.send()\n } catch (error) {\n console.error(error)\n return sendErrorResponse(response, 500, 'Could not verify auth status', error)\n }\n })\n}\n\nexport function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`getAuthRequest SIOP endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/siop/definitions/:definitionId/auth-requests/:correlationId'\n router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId = request.params.correlationId\n const definitionId = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n const requestState = await context.agent.siopGetAuthRequestState({\n correlationId,\n definitionId,\n errorOnNotFound: false,\n })\n if (!requestState) {\n console.log(\n `No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${definitionId}`,\n )\n return sendErrorResponse(response, 404, `No authorization request could be found`)\n }\n const requestObject = await requestState.request?.requestObject?.toJwt()\n console.log('JWT Request object:')\n console.log(requestObject)\n\n let error: string | undefined\n try {\n response.statusCode = 200\n response.setHeader('Content-Type', 'application/jwt')\n return response.send(requestObject)\n } catch (e) {\n error = typeof e === 'string' ? e : e instanceof Error ? e.message : undefined\n return sendErrorResponse(response, 500, 'Could not get authorization request', e)\n } finally {\n await context.agent.siopUpdateAuthRequestState({\n correlationId,\n definitionId,\n state: 'sent',\n error,\n })\n }\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not get authorization request', error)\n }\n })\n}\n","import { AuthorizationRequestState, AuthorizationResponseStateStatus } from '@sphereon/did-auth-siop'\nimport { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'\nimport { AuthStatusResponse, GenerateAuthRequestURIResponse, uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'\nimport { AuthorizationResponseStateWithVerifiedData, VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { Request, Response, Router } from 'express'\nimport uuid from 'short-uuid'\nimport { ICreateAuthRequestWebappEndpointOpts, IRequiredContext } from './types'\nimport { shaHasher as defaultHasher } from '@sphereon/ssi-sdk.core'\n\nexport function createAuthRequestWebappEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`createAuthRequest Webapp endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n // if (!request.agent) throw Error('No agent configured')\n const definitionId = request.params.definitionId\n if (!definitionId) {\n return sendErrorResponse(response, 400, 'No definitionId query parameter provided')\n }\n const state: string = request.body.state ?? uuid.uuid()\n const correlationId = request.body.correlationId ?? state\n const qrCodeOpts = request.body.qrCodeOpts ?? opts?.qrCodeOpts\n\n const requestByReferenceURI = uriWithBase(`/siop/definitions/${definitionId}/auth-requests/${state}`, {\n baseURI: opts?.siopBaseURI,\n })\n const responseURI = uriWithBase(`/siop/definitions/${definitionId}/auth-responses/${state}`, { baseURI: opts?.siopBaseURI })\n // first version is for backwards compat\n const responseRedirectURI =\n ('response_redirect_uri' in request.body && (request.body.response_redirect_uri as string | undefined)) ??\n ('responseRedirectURI' in request.body && (request.body.responseRedirectURI as string | undefined))\n\n const authRequestURI = await context.agent.siopCreateAuthRequestURI({\n definitionId,\n correlationId,\n state,\n nonce: uuid.uuid(),\n requestByReferenceURI,\n responseURIType: 'response_uri',\n responseURI,\n ...(responseRedirectURI && { responseRedirectURI }),\n })\n\n let qrCodeDataUri: string | undefined\n if (qrCodeOpts) {\n const { AwesomeQR } = await import('awesome-qr')\n const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })\n qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`\n }\n const authRequestBody: GenerateAuthRequestURIResponse = {\n correlationId,\n state,\n definitionId,\n authRequestURI,\n authStatusURI: `${uriWithBase(opts?.webappAuthStatusPath ?? '/webapp/auth-status', { baseURI: opts?.webappBaseURI })}`,\n ...(qrCodeDataUri && { qrCodeDataUri }),\n }\n console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)\n return response.json(authRequestBody)\n } catch (error) {\n return sendErrorResponse(response, 500, 'Could not create an authorization request URI', error)\n }\n })\n}\n\nexport function authStatusWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`authStatus Webapp endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/webapp/auth-status'\n router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n console.log('Received auth-status request...')\n const correlationId: string = request.body.correlationId as string\n const definitionId: string = request.body.definitionId as string\n\n const requestState =\n correlationId && definitionId\n ? await context.agent.siopGetAuthRequestState({\n correlationId,\n definitionId,\n errorOnNotFound: false,\n })\n : undefined\n if (!requestState || !definitionId || !correlationId) {\n console.log(\n `No authentication request mapping could be found for the given URL. correlation: ${correlationId}, definitionId: ${definitionId}`,\n )\n response.statusCode = 404\n const statusBody: AuthStatusResponse = {\n status: requestState ? requestState.status : 'error',\n error: 'No authentication request mapping could be found for the given URL.',\n correlationId,\n definitionId,\n lastUpdated: requestState ? requestState.lastUpdated : Date.now(),\n }\n return response.json(statusBody)\n }\n\n let includeVerifiedData: VerifiedDataMode = VerifiedDataMode.NONE\n if ('includeVerifiedData' in request.body) {\n includeVerifiedData = request.body.includeVerifiedData as VerifiedDataMode\n }\n\n let responseState\n if (requestState.status === 'sent') {\n responseState = (await context.agent.siopGetAuthResponseState({\n correlationId,\n definitionId,\n includeVerifiedData: includeVerifiedData,\n errorOnNotFound: false,\n })) as AuthorizationResponseStateWithVerifiedData\n }\n const overallState: AuthorizationRequestState | AuthorizationResponseStateWithVerifiedData = responseState ?? requestState\n\n const statusBody: AuthStatusResponse = {\n status: overallState.status,\n ...(overallState.error ? { error: overallState.error?.message } : {}),\n correlationId,\n definitionId,\n lastUpdated: overallState.lastUpdated,\n ...(responseState && responseState.status === AuthorizationResponseStateStatus.VERIFIED\n ? {\n payload: await responseState.response.mergedPayloads({ hasher: defaultHasher }),\n verifiedData: responseState.verifiedData,\n }\n : {}),\n }\n console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)\n if (overallState.status === 'error') {\n response.statusCode = 500\n return response.json(statusBody)\n }\n response.statusCode = 200\n return response.json(statusBody)\n } catch (error) {\n return sendErrorResponse(response, 500, error.message, error)\n }\n })\n}\n\nexport function removeAuthRequestStateWebappEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {\n if (opts?.enabled === false) {\n console.log(`removeAuthStatus Webapp endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/webapp/definitions/:definitionId/auth-requests/:correlationId'\n router.delete(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {\n try {\n const correlationId: string = request.params.correlationId\n const definitionId: string = request.params.definitionId\n if (!correlationId || !definitionId) {\n console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, definitionId: ${definitionId}`)\n return sendErrorResponse(response, 404, 'No authorization request could be found')\n }\n response.statusCode = 200\n return response.json(await context.agent.siopDeleteAuthState({ definitionId, correlationId }))\n } catch (error) {\n return sendErrorResponse(response, 500, 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 Webapp endpoint is disabled`)\n return\n }\n const path = opts?.path ?? '/webapp/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, error.message, error)\n }\n })\n}\n","import { agentContext } from '@sphereon/ssi-sdk.core'\nimport { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'\nimport { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'\nimport { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'\nimport { TAgent } from '@veramo/core'\nimport express, { Express, Request, Response, Router } from 'express'\nimport { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'\nimport { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'\nimport {\n authStatusWebappEndpoint,\n createAuthRequestWebappEndpoint,\n getDefinitionsEndpoint,\n removeAuthRequestStateWebappEndpoint,\n} from './webapp-api-functions'\nimport swaggerUi from 'swagger-ui-express'\n\nexport class SIOPv2RPApiServer {\n private readonly _express: Express\n private readonly _router: Router\n private readonly _agent: TAgent<IPresentationExchange & ISIOPv2RP>\n private readonly _opts?: ISIOPv2RPRestAPIOpts\n private readonly _basePath: string\n\n private readonly OID4VP_SWAGGER_URL = 'https://api.swaggerhub.com/apis/SphereonInt/OID4VP/0.1.0'\n constructor(args: { agent: TAgent<IRequiredPlugins>; expressSupport: ExpressSupport; opts?: ISIOPv2RPRestAPIOpts }) {\n const { agent, opts } = args\n this._agent = agent\n copyGlobalAuthToEndpoints({ opts, keys: ['webappCreateAuthRequest', 'webappAuthStatus', 'webappDeleteAuthRequest'] })\n if (opts?.endpointOpts?.globalAuth?.secureSiopEndpoints) {\n copyGlobalAuthToEndpoints({ opts, keys: ['siopGetAuthRequest', 'siopVerifyAuthResponse'] })\n }\n\n this._opts = opts\n this._express = args.expressSupport.express\n this._router = express.Router()\n const context = agentContext(agent)\n\n const features = opts?.enableFeatures ?? ['rp-status', 'siop']\n console.log(`SIOPv2 API enabled, with features: ${JSON.stringify(features)}}`)\n\n // Webapp endpoints\n if (features.includes('rp-status')) {\n createAuthRequestWebappEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)\n authStatusWebappEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)\n removeAuthRequestStateWebappEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)\n getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)\n }\n\n // SIOPv2 endpoints\n if (features.includes('siop')) {\n getAuthRequestSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopGetAuthRequest)\n verifyAuthResponseSIOPv2Endpoint(this._router, context, opts?.endpointOpts?.siopVerifyAuthResponse)\n }\n this._basePath = opts?.endpointOpts?.basePath ?? ''\n this._express.use(this._basePath, this.router)\n this._express.set('trust proxy', opts?.endpointOpts?.trustProxy ?? true)\n this.setupSwaggerUi()\n }\n\n private setupSwaggerUi() {\n fetch(this.OID4VP_SWAGGER_URL)\n .then((res) => res.json())\n .then((swagger: any) => {\n const apiDocs = `${this._basePath}/api-docs`\n console.log(`[OID4P] API docs available at ${apiDocs}`)\n\n this._router.use(\n '/api-docs',\n (req: Request, res: Response, next: any) => {\n const regex = `${apiDocs.replace(/\\//, '\\/')}`.replace('/oid4vp', '').replace(/\\/api-docs.*/, '')\n swagger.servers = [{ url: `${req.protocol}://${req.get('host')}${regex}`, description: 'This server' }]\n // @ts-ignore\n req.swaggerDoc = swagger\n next()\n },\n swaggerUi.serveFiles(swagger, options),\n swaggerUi.setup(),\n )\n })\n .catch((err) => {\n console.log(`[OID4VP] Unable to fetch swagger document: ${err}. Will not host api-docs on this instance`)\n })\n const options = {\n // customCss: '.swagger-ui .topbar { display: none }',\n }\n }\n get express(): Express {\n return this._express\n }\n\n get router(): Router {\n return this._router\n }\n\n get agent(): TAgent<IPresentationExchange & ISIOPv2RP> {\n return this._agent\n }\n\n get opts(): ISIOPv2RPRestAPIOpts | undefined {\n return this._opts\n }\n}\n"],"mappings":";;;;AACA,SAASA,WAAgCC,yBAAyB;AAClE,SAASC,wBAAwB;AAKjC,IAAMC,6BAA6B,wBAACC,YAAAA;AAClC,QAAMC,cAAcD,QAAQE,OAAO,cAAA;AAEnC,MAAID,gBAAgB,oBAAoB;AACtC,UAAME,UAAU,OAAOH,QAAQI,SAAS,WAAWC,KAAKC,MAAMN,QAAQI,IAAI,IAAIJ,QAAQI;AACtF,WAAOD;EACT;AAEA,MAAIF,gBAAgB,qCAAqC;AACvD,UAAME,UAAUH,QAAQI;AAGxB,QAAI,OAAOD,QAAQI,4BAA4B,UAAU;AACvDC,cAAQC,IAAI,gIAAgI;AAC5IN,cAAQI,0BAA0BF,KAAKC,MAAMH,QAAQI,uBAAuB;IAC9E;AAGA,QAAI,OAAOJ,QAAQO,aAAa,UAAU;AACxC,YAAM,EAAEA,SAAQ,IAAKP;AAIrB,UAAKO,SAASC,WAAW,GAAA,KAAQD,SAASE,SAAS,GAAA,KAASC,iBAAiBC,iBAAiBJ,QAAAA,GAAW;AACvGP,gBAAQO,WAAWL,KAAKC,MAAMI,QAAAA;MAChC;IACF;AAEA,WAAOP;EACT;AAEA,QAAM,IAAIY,MACR,6BAA6Bd,WAAAA,yGAAoH;AAErJ,GAlCmC;AAoC5B,SAASe,iCAAiCC,QAAgBC,SAA2BC,MAA0B;AACpH,MAAIA,MAAMC,YAAY,OAAO;AAC3BZ,YAAQC,IAAI,8CAA8C;AAC1D;EACF;AACA,QAAMY,OAAOF,MAAME,QAAQ;AAC3BJ,SAAOK,KAAKD,MAAME,UAAUJ,MAAMK,QAAAA,GAAW,OAAOxB,SAAkByB,aAAAA;AACpE,QAAI;AACF,YAAM,EAAEC,eAAeC,cAAcC,UAAUC,SAASC,kBAAiB,IAAK9B,QAAQ+B;AACtF,UAAI,CAACL,iBAAiB,CAACC,cAAc;AACnCnB,gBAAQC,IAAI,6EAA6EiB,aAAAA,mBAAgCC,YAAAA,EAAc;AACvI,eAAOK,kBAAkBP,UAAU,KAAK,yCAAA;MAC1C;AACAjB,cAAQC,IAAI,uCAAA;AACZD,cAAQC,IAAIJ,KAAK4B,UAAUjC,QAAQI,MAAM,MAAM,CAAA,CAAA;AAC/C,YAAM8B,kBAAkB,MAAMhB,QAAQiB,MAAMC,kBAAkB;QAAEC,QAAQ;UAAC;YAAEV;YAAcC;YAAUC;UAAQ;;MAAG,CAAA;AAC9G,UAAIK,gBAAgBI,WAAW,GAAG;AAChC9B,gBAAQC,IAAI,4BAA4BkB,YAAAA,8BAA0C;AAClFF,iBAASc,aAAa;AACtBd,iBAASe,gBAAgB,iBAAiBb,YAAAA;AAC1C,eAAOF,SAASgB,KAAI;MACtB;AAEA,YAAMC,wBAAwB3C,2BAA2BC,OAAAA;AACzDQ,cAAQC,IAAI,QAAQJ,KAAK4B,UAAUS,qBAAAA,CAAAA,EAAwB;AAE3D,YAAMC,iBAAiBT,gBAAgB,CAAA;AACvC,YAAMU,mBAAmB,MAAM1B,QAAQiB,MAAMU,uBAAuB;QAClEH;QACAhB;QACAC;QACAmB,WAAWH,eAAeI;MAC5B,CAAA;AAEA,YAAMC,sBAAsBJ,kBAAkBK,kBAAkBC,aAAapB,iBAAAA;AAC7E,UAAIkB,qBAAqB;AAGvBxC,gBAAQC,IAAI,kBAAkBJ,KAAK4B,UAAUe,oBAAoBE,cAAc,MAAM,CAAA,CAAA;AACrFzB,iBAASc,aAAa;AAEtB,cAAMY,2CAAqF;UACzFC,sCAAsCR,iBAAiBlB;QACzD;AACA,YAAIgB,sBAAsBW,gBAAgB;AACxC5B,mBAAS6B,UAAU,gBAAgB,kBAAA;AACnC,iBAAO7B,SAASgB,KAAKpC,KAAK4B,UAAUkB,wCAAAA,CAAAA;QACtC;AAEA,cAAMI,sBAAsB,MAAMrC,QAAQiB,MAAMqB,mBAAmB;UAAE9B;UAAeC;UAAc8B,OAAOb,iBAAiBa;QAAM,CAAA;AAChI,YAAIF,qBAAqB;AACvB9B,mBAAS6B,UAAU,gBAAgB,kBAAA;AACnC,iBAAO7B,SAASgB,KAAKpC,KAAK4B,UAAU;YAAEyB,cAAcH;UAAoB,CAAA,CAAA;QAC1E;MAEF,OAAO;AACL/C,gBAAQC,IAAI,+CAAA;AACZgB,iBAASc,aAAa;AACtBd,iBAASe,gBAAgB;MAC3B;AACA,aAAOf,SAASgB,KAAI;IACtB,SAASkB,OAAO;AACdnD,cAAQmD,MAAMA,KAAAA;AACd,aAAO3B,kBAAkBP,UAAU,KAAK,gCAAgCkC,KAAAA;IAC1E;EACF,CAAA;AACF;AAlEgB3C;AAoET,SAAS4C,6BAA6B3C,QAAgBC,SAA2BC,MAA0B;AAChH,MAAIA,MAAMC,YAAY,OAAO;AAC3BZ,YAAQC,IAAI,0CAA0C;AACtD;EACF;AACA,QAAMY,OAAOF,MAAME,QAAQ;AAC3BJ,SAAO4C,IAAIxC,MAAME,UAAUJ,MAAMK,QAAAA,GAAW,OAAOxB,SAAkByB,aAAAA;AACnE,QAAI;AACF,YAAMC,gBAAgB1B,QAAQ+B,OAAOL;AACrC,YAAMC,eAAe3B,QAAQ+B,OAAOJ;AACpC,UAAI,CAACD,iBAAiB,CAACC,cAAc;AACnCnB,gBAAQC,IAAI,6EAA6EiB,aAAAA,mBAAgCC,YAAAA,EAAc;AACvI,eAAOK,kBAAkBP,UAAU,KAAK,yCAAA;MAC1C;AACA,YAAMqC,eAAe,MAAM5C,QAAQiB,MAAM4B,wBAAwB;QAC/DrC;QACAC;QACAqC,iBAAiB;MACnB,CAAA;AACA,UAAI,CAACF,cAAc;AACjBtD,gBAAQC,IACN,kGAAkGiB,aAAAA,mBAAgCC,YAAAA,EAAc;AAElJ,eAAOK,kBAAkBP,UAAU,KAAK,yCAAyC;MACnF;AACA,YAAMwC,gBAAgB,MAAMH,aAAa9D,SAASiE,eAAeC,MAAAA;AACjE1D,cAAQC,IAAI,qBAAA;AACZD,cAAQC,IAAIwD,aAAAA;AAEZ,UAAIN;AACJ,UAAI;AACFlC,iBAASc,aAAa;AACtBd,iBAAS6B,UAAU,gBAAgB,iBAAA;AACnC,eAAO7B,SAASgB,KAAKwB,aAAAA;MACvB,SAASE,GAAG;AACVR,gBAAQ,OAAOQ,MAAM,WAAWA,IAAIA,aAAapD,QAAQoD,EAAEC,UAAUC;AACrE,eAAOrC,kBAAkBP,UAAU,KAAK,uCAAuC0C,CAAAA;MACjF,UAAA;AACE,cAAMjD,QAAQiB,MAAMmC,2BAA2B;UAC7C5C;UACAC;UACA8B,OAAO;UACPE;QACF,CAAA;MACF;IACF,SAASA,OAAO;AACd,aAAO3B,kBAAkBP,UAAU,KAAK,uCAAuCkC,KAAAA;IACjF;EACF,CAAA;AACF;AAjDgBC;;;AC/GhB,SAAoCW,wCAAwC;AAC5E,SAASC,aAAAA,YAAgCC,qBAAAA,0BAAyB;AAClE,SAA6DC,mBAAmB;AAChF,SAAqDC,wBAAwB;AAE7E,OAAOC,UAAU;AAEjB,SAASC,aAAaC,qBAAqB;AAEpC,SAASC,gCAAgCC,QAAgBC,SAA2BC,MAA2C;AACpI,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,+CAA+C;AAC3D;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOO,KAAKD,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACpE,QAAI;AAEF,YAAMC,eAAeF,QAAQG,OAAOD;AACpC,UAAI,CAACA,cAAc;AACjB,eAAOE,mBAAkBH,UAAU,KAAK,0CAAA;MAC1C;AACA,YAAMI,QAAgBL,QAAQM,KAAKD,SAASE,KAAKA,KAAI;AACrD,YAAMC,gBAAgBR,QAAQM,KAAKE,iBAAiBH;AACpD,YAAMI,aAAaT,QAAQM,KAAKG,cAAcjB,MAAMiB;AAEpD,YAAMC,wBAAwBC,YAAY,qBAAqBT,YAAAA,kBAA8BG,KAAAA,IAAS;QACpGO,SAASpB,MAAMqB;MACjB,CAAA;AACA,YAAMC,cAAcH,YAAY,qBAAqBT,YAAAA,mBAA+BG,KAAAA,IAAS;QAAEO,SAASpB,MAAMqB;MAAY,CAAA;AAE1H,YAAME,uBACH,2BAA2Bf,QAAQM,QAASN,QAAQM,KAAKU,2BACzD,yBAAyBhB,QAAQM,QAASN,QAAQM,KAAKS;AAE1D,YAAME,iBAAiB,MAAM1B,QAAQ2B,MAAMC,yBAAyB;QAClEjB;QACAM;QACAH;QACAe,OAAOb,KAAKA,KAAI;QAChBG;QACAW,iBAAiB;QACjBP;QACA,GAAIC,uBAAuB;UAAEA;QAAoB;MACnD,CAAA;AAEA,UAAIO;AACJ,UAAIb,YAAY;AACd,cAAM,EAAEc,UAAS,IAAK,MAAM,OAAO,YAAA;AACnC,cAAMC,SAAS,IAAID,UAAU;UAAE,GAAGd;UAAYgB,MAAMR;QAAe,CAAA;AACnEK,wBAAgB,0BAA0B,MAAME,OAAOE,KAAI,GAAKC,SAAS,QAAA,CAAA;MAC3E;AACA,YAAMC,kBAAkD;QACtDpB;QACAH;QACAH;QACAe;QACAY,eAAe,GAAGlB,YAAYnB,MAAMsC,wBAAwB,uBAAuB;UAAElB,SAASpB,MAAMuC;QAAc,CAAA,CAAA;QAClH,GAAIT,iBAAiB;UAAEA;QAAc;MACvC;AACA5B,cAAQC,IAAI,uCAAuCqC,KAAKC,UAAUL,eAAAA,CAAAA,EAAkB;AACpF,aAAO3B,SAASiC,KAAKN,eAAAA;IACvB,SAASO,OAAO;AACd,aAAO/B,mBAAkBH,UAAU,KAAK,iDAAiDkC,KAAAA;IAC3F;EACF,CAAA;AACF;AAzDgB9C;AA2DT,SAAS+C,yBAAyB9C,QAAgBC,SAA2BC,MAA0B;AAC5G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wCAAwC;AACpD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOO,KAAKD,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACpE,QAAI;AACFP,cAAQC,IAAI,iCAAA;AACZ,YAAMa,gBAAwBR,QAAQM,KAAKE;AAC3C,YAAMN,eAAuBF,QAAQM,KAAKJ;AAE1C,YAAMmC,eACJ7B,iBAAiBN,eACb,MAAMX,QAAQ2B,MAAMoB,wBAAwB;QAC1C9B;QACAN;QACAqC,iBAAiB;MACnB,CAAA,IACAC;AACN,UAAI,CAACH,gBAAgB,CAACnC,gBAAgB,CAACM,eAAe;AACpDd,gBAAQC,IACN,oFAAoFa,aAAAA,mBAAgCN,YAAAA,EAAc;AAEpID,iBAASwC,aAAa;AACtB,cAAMC,cAAiC;UACrCC,QAAQN,eAAeA,aAAaM,SAAS;UAC7CR,OAAO;UACP3B;UACAN;UACA0C,aAAaP,eAAeA,aAAaO,cAAcC,KAAKC,IAAG;QACjE;AACA,eAAO7C,SAASiC,KAAKQ,WAAAA;MACvB;AAEA,UAAIK,sBAAwCC,iBAAiBC;AAC7D,UAAI,yBAAyBjD,QAAQM,MAAM;AACzCyC,8BAAsB/C,QAAQM,KAAKyC;MACrC;AAEA,UAAIG;AACJ,UAAIb,aAAaM,WAAW,QAAQ;AAClCO,wBAAiB,MAAM3D,QAAQ2B,MAAMiC,yBAAyB;UAC5D3C;UACAN;UACA6C;UACAR,iBAAiB;QACnB,CAAA;MACF;AACA,YAAMa,eAAuFF,iBAAiBb;AAE9G,YAAMK,aAAiC;QACrCC,QAAQS,aAAaT;QACrB,GAAIS,aAAajB,QAAQ;UAAEA,OAAOiB,aAAajB,OAAOkB;QAAQ,IAAI,CAAC;QACnE7C;QACAN;QACA0C,aAAaQ,aAAaR;QAC1B,GAAIM,iBAAiBA,cAAcP,WAAWW,iCAAiCC,WAC3E;UACEC,SAAS,MAAMN,cAAcjD,SAASwD,eAAe;YAAEC,QAAQC;UAAc,CAAA;UAC7EC,cAAcV,cAAcU;QAC9B,IACA,CAAC;MACP;AACAlE,cAAQmE,MAAM,0BAA0B7B,KAAKC,UAAUS,UAAAA,CAAAA,EAAa;AACpE,UAAIU,aAAaT,WAAW,SAAS;AACnC1C,iBAASwC,aAAa;AACtB,eAAOxC,SAASiC,KAAKQ,UAAAA;MACvB;AACAzC,eAASwC,aAAa;AACtB,aAAOxC,SAASiC,KAAKQ,UAAAA;IACvB,SAASP,OAAO;AACd,aAAO/B,mBAAkBH,UAAU,KAAKkC,MAAMkB,SAASlB,KAAAA;IACzD;EACF,CAAA;AACF;AA3EgBC;AA6ET,SAAS0B,qCAAqCxE,QAAgBC,SAA2BC,MAA0B;AACxH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,8CAA8C;AAC1D;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOyE,OAAOnE,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACtE,QAAI;AACF,YAAMO,gBAAwBR,QAAQG,OAAOK;AAC7C,YAAMN,eAAuBF,QAAQG,OAAOD;AAC5C,UAAI,CAACM,iBAAiB,CAACN,cAAc;AACnCR,gBAAQC,IAAI,6EAA6Ea,aAAAA,mBAAgCN,YAAAA,EAAc;AACvI,eAAOE,mBAAkBH,UAAU,KAAK,yCAAA;MAC1C;AACAA,eAASwC,aAAa;AACtB,aAAOxC,SAASiC,KAAK,MAAM3C,QAAQ2B,MAAM8C,oBAAoB;QAAE9D;QAAcM;MAAc,CAAA,CAAA;IAC7F,SAAS2B,OAAO;AACd,aAAO/B,mBAAkBH,UAAU,KAAKkC,MAAMkB,SAASlB,KAAAA;IACzD;EACF,CAAA;AACF;AApBgB2B;AAsBT,SAASG,uBAAuB3E,QAAgBC,SAA2BC,MAA0B;AAC1G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,4CAA4C;AACxD;EACF;AACA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAO4E,IAAItE,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOC,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMkE,cAAc,MAAM5E,QAAQ2B,MAAMkD,kBAAiB;AACzDnE,eAASwC,aAAa;AACtB,aAAOxC,SAASiC,KAAKiC,WAAAA;IACvB,SAAShC,OAAO;AACd,aAAO/B,mBAAkBH,UAAU,KAAKkC,MAAMkB,SAASlB,KAAAA;IACzD;EACF,CAAA;AACF;AAfgB8B;;;ACvKhB,SAASI,oBAAoB;AAC7B,SAASC,iCAAiD;AAI1D,OAAOC,aAAqD;AAS5D,OAAOC,eAAe;AAEf,IAAMC,oBAAN,MAAMA;EAhBb,OAgBaA;;;EACMC;EACAC;EACAC;EACAC;EACAC;EAEAC,qBAAqB;EACtC,YAAYC,MAAwG;AAClH,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,SAAKJ,SAASK;AACdE,8BAA0B;MAAED;MAAME,MAAM;QAAC;QAA2B;QAAoB;;IAA2B,CAAA;AACnH,QAAIF,MAAMG,cAAcC,YAAYC,qBAAqB;AACvDJ,gCAA0B;QAAED;QAAME,MAAM;UAAC;UAAsB;;MAA0B,CAAA;IAC3F;AAEA,SAAKP,QAAQK;AACb,SAAKR,WAAWM,KAAKQ,eAAeC;AACpC,SAAKd,UAAUc,QAAQC,OAAM;AAC7B,UAAMC,UAAUC,aAAaX,KAAAA;AAE7B,UAAMY,WAAWX,MAAMY,kBAAkB;MAAC;MAAa;;AACvDC,YAAQC,IAAI,sCAAsCC,KAAKC,UAAUL,QAAAA,CAAAA,GAAY;AAG7E,QAAIA,SAASM,SAAS,WAAA,GAAc;AAClCC,sCAAgC,KAAKzB,SAASgB,SAAST,MAAMG,cAAcgB,uBAAAA;AAC3EC,+BAAyB,KAAK3B,SAASgB,SAAST,MAAMG,cAAckB,gBAAAA;AACpEC,2CAAqC,KAAK7B,SAASgB,SAAST,MAAMG,cAAcoB,uBAAAA;AAChFC,6BAAuB,KAAK/B,SAASgB,SAAST,MAAMG,cAAcsB,oBAAAA;IACpE;AAGA,QAAId,SAASM,SAAS,MAAA,GAAS;AAC7BS,mCAA6B,KAAKjC,SAASgB,SAAST,MAAMG,cAAcwB,kBAAAA;AACxEC,uCAAiC,KAAKnC,SAASgB,SAAST,MAAMG,cAAc0B,sBAAAA;IAC9E;AACA,SAAKjC,YAAYI,MAAMG,cAAc2B,YAAY;AACjD,SAAKtC,SAASuC,IAAI,KAAKnC,WAAW,KAAKoC,MAAM;AAC7C,SAAKxC,SAASyC,IAAI,eAAejC,MAAMG,cAAc+B,cAAc,IAAA;AACnE,SAAKC,eAAc;EACrB;EAEQA,iBAAiB;AACvBC,UAAM,KAAKvC,kBAAkB,EAC1BwC,KAAK,CAACC,QAAQA,IAAIC,KAAI,CAAA,EACtBF,KAAK,CAACG,YAAAA;AACL,YAAMC,UAAU,GAAG,KAAK7C,SAAS;AACjCiB,cAAQC,IAAI,iCAAiC2B,OAAAA,EAAS;AAEtD,WAAKhD,QAAQsC,IACX,aACA,CAACW,KAAcJ,KAAeK,SAAAA;AAC5B,cAAMC,QAAQ,GAAGH,QAAQI,QAAQ,MAAM,GAAA,CAAA,GAAQA,QAAQ,WAAW,EAAA,EAAIA,QAAQ,gBAAgB,EAAA;AAC9FL,gBAAQM,UAAU;UAAC;YAAEC,KAAK,GAAGL,IAAIM,QAAQ,MAAMN,IAAIO,IAAI,MAAA,CAAA,GAAUL,KAAAA;YAASM,aAAa;UAAc;;AAErGR,YAAIS,aAAaX;AACjBG,aAAAA;MACF,GACAS,UAAUC,WAAWb,SAASc,OAAAA,GAC9BF,UAAUG,MAAK,CAAA;IAEnB,CAAA,EACCC,MAAM,CAACC,QAAAA;AACN5C,cAAQC,IAAI,8CAA8C2C,GAAAA,2CAA8C;IAC1G,CAAA;AACF,UAAMH,UAAU,CAEhB;EACF;EACA,IAAI/C,UAAmB;AACrB,WAAO,KAAKf;EACd;EAEA,IAAIwC,SAAiB;AACnB,WAAO,KAAKvC;EACd;EAEA,IAAIM,QAAmD;AACrD,WAAO,KAAKL;EACd;EAEA,IAAIM,OAAyC;AAC3C,WAAO,KAAKL;EACd;AACF;","names":["checkAuth","sendErrorResponse","CredentialMapper","parseAuthorizationResponse","request","contentType","header","payload","body","JSON","parse","presentation_submission","console","log","vp_token","startsWith","endsWith","CredentialMapper","isJsonLdAsString","Error","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","definitionId","tenantId","version","credentialQueryId","params","sendErrorResponse","stringify","definitionItems","agent","pdmGetDefinitions","filter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","dcqlPayload","wrappedPresentation","oid4vpSubmission","presentation","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","AuthorizationResponseStateStatus","checkAuth","sendErrorResponse","uriWithBase","VerifiedDataMode","uuid","shaHasher","defaultHasher","createAuthRequestWebappEndpoint","router","context","opts","enabled","console","log","path","post","checkAuth","endpoint","request","response","definitionId","params","sendErrorResponse","state","body","uuid","correlationId","qrCodeOpts","requestByReferenceURI","uriWithBase","baseURI","siopBaseURI","responseURI","responseRedirectURI","response_redirect_uri","authRequestURI","agent","siopCreateAuthRequestURI","nonce","responseURIType","qrCodeDataUri","AwesomeQR","qrCode","text","draw","toString","authRequestBody","authStatusURI","webappAuthStatusPath","webappBaseURI","JSON","stringify","json","error","authStatusWebappEndpoint","requestState","siopGetAuthRequestState","errorOnNotFound","undefined","statusCode","statusBody","status","lastUpdated","Date","now","includeVerifiedData","VerifiedDataMode","NONE","responseState","siopGetAuthResponseState","overallState","message","AuthorizationResponseStateStatus","VERIFIED","payload","mergedPayloads","hasher","defaultHasher","verifiedData","debug","removeAuthRequestStateWebappEndpoint","delete","siopDeleteAuthState","getDefinitionsEndpoint","get","definitions","pdmGetDefinitions","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","createAuthRequestWebappEndpoint","webappCreateAuthRequest","authStatusWebappEndpoint","webappAuthStatus","removeAuthRequestStateWebappEndpoint","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, PresentationSubmission } 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 { validate as isValidUUID } from 'uuid'\nimport { IRequiredContext } from './types'\nimport { DcqlQuery } from 'dcql'\n\nconst parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {\n const contentType = request.header('content-type')\n\n if (contentType?.startsWith('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?.startsWith('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\nconst validatePresentationSubmission = (query: DcqlQuery, submission: PresentationSubmission): boolean => {\n return query.credentials.every((credential) => credential.id in submission)\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: buildQueryIdFilter(queryId, tenantId, version),\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 const presentation = verifiedResponse?.oid4vpSubmission?.presentation\n if (presentation && validatePresentationSubmission(definitionItem.query, presentation)) {\n console.log('PRESENTATIONS:' + JSON.stringify(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, 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: buildQueryIdFilter(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\nexport function buildQueryIdFilter(queryId: string, tenantId?: string, version?: string) {\n const queryFilter = {\n queryId,\n ...(tenantId ? { tenantId } : {}),\n ...(version ? { version } : {}),\n }\n\n return [queryFilter, ...(isValidUUID(queryId) ? [{ id: queryId }] : [])] // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version\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 { buildQueryIdFilter } from './siop-api-functions'\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: buildQueryIdFilter(queryId),\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({\n text: authRequestURI,\n size: qrCodeOpts.size ?? 250,\n colorDark: qrCodeOpts.colorDark ?? '#000000',\n colorLight: qrCodeOpts.colorLight ?? '#FFFFFF',\n })\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":";;;;AACA,SAASA,WAAgCC,yBAAyB;AAElE,SAASC,wBAAwB;AAEjC,SAASC,YAAYC,mBAAmB;AAIxC,IAAMC,6BAA6B,wBAACC,YAAAA;AAClC,QAAMC,cAAcD,QAAQE,OAAO,cAAA;AAEnC,MAAID,aAAaE,WAAW,kBAAA,GAAqB;AAC/C,UAAMC,UAAU,OAAOJ,QAAQK,SAAS,WAAWC,KAAKC,MAAMP,QAAQK,IAAI,IAAIL,QAAQK;AACtF,WAAOD;EACT;AAEA,MAAIH,aAAaE,WAAW,mCAAA,GAAsC;AAChE,UAAMC,UAAUJ,QAAQK;AAGxB,QAAI,OAAOD,QAAQI,4BAA4B,UAAU;AACvDC,cAAQC,IAAI,gIAAgI;AAC5IN,cAAQI,0BAA0BF,KAAKC,MAAMH,QAAQI,uBAAuB;IAC9E;AAGA,QAAI,OAAOJ,QAAQO,aAAa,UAAU;AACxC,YAAM,EAAEA,SAAQ,IAAKP;AAIrB,UAAKO,SAASR,WAAW,GAAA,KAAQQ,SAASC,SAAS,GAAA,KAASC,iBAAiBC,iBAAiBH,QAAAA,GAAW;AACvGP,gBAAQO,WAAWL,KAAKC,MAAMI,QAAAA;MAChC;IACF;AAEA,WAAOP;EACT;AAEA,QAAM,IAAIW,MACR,6BAA6Bd,WAAAA,yGAAoH;AAErJ,GAlCmC;AAoCnC,IAAMe,iCAAiC,wBAACC,OAAkBC,eAAAA;AACxD,SAAOD,MAAME,YAAYC,MAAM,CAACC,eAAeA,WAAWC,MAAMJ,UAAAA;AAClE,GAFuC;AAIhC,SAASK,iCAAiCC,QAAgBC,SAA2BC,MAA0B;AACpH,MAAIA,MAAMC,YAAY,OAAO;AAC3BlB,YAAQC,IAAI,8CAA8C;AAC1D;EACF;AACA,QAAMkB,OAAOF,MAAME,QAAQ;AAC3BJ,SAAOK,KAAKD,MAAME,UAAUJ,MAAMK,QAAAA,GAAW,OAAO/B,SAAkBgC,aAAAA;AACpE,QAAI;AACF,YAAM,EAAEC,eAAeC,SAASC,UAAUC,QAAO,IAAKpC,QAAQqC;AAC9D,UAAI,CAACJ,eAAe;AAClBxB,gBAAQC,IAAI,6EAA6EuB,aAAAA,EAAe;AACxG,eAAOK,kBAAkBN,UAAU,KAAK,yCAAA;MAC1C;AACAvB,cAAQ8B,MAAM,uCAAA;AACd9B,cAAQ8B,MAAMjC,KAAKkC,UAAUxC,QAAQK,MAAM,MAAM,CAAA,CAAA;AACjD,YAAMoC,kBAAkB,MAAMhB,QAAQiB,MAAMC,kBAAkB;QAC5DC,QAAQC,mBAAmBX,SAASC,UAAUC,OAAAA;MAChD,CAAA;AACA,UAAIK,gBAAgBK,WAAW,GAAG;AAChCrC,gBAAQC,IAAI,oCAAoCwB,OAAAA,8BAAqC;AACrFF,iBAASe,aAAa;AACtBf,iBAASgB,gBAAgB,iBAAiBd,OAAAA;AAC1C,eAAOF,SAASiB,KAAI;MACtB;AAEA,YAAMC,wBAAwBnD,2BAA2BC,OAAAA;AACzDS,cAAQC,IAAI,QAAQJ,KAAKkC,UAAUU,qBAAAA,CAAAA,EAAwB;AAE3D,YAAMC,iBAAiBV,gBAAgB,CAAA;AACvC,YAAMW,mBAAmB,MAAM3B,QAAQiB,MAAMW,uBAAuB;QAClEH;QACAjB;QACAqB,WAAWH,eAAelC;MAC5B,CAAA;AAEA,YAAMsC,eAAeH,kBAAkBI,kBAAkBD;AACzD,UAAIA,gBAAgBvC,+BAA+BmC,eAAelC,OAAOsC,YAAAA,GAAe;AACtF9C,gBAAQC,IAAI,mBAAmBJ,KAAKkC,UAAUe,cAAc,MAAM,CAAA,CAAA;AAClEvB,iBAASe,aAAa;AAEtB,cAAMU,2CAAqF;UACzFC,sCAAsCN,iBAAiBnB;QACzD;AACA,YAAIiB,sBAAsBS,gBAAgB;AACxC3B,mBAAS4B,UAAU,gBAAgB,kBAAA;AACnC,iBAAO5B,SAASiB,KAAK3C,KAAKkC,UAAUiB,wCAAAA,CAAAA;QACtC;AAEA,cAAMI,sBAAsB,MAAMpC,QAAQiB,MAAMoB,mBAAmB;UAAE7B;UAAe8B,OAAOX,iBAAiBW;QAAM,CAAA;AAClH,YAAIF,qBAAqB;AACvB7B,mBAAS4B,UAAU,gBAAgB,kBAAA;AACnC,iBAAO5B,SAASiB,KAAK3C,KAAKkC,UAAU;YAAEwB,cAAcH;UAAoB,CAAA,CAAA;QAC1E;MAEF,OAAO;AACLpD,gBAAQC,IAAI,+CAAA;AACZsB,iBAASe,aAAa;AACtBf,iBAASgB,gBAAgB;MAC3B;AACA,aAAOhB,SAASiB,KAAI;IACtB,SAASgB,OAAO;AACdxD,cAAQwD,MAAMA,KAAAA;AACd,aAAO3B,kBAAkBN,UAAU,KAAK,gCAAgCiC,KAAAA;IAC1E;EACF,CAAA;AACF;AAjEgB1C;AAmET,SAAS2C,6BAA6B1C,QAAgBC,SAA2BC,MAA0B;AAChH,MAAIA,MAAMC,YAAY,OAAO;AAC3BlB,YAAQC,IAAI,0CAA0C;AACtD;EACF;AACA,QAAMkB,OAAOF,MAAME,QAAQ;AAC3BJ,SAAO2C,IAAIvC,MAAME,UAAUJ,MAAMK,QAAAA,GAAW,OAAO/B,SAAkBgC,aAAAA;AACnE,QAAI;AACF,YAAMC,gBAAgBjC,QAAQqC,OAAOJ;AACrC,YAAMC,UAAUlC,QAAQqC,OAAOH;AAC/B,UAAI,CAACD,iBAAiB,CAACC,SAAS;AAC9BzB,gBAAQC,IAAI,6EAA6EuB,aAAAA,cAA2BC,OAAAA,EAAS;AAC7H,eAAOI,kBAAkBN,UAAU,KAAK,yCAAA;MAC1C;AACA,YAAMoC,eAAe,MAAM3C,QAAQiB,MAAM2B,wBAAwB;QAC/DpC;QACAqC,iBAAiB;MACnB,CAAA;AACA,UAAI,CAACF,cAAc;AACjB3D,gBAAQC,IACN,kGAAkGuB,aAAAA,mBAAgCC,OAAAA,EAAS;AAE7I,eAAOI,kBAAkBN,UAAU,KAAK,yCAAyC;MACnF;AAEA,YAAMS,kBAAkB,MAAMhB,QAAQiB,MAAMC,kBAAkB;QAAEC,QAAQC,mBAAmBX,OAAAA;MAAS,CAAA;AACpG,UAAIO,gBAAgBK,WAAW,GAAG;AAChCrC,gBAAQC,IAAI,oCAAoCwB,OAAAA,8BAAqC;AACrFF,iBAASe,aAAa;AACtBf,iBAASgB,gBAAgB,iBAAiBd,OAAAA;AAC1C,eAAOF,SAASiB,KAAI;MACtB;AACA,YAAM7C,UAAUgE,aAAapE,SAASuE,eAAeC,WAAAA;AACrDpE,cAAQqE,aAAahC,gBAAgB,CAAA,EAAGxB;AACxC,YAAMsD,gBAAgB,MAAMH,aAAapE,SAASuE,eAAeG,MAAAA;AACjEjE,cAAQC,IAAI,qBAAA;AACZD,cAAQC,IAAI6D,aAAAA;AAEZ,UAAIN;AACJ,UAAI;AACFjC,iBAASe,aAAa;AACtBf,iBAAS4B,UAAU,gBAAgB,iBAAA;AACnC,eAAO5B,SAASiB,KAAKsB,aAAAA;MACvB,SAASI,GAAG;AACVV,gBAAQ,OAAOU,MAAM,WAAWA,IAAIA,aAAa5D,QAAQ4D,EAAEC,UAAUC;AACrE,eAAOvC,kBAAkBN,UAAU,KAAK,uCAAuC2C,CAAAA;MACjF,UAAA;AACE,cAAMlD,QAAQiB,MAAMoC,2BAA2B;UAC7C7C;UACA8B,OAAO;UACPE;QACF,CAAA;MACF;IACF,SAASA,OAAO;AACd,aAAO3B,kBAAkBN,UAAU,KAAK,uCAAuCiC,KAAAA;IACjF;EACF,CAAA;AACF;AAzDgBC;AA2DT,SAASrB,mBAAmBX,SAAiBC,UAAmBC,SAAgB;AACrF,QAAM2C,cAAc;IAClB7C;IACA,GAAIC,WAAW;MAAEA;IAAS,IAAI,CAAC;IAC/B,GAAIC,UAAU;MAAEA;IAAQ,IAAI,CAAC;EAC/B;AAEA,SAAO;IAAC2C;OAAiBC,YAAY9C,OAAAA,IAAW;MAAC;QAAEZ,IAAIY;MAAQ;QAAK,CAAA;;AACtE;AARgBW;;;AC/KhB,SACEoC,iCAEAC,uCACAC,+CAEK;AACP,SAASC,aAAAA,YAAgCC,qBAAAA,0BAAyB;AAClE,SAASC,mBAAmB;AAE5B,OAAOC,UAAU;;;ACTjB,SAAYC,gBAAgB;AAErB,IAAMC,eAAe,wBAACC,WAAAA;AAC3B,SAAO,CAACC,KAAcC,KAAeC,SAAAA;AACnC,QAAI;AACFH,aAAOI,MAAMH,IAAII,IAAI;AACrBF,WAAAA;IACF,SAASG,OAAO;AACd,UAAIA,iBAAiBC,UAAU;AAC7B,cAAMC,gBAAgBF,MAAMG,OAAOC,IAAI,CAACC,WAAgB;UACtDC,SAAS,GAAGD,MAAME,KAAKC,KAAK,GAAA,CAAA,OAAWH,MAAMC,OAAO;QACtD,EAAA;AACAV,YAAIa,OAAO,GAAA,EAAKC,KAAK;UAAED,QAAQ;UAAKH,SAAS;UAAgBK,eAAeT,cAAc,CAAA,EAAGI;QAAQ,CAAA;MACvG,OAAO;AACLV,YAAIa,OAAO,GAAA,EAAKC,KAAK;UAAED,QAAQ;UAAKH,SAAS;QAAwB,CAAA;MACvE;IACF;EACF;AACF,GAhB4B;;;ADqBrB,SAASM,yCAAyCC,QAAgBC,SAA2BC,MAA2C;AAC7I,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,yDAAyD;AACrE;EACF;AAEA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOO,KACLD,MACAE,WAAUN,MAAMO,QAAAA,GAChBC,aAAaC,uCAAAA,GACb,OAAOC,SAAmDC,aAAAA;AACxD,QAAI;AACF,YAAMC,cAA0CC,sCAAsCH,QAAQI,IAAI;AAClG,YAAMC,gBAAgBH,YAAYG,iBAAiBC,KAAKA,KAAI;AAC5D,YAAMC,aAAaL,YAAYM,SAAU;QAAE,GAAGN,YAAYM;MAAO,IAA0BlB,MAAMiB;AACjG,YAAME,UAAUP,YAAYO;AAE5B,YAAMC,kBAAkB,MAAMrB,QAAQsB,MAAMC,kBAAkB;QAC5DC,QAAQC,mBAAmBL,OAAAA;MAC7B,CAAA;AACA,UAAIC,gBAAgBK,WAAW,GAAG;AAChCvB,gBAAQC,IAAI,uDAAuDgB,OAAAA,EAAS;AAC5E,eAAOO,mBAAkBf,UAAU,KAAK;UAAEgB,QAAQ;UAAKC,SAAS;QAA0B,CAAA;MAC5F;AAEA,YAAMC,wBAAwBC,YAAY,iBAAiBX,OAAAA,kBAAyBJ,aAAAA,IAAiB;QACnGgB,SAASnB,YAAYoB,kBAAkBhC,MAAMiC;MAC/C,CAAA;AACA,YAAMC,cAAcJ,YAAY,iBAAiBX,OAAAA,mBAA0BJ,aAAAA,IAAiB;QAAEgB,SAAS/B,MAAMiC;MAAY,CAAA;AAEzH,YAAME,iBAAiB,MAAMpC,QAAQsB,MAAMe,yBAAyB;QAClEjB;QACAJ;QACAsB,OAAOrB,KAAKA,KAAI;QAChBa;QACAS,iBAAiB;QACjBJ;QACA,GAAItB,YAAY2B,iCAAiC;UAAEC,qBAAqB5B,YAAY2B;QAA8B;QAClH,GAAI3B,YAAY6B,YAAY;UAAEA,UAAU7B,YAAY6B;QAAS;MAC/D,CAAA;AAEA,UAAIC;AACJ,UAAIzB,YAAY;AACd,cAAM,EAAE0B,UAAS,IAAK,MAAM,OAAO,YAAA;AACnC,cAAMzB,SAAS,IAAIyB,UAAU;UAC3BC,MAAMT;UACNU,MAAM5B,WAAW4B,QAAQ;UACzBC,WAAW7B,WAAW6B,aAAa;UACnCC,YAAY9B,WAAW8B,cAAc;QACvC,CAAA;AACAL,wBAAgB,0BAA0B,MAAMxB,OAAO8B,KAAI,GAAKC,SAAS,QAAA,CAAA;MAC3E,OAAO;AACLP,wBAAgBP;MAClB;AAEA,YAAMe,kBAAkB;QACtBC,UAAUhC;QACViC,gBAAgBrC;QAChBsC,aAAalB;QACbmB,YAAY,GAAGxB,YAAY9B,MAAMuD,wBAAwB,wBAAwBxC,aAAAA,IAAiB;UAAEgB,SAAS/B,MAAMwD;QAAc,CAAA,CAAA;QACjI,GAAId,iBAAiB;UAAEe,QAAQf;QAAc;MAC/C;AACAxC,cAAQC,IAAI,uCAAuCuD,KAAKC,UAAUT,eAAAA,CAAAA,EAAkB;AAEpF,aAAOvC,SAASgB,OAAO,GAAA,EAAKiC,KAAKV,eAAAA;IACnC,SAASW,OAAO;AACd,aAAOnC,mBAAkBf,UAAU,KAAK;QAAEgB,QAAQ;QAAKC,SAAS;MAAgD,GAAGiC,KAAAA;IACrH;EACF,CAAA;AAEJ;AAvEgBhE;AAyET,SAASiE,8CAA8ChE,QAAgBC,SAA2BC,MAA0B;AACjI,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,wDAAwD;AACpE;EACF;AAEA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOiE,OAAO3D,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOG,SAAqCC,aAAAA;AACzF,QAAI;AACF,YAAMI,gBAAwBL,QAAQsD,OAAOjD;AAE7C,YAAMkD,mBAAmB,MAAMlE,QAAQsB,MAAM6C,wBAAwB;QACnEnD;QACAoD,iBAAiB;MACnB,CAAA;AACA,UAAI,CAACF,kBAAkB;AACrB/D,gBAAQC,IAAI,uFAAuFY,aAAAA,EAAe;AAClH,eAAOW,mBAAkBf,UAAU,KAAK;UAAEgB,QAAQ;UAAKC,SAAS;QAA0C,CAAA;MAC5G;AAEA,YAAM7B,QAAQsB,MAAM+C,oBAAoB;QAAErD;MAAc,CAAA;AAExD,aAAOJ,SAASgB,OAAO,GAAA,EAAKiC,KAAI;IAClC,SAASC,OAAO;AACd,aAAOnC,mBAAkBf,UAAU,KAAK;QAAEgB,QAAQ;QAAKC,SAASiC,MAAMjC;MAAQ,GAAGiC,KAAAA;IACnF;EACF,CAAA;AACF;AA3BgBC;AA6BT,SAASO,kCAAkCvE,QAAgBC,SAA2BC,MAA0B;AACrH,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,kDAAkD;AAC9D;EACF;AAEA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOwE,IAAIlE,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOG,SAAwCC,aAAAA;AACzF,QAAI;AACFT,cAAQC,IAAI,iCAAA;AACZ,YAAMY,gBAAwBL,QAAQsD,OAAOjD;AAE7C,YAAMwD,eAAe,MAAMxE,QAAQsB,MAAM6C,wBAAwB;QAC/DnD;QACAoD,iBAAiB;MACnB,CAAA;AAEA,UAAI,CAACI,cAAc;AACjBrE,gBAAQC,IAAI,uFAAuFY,aAAAA,EAAe;AAClH,eAAOW,mBAAkBf,UAAU,KAAK;UAAEgB,QAAQ;UAAKC,SAAS;QAA0C,CAAA;MAC5G;AAEA,UAAI4C;AACJ,UAAID,aAAa5C,WAAW8C,gCAAgCC,WAAW;AACrEF,wBAAgB,MAAMzE,QAAQsB,MAAMsD,yBAAyB;UAC3D5D;UACAoD,iBAAiB;QACnB,CAAA;MACF;AACA,YAAMS,eAAeJ,iBAAiBD;AAEtC,YAAMM,aAAa;QACjBlD,QAAQiD,aAAajD;QACrByB,gBAAgBwB,aAAa7D;QAC7BoC,UAAUyB,aAAazD;QACvB2D,cAAcF,aAAaG;QAC3B,GAAI,kBAAkBH,gBAAgB;UAAEI,eAAeJ,aAAaK;QAAa;QACjF,GAAIL,aAAaf,SAAS;UAAEjC,SAASgD,aAAaf,MAAMjC;QAAQ;MAClE;AACA1B,cAAQgF,MAAM,0BAA0BxB,KAAKC,UAAUkB,UAAAA,CAAAA,EAAa;AAEpE,UAAID,aAAajD,WAAW,SAAS;AACnC,eAAOhB,SAASgB,OAAO,GAAA,EAAKiC,KAAKiB,UAAAA;MACnC;AACA,aAAOlE,SAASgB,OAAO,GAAA,EAAKiC,KAAKiB,UAAAA;IACnC,SAAShB,OAAO;AACd,aAAOnC,mBAAkBf,UAAU,KAAK;QAAEgB,QAAQ;QAAKC,SAASiC,MAAMjC;MAAQ,GAAGiC,KAAAA;IACnF;EACF,CAAA;AACF;AAjDgBQ;AAmDT,SAASc,uBAAuBrF,QAAgBC,SAA2BC,MAA0B;AAC1G,MAAIA,MAAMC,YAAY,OAAO;AAC3BC,YAAQC,IAAI,sDAAsD;AAClE;EACF;AAEA,QAAMC,OAAOJ,MAAMI,QAAQ;AAC3BN,SAAOwE,IAAIlE,MAAME,WAAUN,MAAMO,QAAAA,GAAW,OAAOG,SAAkBC,aAAAA;AACnE,QAAI;AACF,YAAMyE,cAAc,MAAMrF,QAAQsB,MAAMC,kBAAiB;AACzDX,eAAS0E,aAAa;AACtB,aAAO1E,SAASiD,KAAKwB,WAAAA;IACvB,SAASvB,OAAO;AACd,aAAOnC,mBAAkBf,UAAU,KAAK;QAAEgB,QAAQ;QAAKC,SAASiC,MAAMjC;MAAQ,GAAGiC,KAAAA;IACnF;EACF,CAAA;AACF;AAhBgBsB;;;AEjLhB,SAASG,oBAAoB;AAC7B,SAASC,iCAAiD;AAG1D,OAAOC,aAAqD;AAS5D,OAAOC,eAAe;AAEf,IAAMC,oBAAN,MAAMA;EAfb,OAeaA;;;EACMC;EACAC;EACAC;EACAC;EACAC;EAEAC,qBAAqB;EACtC,YAAYC,MAAwG;AAClH,UAAM,EAAEC,OAAOC,KAAI,IAAKF;AACxB,SAAKJ,SAASK;AACdE,8BAA0B;MAAED;MAAME,MAAM;QAAC;QAA2B;QAAoB;;IAA2B,CAAA;AACnH,QAAIF,MAAMG,cAAcC,YAAYC,qBAAqB;AACvDJ,gCAA0B;QAAED;QAAME,MAAM;UAAC;UAAsB;;MAA0B,CAAA;IAC3F;AAEA,SAAKP,QAAQK;AACb,SAAKR,WAAWM,KAAKQ,eAAeC;AACpC,SAAKd,UAAUc,QAAQC,OAAM;AAC7B,UAAMC,UAAUC,aAAaX,KAAAA;AAE7B,UAAMY,WAAWX,MAAMY,kBAAkB;MAAC;MAAa;;AACvDC,YAAQC,IAAI,sCAAsCC,KAAKC,UAAUL,QAAAA,CAAAA,GAAY;AAG7E,QAAIA,SAASM,SAAS,WAAA,GAAc;AAClCC,+CAAyC,KAAKzB,SAASgB,SAAST,MAAMG,cAAcgB,uBAAAA;AACpFC,wCAAkC,KAAK3B,SAASgB,SAAST,MAAMG,cAAckB,gBAAAA;AAC7EC,oDAA8C,KAAK7B,SAASgB,SAAST,MAAMG,cAAcoB,uBAAAA;AACzFC,6BAAuB,KAAK/B,SAASgB,SAAST,MAAMG,cAAcsB,oBAAAA;IACpE;AAGA,QAAId,SAASM,SAAS,MAAA,GAAS;AAC7BS,mCAA6B,KAAKjC,SAASgB,SAAST,MAAMG,cAAcwB,kBAAAA;AACxEC,uCAAiC,KAAKnC,SAASgB,SAAST,MAAMG,cAAc0B,sBAAAA;IAC9E;AACA,SAAKjC,YAAYI,MAAMG,cAAc2B,YAAY;AACjD,SAAKtC,SAASuC,IAAI,KAAKnC,WAAW,KAAKoC,MAAM;AAC7C,SAAKxC,SAASyC,IAAI,eAAejC,MAAMG,cAAc+B,cAAc,IAAA;AACnE,SAAKC,eAAc;EACrB;EAEQA,iBAAiB;AACvBC,UAAM,KAAKvC,kBAAkB,EAC1BwC,KAAK,CAACC,QAAQA,IAAIC,KAAI,CAAA,EACtBF,KAAK,CAACG,YAAAA;AACL,YAAMC,UAAU,GAAG,KAAK7C,SAAS;AACjCiB,cAAQC,IAAI,iCAAiC2B,OAAAA,EAAS;AAEtD,WAAKhD,QAAQsC,IACX,aACA,CAACW,KAAcJ,KAAeK,SAAAA;AAC5B,cAAMC,QAAQ,GAAGH,QAAQI,QAAQ,MAAM,GAAA,CAAA,GAAQA,QAAQ,WAAW,EAAA,EAAIA,QAAQ,gBAAgB,EAAA;AAC9FL,gBAAQM,UAAU;UAAC;YAAEC,KAAK,GAAGL,IAAIM,QAAQ,MAAMN,IAAIO,IAAI,MAAA,CAAA,GAAUL,KAAAA;YAASM,aAAa;UAAc;;AAErGR,YAAIS,aAAaX;AACjBG,aAAAA;MACF,GACAS,UAAUC,WAAWb,SAASc,OAAAA,GAC9BF,UAAUG,MAAK,CAAA;IAEnB,CAAA,EACCC,MAAM,CAACC,QAAAA;AACN5C,cAAQC,IAAI,8CAA8C2C,GAAAA,2CAA8C;IAC1G,CAAA;AACF,UAAMH,UAAU,CAEhB;EACF;EACA,IAAI/C,UAAmB;AACrB,WAAO,KAAKf;EACd;EAEA,IAAIwC,SAAiB;AACnB,WAAO,KAAKvC;EACd;EAEA,IAAIM,QAA2B;AAC7B,WAAO,KAAKL;EACd;EAEA,IAAIM,OAAyC;AAC3C,WAAO,KAAKL;EACd;AACF;","names":["checkAuth","sendErrorResponse","CredentialMapper","validate","isValidUUID","parseAuthorizationResponse","request","contentType","header","startsWith","payload","body","JSON","parse","presentation_submission","console","log","vp_token","endsWith","CredentialMapper","isJsonLdAsString","Error","validatePresentationSubmission","query","submission","credentials","every","credential","id","verifyAuthResponseSIOPv2Endpoint","router","context","opts","enabled","path","post","checkAuth","endpoint","response","correlationId","queryId","tenantId","version","params","sendErrorResponse","debug","stringify","definitionItems","agent","pdmGetDefinitions","filter","buildQueryIdFilter","length","statusCode","statusMessage","send","authorizationResponse","definitionItem","verifiedResponse","siopVerifyAuthResponse","dcqlQuery","presentation","oid4vpSubmission","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","queryFilter","isValidUUID","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","buildQueryIdFilter","length","sendErrorResponse","status","message","requestByReferenceURI","uriWithBase","baseURI","requestUriBase","siopBaseURI","responseURI","authRequestURI","siopCreateAuthRequestURI","nonce","responseURIType","directPostResponseRedirectUri","responseRedirectURI","callback","qrCodeDataUri","AwesomeQR","text","size","colorDark","colorLight","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.
|
|
3
|
+
"version": "0.36.0",
|
|
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.
|
|
27
|
-
"@sphereon/ssi-express-support": "0.
|
|
28
|
-
"@sphereon/ssi-sdk.core": "0.
|
|
29
|
-
"@sphereon/ssi-sdk.credential-validation": "0.
|
|
30
|
-
"@sphereon/ssi-sdk.kv-store-temp": "0.
|
|
31
|
-
"@sphereon/ssi-sdk.pd-manager": "0.
|
|
32
|
-
"@sphereon/ssi-sdk.presentation-exchange": "0.
|
|
33
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.
|
|
34
|
-
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.
|
|
35
|
-
"@sphereon/ssi-types": "0.
|
|
26
|
+
"@sphereon/did-auth-siop": "0.20.0",
|
|
27
|
+
"@sphereon/ssi-express-support": "0.36.0",
|
|
28
|
+
"@sphereon/ssi-sdk.core": "0.36.0",
|
|
29
|
+
"@sphereon/ssi-sdk.credential-validation": "0.36.0",
|
|
30
|
+
"@sphereon/ssi-sdk.kv-store-temp": "0.36.0",
|
|
31
|
+
"@sphereon/ssi-sdk.pd-manager": "0.36.0",
|
|
32
|
+
"@sphereon/ssi-sdk.presentation-exchange": "0.36.0",
|
|
33
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-common": "0.36.0",
|
|
34
|
+
"@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth": "0.36.0",
|
|
35
|
+
"@sphereon/ssi-types": "0.36.0",
|
|
36
36
|
"@veramo/core": "4.2.0",
|
|
37
37
|
"@veramo/credential-w3c": "4.2.0",
|
|
38
38
|
"awesome-qr": "^2.1.5-rc.0",
|
|
@@ -40,22 +40,27 @@
|
|
|
40
40
|
"cookie-parser": "^1.4.6",
|
|
41
41
|
"cors": "^2.8.5",
|
|
42
42
|
"cross-fetch": "^4.1.0",
|
|
43
|
+
"dcql": "1.0.1",
|
|
43
44
|
"dotenv-flow": "^3.3.0",
|
|
44
45
|
"express": "^4.19.2",
|
|
45
46
|
"short-uuid": "^4.2.2",
|
|
46
47
|
"swagger-ui-express": "^5.0.1",
|
|
47
|
-
"uuid": "^9.0.1"
|
|
48
|
+
"uuid": "^9.0.1",
|
|
49
|
+
"zod": "^4.1.5"
|
|
48
50
|
},
|
|
49
51
|
"devDependencies": {
|
|
50
52
|
"@decentralized-identity/ion-sdk": "^0.6.0",
|
|
51
|
-
"@sphereon/did-auth-siop-adapter": "0.
|
|
53
|
+
"@sphereon/did-auth-siop-adapter": "0.20.0",
|
|
52
54
|
"@sphereon/did-uni-client": "^0.6.3",
|
|
53
55
|
"@sphereon/pex": "5.0.0-unstable.28",
|
|
54
56
|
"@sphereon/pex-models": "^2.3.2",
|
|
55
|
-
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.
|
|
56
|
-
"@sphereon/ssi-sdk.
|
|
57
|
-
"@sphereon/ssi-sdk.
|
|
58
|
-
"@sphereon/ssi-sdk.
|
|
57
|
+
"@sphereon/ssi-sdk-ext.did-provider-jwk": "0.36.0",
|
|
58
|
+
"@sphereon/ssi-sdk-ext.identifier-resolution": "0.36.0",
|
|
59
|
+
"@sphereon/ssi-sdk-ext.jwt-service": "0.36.0",
|
|
60
|
+
"@sphereon/ssi-sdk.credential-vcdm": "0.36.0",
|
|
61
|
+
"@sphereon/ssi-sdk.credential-vcdm-jsonld-provider": "0.36.0",
|
|
62
|
+
"@sphereon/ssi-sdk.data-store": "0.36.0",
|
|
63
|
+
"@sphereon/ssi-sdk.data-store-types": "0.36.0",
|
|
59
64
|
"@types/body-parser": "^1.19.5",
|
|
60
65
|
"@types/cookie-parser": "^1.4.7",
|
|
61
66
|
"@types/cors": "^2.8.17",
|
|
@@ -114,5 +119,5 @@
|
|
|
114
119
|
"OpenID Connect",
|
|
115
120
|
"Authenticator"
|
|
116
121
|
],
|
|
117
|
-
"gitHead": "
|
|
122
|
+
"gitHead": "f713d3a83948ef69aaa7d435700b16d5655ac863"
|
|
118
123
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express'
|
|
2
|
+
import { z, ZodError } from 'zod'
|
|
3
|
+
|
|
4
|
+
export const validateData = (schema: z.ZodObject<any, any>) => {
|
|
5
|
+
return (req: Request, res: Response, next: NextFunction) => {
|
|
6
|
+
try {
|
|
7
|
+
schema.parse(req.body)
|
|
8
|
+
next()
|
|
9
|
+
} catch (error) {
|
|
10
|
+
if (error instanceof ZodError) {
|
|
11
|
+
const errorMessages = error.issues.map((issue: any) => ({
|
|
12
|
+
message: `${issue.path.join('.')} is ${issue.message}`,
|
|
13
|
+
}))
|
|
14
|
+
res.status(400).json({ status: 400, message: 'Invalid data', error_details: errorMessages[0].message })
|
|
15
|
+
} else {
|
|
16
|
+
res.status(500).json({ status: 500, message: 'Internal Server Error' })
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import { AuthorizationResponsePayload } from '@sphereon/did-auth-siop'
|
|
1
|
+
import { AuthorizationResponsePayload, PresentationSubmission } from '@sphereon/did-auth-siop'
|
|
2
2
|
import { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
|
|
3
|
-
import { CredentialMapper } from '@sphereon/ssi-types'
|
|
4
3
|
import { AuthorizationChallengeValidationResponse } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
4
|
+
import { CredentialMapper } from '@sphereon/ssi-types'
|
|
5
5
|
import { Request, Response, Router } from 'express'
|
|
6
|
+
import { validate as isValidUUID } from 'uuid'
|
|
6
7
|
import { IRequiredContext } from './types'
|
|
8
|
+
import { DcqlQuery } from 'dcql'
|
|
7
9
|
|
|
8
10
|
const parseAuthorizationResponse = (request: Request): AuthorizationResponsePayload => {
|
|
9
11
|
const contentType = request.header('content-type')
|
|
10
12
|
|
|
11
|
-
if (contentType
|
|
13
|
+
if (contentType?.startsWith('application/json')) {
|
|
12
14
|
const payload = typeof request.body === 'string' ? JSON.parse(request.body) : request.body
|
|
13
15
|
return payload as AuthorizationResponsePayload
|
|
14
16
|
}
|
|
15
17
|
|
|
16
|
-
if (contentType
|
|
18
|
+
if (contentType?.startsWith('application/x-www-form-urlencoded')) {
|
|
17
19
|
const payload = request.body as AuthorizationResponsePayload
|
|
18
20
|
|
|
19
21
|
// Parse presentation_submission if it's a string
|
|
@@ -41,26 +43,32 @@ const parseAuthorizationResponse = (request: Request): AuthorizationResponsePayl
|
|
|
41
43
|
)
|
|
42
44
|
}
|
|
43
45
|
|
|
46
|
+
const validatePresentationSubmission = (query: DcqlQuery, submission: PresentationSubmission): boolean => {
|
|
47
|
+
return query.credentials.every((credential) => credential.id in submission)
|
|
48
|
+
}
|
|
49
|
+
|
|
44
50
|
export function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
|
|
45
51
|
if (opts?.enabled === false) {
|
|
46
52
|
console.log(`verifyAuthResponse SIOP endpoint is disabled`)
|
|
47
53
|
return
|
|
48
54
|
}
|
|
49
|
-
const path = opts?.path ?? '/siop/
|
|
55
|
+
const path = opts?.path ?? '/siop/queries/:queryId/auth-responses/:correlationId'
|
|
50
56
|
router.post(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
51
57
|
try {
|
|
52
|
-
const { correlationId,
|
|
53
|
-
if (!correlationId
|
|
54
|
-
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}
|
|
58
|
+
const { correlationId, queryId, tenantId, version } = request.params
|
|
59
|
+
if (!correlationId) {
|
|
60
|
+
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}`)
|
|
55
61
|
return sendErrorResponse(response, 404, 'No authorization request could be found')
|
|
56
62
|
}
|
|
57
|
-
console.
|
|
58
|
-
console.
|
|
59
|
-
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
63
|
+
console.debug('Authorization Response (siop-sessions') // TODO use logger
|
|
64
|
+
console.debug(JSON.stringify(request.body, null, 2))
|
|
65
|
+
const definitionItems = await context.agent.pdmGetDefinitions({
|
|
66
|
+
filter: buildQueryIdFilter(queryId, tenantId, version),
|
|
67
|
+
})
|
|
60
68
|
if (definitionItems.length === 0) {
|
|
61
|
-
console.log(`Could not get
|
|
69
|
+
console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)
|
|
62
70
|
response.statusCode = 404
|
|
63
|
-
response.statusMessage = `No definition ${
|
|
71
|
+
response.statusMessage = `No definition ${queryId}`
|
|
64
72
|
return response.send()
|
|
65
73
|
}
|
|
66
74
|
|
|
@@ -71,15 +79,12 @@ export function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequi
|
|
|
71
79
|
const verifiedResponse = await context.agent.siopVerifyAuthResponse({
|
|
72
80
|
authorizationResponse,
|
|
73
81
|
correlationId,
|
|
74
|
-
|
|
75
|
-
dcqlQuery: definitionItem.dcqlPayload,
|
|
82
|
+
dcqlQuery: definitionItem.query,
|
|
76
83
|
})
|
|
77
84
|
|
|
78
|
-
const
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
// console.log(JSON.stringify(credentialSubject, null, 2))
|
|
82
|
-
console.log('PRESENTATION:' + JSON.stringify(wrappedPresentation.presentation, null, 2))
|
|
85
|
+
const presentation = verifiedResponse?.oid4vpSubmission?.presentation
|
|
86
|
+
if (presentation && validatePresentationSubmission(definitionItem.query, presentation)) {
|
|
87
|
+
console.log('PRESENTATIONS:' + JSON.stringify(presentation, null, 2))
|
|
83
88
|
response.statusCode = 200
|
|
84
89
|
|
|
85
90
|
const authorizationChallengeValidationResponse: AuthorizationChallengeValidationResponse = {
|
|
@@ -90,7 +95,7 @@ export function verifyAuthResponseSIOPv2Endpoint(router: Router, context: IRequi
|
|
|
90
95
|
return response.send(JSON.stringify(authorizationChallengeValidationResponse))
|
|
91
96
|
}
|
|
92
97
|
|
|
93
|
-
const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId,
|
|
98
|
+
const responseRedirectURI = await context.agent.siopGetRedirectURI({ correlationId, state: verifiedResponse.state })
|
|
94
99
|
if (responseRedirectURI) {
|
|
95
100
|
response.setHeader('Content-Type', 'application/json')
|
|
96
101
|
return response.send(JSON.stringify({ redirect_uri: responseRedirectURI }))
|
|
@@ -114,26 +119,35 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
114
119
|
console.log(`getAuthRequest SIOP endpoint is disabled`)
|
|
115
120
|
return
|
|
116
121
|
}
|
|
117
|
-
const path = opts?.path ?? '/siop/
|
|
122
|
+
const path = opts?.path ?? '/siop/queries/:queryId/auth-requests/:correlationId'
|
|
118
123
|
router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
|
|
119
124
|
try {
|
|
120
125
|
const correlationId = request.params.correlationId
|
|
121
|
-
const
|
|
122
|
-
if (!correlationId || !
|
|
123
|
-
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId},
|
|
126
|
+
const queryId = request.params.queryId
|
|
127
|
+
if (!correlationId || !queryId) {
|
|
128
|
+
console.log(`No authorization request could be found for the given url. correlationId: ${correlationId}, queryId: ${queryId}`)
|
|
124
129
|
return sendErrorResponse(response, 404, 'No authorization request could be found')
|
|
125
130
|
}
|
|
126
131
|
const requestState = await context.agent.siopGetAuthRequestState({
|
|
127
132
|
correlationId,
|
|
128
|
-
definitionId,
|
|
129
133
|
errorOnNotFound: false,
|
|
130
134
|
})
|
|
131
135
|
if (!requestState) {
|
|
132
136
|
console.log(
|
|
133
|
-
`No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${
|
|
137
|
+
`No authorization request could be found for the given url in the state manager. correlationId: ${correlationId}, definitionId: ${queryId}`,
|
|
134
138
|
)
|
|
135
139
|
return sendErrorResponse(response, 404, `No authorization request could be found`)
|
|
136
140
|
}
|
|
141
|
+
|
|
142
|
+
const definitionItems = await context.agent.pdmGetDefinitions({ filter: buildQueryIdFilter(queryId) })
|
|
143
|
+
if (definitionItems.length === 0) {
|
|
144
|
+
console.log(`Could not get dcql query with id ${queryId} from agent. Will return 404`)
|
|
145
|
+
response.statusCode = 404
|
|
146
|
+
response.statusMessage = `No definition ${queryId}`
|
|
147
|
+
return response.send()
|
|
148
|
+
}
|
|
149
|
+
const payload = requestState.request?.requestObject?.getPayload()!
|
|
150
|
+
payload.dcql_query = definitionItems[0].query
|
|
137
151
|
const requestObject = await requestState.request?.requestObject?.toJwt()
|
|
138
152
|
console.log('JWT Request object:')
|
|
139
153
|
console.log(requestObject)
|
|
@@ -149,8 +163,7 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
149
163
|
} finally {
|
|
150
164
|
await context.agent.siopUpdateAuthRequestState({
|
|
151
165
|
correlationId,
|
|
152
|
-
|
|
153
|
-
state: 'sent',
|
|
166
|
+
state: 'authorization_request_created',
|
|
154
167
|
error,
|
|
155
168
|
})
|
|
156
169
|
}
|
|
@@ -159,3 +172,13 @@ export function getAuthRequestSIOPv2Endpoint(router: Router, context: IRequiredC
|
|
|
159
172
|
}
|
|
160
173
|
})
|
|
161
174
|
}
|
|
175
|
+
|
|
176
|
+
export function buildQueryIdFilter(queryId: string, tenantId?: string, version?: string) {
|
|
177
|
+
const queryFilter = {
|
|
178
|
+
queryId,
|
|
179
|
+
...(tenantId ? { tenantId } : {}),
|
|
180
|
+
...(version ? { version } : {}),
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return [queryFilter, ...(isValidUUID(queryId) ? [{ id: queryId }] : [])] // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version
|
|
184
|
+
}
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import { agentContext } from '@sphereon/ssi-sdk.core'
|
|
2
2
|
import { copyGlobalAuthToEndpoints, ExpressSupport } from '@sphereon/ssi-express-support'
|
|
3
|
-
import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'
|
|
4
3
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
5
4
|
import { TAgent } from '@veramo/core'
|
|
6
5
|
import express, { Express, Request, Response, Router } from 'express'
|
|
7
6
|
import { getAuthRequestSIOPv2Endpoint, verifyAuthResponseSIOPv2Endpoint } from './siop-api-functions'
|
|
8
7
|
import { IRequiredPlugins, ISIOPv2RPRestAPIOpts } from './types'
|
|
9
8
|
import {
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
authStatusUniversalOID4VPEndpoint,
|
|
10
|
+
createAuthRequestUniversalOID4VPEndpoint,
|
|
12
11
|
getDefinitionsEndpoint,
|
|
13
|
-
|
|
14
|
-
} from './
|
|
12
|
+
removeAuthRequestStateUniversalOID4VPEndpoint,
|
|
13
|
+
} from './universal-oid4vp-api-functions'
|
|
15
14
|
import swaggerUi from 'swagger-ui-express'
|
|
16
15
|
|
|
17
16
|
export class SIOPv2RPApiServer {
|
|
18
17
|
private readonly _express: Express
|
|
19
18
|
private readonly _router: Router
|
|
20
|
-
private readonly _agent: TAgent<
|
|
19
|
+
private readonly _agent: TAgent<ISIOPv2RP>
|
|
21
20
|
private readonly _opts?: ISIOPv2RPRestAPIOpts
|
|
22
21
|
private readonly _basePath: string
|
|
23
22
|
|
|
@@ -40,9 +39,9 @@ export class SIOPv2RPApiServer {
|
|
|
40
39
|
|
|
41
40
|
// Webapp endpoints
|
|
42
41
|
if (features.includes('rp-status')) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
createAuthRequestUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappCreateAuthRequest)
|
|
43
|
+
authStatusUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappAuthStatus)
|
|
44
|
+
removeAuthRequestStateUniversalOID4VPEndpoint(this._router, context, opts?.endpointOpts?.webappDeleteAuthRequest)
|
|
46
45
|
getDefinitionsEndpoint(this._router, context, opts?.endpointOpts?.webappGetDefinitions)
|
|
47
46
|
}
|
|
48
47
|
|
|
@@ -92,7 +91,7 @@ export class SIOPv2RPApiServer {
|
|
|
92
91
|
return this._router
|
|
93
92
|
}
|
|
94
93
|
|
|
95
|
-
get agent(): TAgent<
|
|
94
|
+
get agent(): TAgent<ISIOPv2RP> {
|
|
96
95
|
return this._agent
|
|
97
96
|
}
|
|
98
97
|
|
package/src/types/types.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import { CreateAuthorizationRequestPayload, CreateAuthorizationResponsePayload } from '@sphereon/did-auth-siop'
|
|
1
2
|
import { GenericAuthArgs, ISingleEndpointOpts } from '@sphereon/ssi-express-support'
|
|
2
|
-
import {
|
|
3
|
+
import { IPDManager } from '@sphereon/ssi-sdk.pd-manager'
|
|
4
|
+
import { AuthorizationRequestStateStatus, AuthorizationResponseStateStatus } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
|
|
3
5
|
import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
|
|
4
6
|
import { IAgentContext, ICredentialVerifier } from '@veramo/core'
|
|
5
|
-
import {
|
|
7
|
+
import { Request, Response } from 'express'
|
|
6
8
|
import { QRCodeOpts } from './QRCode.types'
|
|
9
|
+
import { VerifiedData } from '@sphereon/did-auth-siop'
|
|
7
10
|
|
|
8
11
|
export type SiopFeatures = 'rp-status' | 'siop'
|
|
12
|
+
|
|
9
13
|
export interface ISIOPv2RPRestAPIOpts {
|
|
10
14
|
enableFeatures?: SiopFeatures[]
|
|
11
15
|
endpointOpts?: {
|
|
@@ -28,5 +32,36 @@ export interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpt
|
|
|
28
32
|
responseRedirectURI?: string
|
|
29
33
|
}
|
|
30
34
|
|
|
31
|
-
export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP &
|
|
35
|
+
export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPDManager
|
|
32
36
|
export type IRequiredContext = IAgentContext<IRequiredPlugins>
|
|
37
|
+
|
|
38
|
+
export type CreateAuthorizationRequestPayloadRequest = Request<Record<string, never>, any, CreateAuthorizationRequestPayload, Record<string, never>>
|
|
39
|
+
|
|
40
|
+
export type CreateAuthorizationResponsePayloadResponse = Response<CreateAuthorizationResponsePayload>
|
|
41
|
+
|
|
42
|
+
export type DeleteAuthorizationRequest = Request<DeleteAuthorizationRequestPathParameters, any, Record<string, any>, Record<string, any>>
|
|
43
|
+
|
|
44
|
+
export type DeleteAuthorizationRequestPathParameters = {
|
|
45
|
+
correlationId: string
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type GetAuthorizationRequestStatus = Request<GetAuthorizationRequestStatusPathParameters, any, Record<string, any>, Record<string, any>>
|
|
49
|
+
|
|
50
|
+
export type GetAuthorizationRequestStatusPathParameters = {
|
|
51
|
+
correlationId: string
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type RequestError = {
|
|
55
|
+
status: number
|
|
56
|
+
message: string
|
|
57
|
+
error_details?: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface AuthStatusResponse {
|
|
61
|
+
status: AuthorizationRequestStateStatus | AuthorizationResponseStateStatus
|
|
62
|
+
correlation_id: string
|
|
63
|
+
query_id: string
|
|
64
|
+
last_updated: number
|
|
65
|
+
verified_data?: VerifiedData
|
|
66
|
+
error?: RequestError
|
|
67
|
+
}
|