@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.34.1-feature.SSISDK.57.uni.client.206 → 0.34.1-feature.SSISDK.58.host.nonce.endpoint.145

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.
@@ -1,195 +0,0 @@
1
- import {
2
- AuthorizationRequestStateStatus,
3
- AuthorizationResponseStateStatus,
4
- CreateAuthorizationRequest,
5
- createAuthorizationRequestFromPayload,
6
- CreateAuthorizationRequestPayloadSchema,
7
- CreateAuthorizationResponsePayload,
8
- } from '@sphereon/did-auth-siop'
9
- import { checkAuth, ISingleEndpointOpts, sendErrorResponse } from '@sphereon/ssi-express-support'
10
- import { uriWithBase } from '@sphereon/ssi-sdk.siopv2-oid4vp-common'
11
- import { VerifiedDataMode } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
12
- import { Request, Response, Router } from 'express'
13
- import uuid from 'short-uuid'
14
- import { validateData } from './middleware/validationMiddleware'
15
- import {
16
- AuthStatusResponse,
17
- CreateAuthorizationRequestPayloadRequest,
18
- CreateAuthorizationResponsePayloadResponse,
19
- DeleteAuthorizationRequest,
20
- GetAuthorizationRequestStatus,
21
- ICreateAuthRequestWebappEndpointOpts,
22
- IRequiredContext,
23
- QRCodeOpts,
24
- } from './types'
25
-
26
- export function createAuthRequestUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ICreateAuthRequestWebappEndpointOpts) {
27
- if (opts?.enabled === false) {
28
- console.log(`createAuthRequest universal OID4VP endpoint is disabled`)
29
- return
30
- }
31
-
32
- const path = opts?.path ?? '/backend/auth/requests'
33
- router.post(
34
- path,
35
- checkAuth(opts?.endpoint),
36
- validateData(CreateAuthorizationRequestPayloadSchema),
37
- async (request: CreateAuthorizationRequestPayloadRequest, response: CreateAuthorizationResponsePayloadResponse) => {
38
- try {
39
- const authRequest: CreateAuthorizationRequest = createAuthorizationRequestFromPayload(request.body)
40
- const correlationId = authRequest.correlationId ?? uuid.uuid()
41
- const qrCodeOpts = authRequest.qrCode ? ({ ...authRequest.qrCode } satisfies QRCodeOpts) : opts?.qrCodeOpts
42
- const queryId = authRequest.queryId
43
-
44
- const definitionItems = await context.agent.pdmGetDefinitions({
45
- filter: [
46
- { id: queryId }, // Allow both PK (unique queryId + version combi) or just plain queryId which assumes the latest version
47
- { queryId },
48
- ],
49
- })
50
- if (definitionItems.length === 0) {
51
- console.log(`No query could be found for the given id. Query id: ${queryId}`)
52
- return sendErrorResponse(response, 404, { status: 404, message: 'No query could be found' })
53
- }
54
-
55
- const requestByReferenceURI = uriWithBase(`/siop/queries/${queryId}/auth-requests/${correlationId}`, {
56
- baseURI: authRequest.requestUriBase ?? opts?.siopBaseURI,
57
- })
58
- const responseURI = uriWithBase(`/siop/queries/${queryId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })
59
-
60
- const authRequestURI = await context.agent.siopCreateAuthRequestURI({
61
- queryId,
62
- correlationId,
63
- nonce: uuid.uuid(),
64
- requestByReferenceURI,
65
- responseURIType: 'response_uri',
66
- responseURI,
67
- ...(authRequest.directPostResponseRedirectUri && { responseRedirectURI: authRequest.directPostResponseRedirectUri }),
68
- ...(authRequest.callback && { callback: authRequest.callback }),
69
- })
70
-
71
- let qrCodeDataUri: string | undefined
72
- if (qrCodeOpts) {
73
- const { AwesomeQR } = await import('awesome-qr')
74
- const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })
75
- qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`
76
- } else {
77
- qrCodeDataUri = authRequestURI
78
- }
79
-
80
- const authRequestBody = {
81
- query_id: queryId,
82
- correlation_id: correlationId,
83
- request_uri: authRequestURI,
84
- status_uri: `${uriWithBase(opts?.webappAuthStatusPath ?? `/backend/auth/status/${correlationId}`, { baseURI: opts?.webappBaseURI })}`,
85
- ...(qrCodeDataUri && { qr_uri: qrCodeDataUri }),
86
- } satisfies CreateAuthorizationResponsePayload
87
- console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)
88
-
89
- return response.status(201).json(authRequestBody)
90
- } catch (error) {
91
- return sendErrorResponse(response, 500, { status: 500, message: 'Could not create an authorization request URI' }, error)
92
- }
93
- },
94
- )
95
- }
96
-
97
- export function removeAuthRequestStateUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
98
- if (opts?.enabled === false) {
99
- console.log(`removeAuthStatus universal OID4VP endpoint is disabled`)
100
- return
101
- }
102
-
103
- const path = opts?.path ?? '/backend/auth/requests/:correlationId'
104
- router.delete(path, checkAuth(opts?.endpoint), async (request: DeleteAuthorizationRequest, response: Response) => {
105
- try {
106
- const correlationId: string = request.params.correlationId
107
-
108
- const authRequestState = await context.agent.siopGetAuthRequestState({
109
- correlationId,
110
- errorOnNotFound: false,
111
- })
112
- if (!authRequestState) {
113
- console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)
114
- return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })
115
- }
116
-
117
- await context.agent.siopDeleteAuthState({ correlationId })
118
-
119
- return response.status(204).json()
120
- } catch (error) {
121
- return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)
122
- }
123
- })
124
- }
125
-
126
- export function authStatusUniversalOID4VPEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
127
- if (opts?.enabled === false) {
128
- console.log(`authStatus universal OID4VP endpoint is disabled`)
129
- return
130
- }
131
-
132
- const path = opts?.path ?? '/backend/auth/status/:correlationId'
133
- router.get(path, checkAuth(opts?.endpoint), async (request: GetAuthorizationRequestStatus, response: Response) => {
134
- try {
135
- console.log('Received auth-status request...')
136
- const correlationId: string = request.params.correlationId
137
-
138
- const requestState = await context.agent.siopGetAuthRequestState({
139
- correlationId,
140
- errorOnNotFound: false,
141
- })
142
-
143
- if (!requestState) {
144
- console.log(`No authorization request could be found for the given correlationId. correlationId: ${correlationId}`)
145
- return sendErrorResponse(response, 404, { status: 404, message: 'No authorization request could be found' })
146
- }
147
-
148
- let responseState
149
- if (requestState.status === AuthorizationRequestStateStatus.RETRIEVED) {
150
- responseState = await context.agent.siopGetAuthResponseState({
151
- correlationId,
152
- errorOnNotFound: false,
153
- includeVerifiedData: VerifiedDataMode.VERIFIED_PRESENTATION,
154
- })
155
- }
156
- const overallState = responseState ?? requestState
157
-
158
- const statusBody = {
159
- status: overallState.status,
160
- correlation_id: overallState.correlationId,
161
- query_id: overallState.queryId,
162
- last_updated: overallState.lastUpdated,
163
- ...(responseState?.status === AuthorizationResponseStateStatus.VERIFIED &&
164
- responseState.verifiedData !== undefined && { verified_data: responseState.verifiedData }),
165
- ...(overallState.error && { message: overallState.error.message }),
166
- } satisfies AuthStatusResponse
167
- console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
168
-
169
- if (overallState.status === 'error') {
170
- return response.status(500).json(statusBody)
171
- }
172
- return response.status(200).json(statusBody)
173
- } catch (error) {
174
- return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)
175
- }
176
- })
177
- }
178
-
179
- export function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
180
- if (opts?.enabled === false) {
181
- console.log(`getDefinitions universal OID4VP endpoint is disabled`)
182
- return
183
- }
184
-
185
- const path = opts?.path ?? '/backend/definitions'
186
- router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
187
- try {
188
- const definitions = await context.agent.pdmGetDefinitions()
189
- response.statusCode = 200
190
- return response.json(definitions)
191
- } catch (error) {
192
- return sendErrorResponse(response, 500, { status: 500, message: error.message }, error)
193
- }
194
- })
195
- }