@sphereon/ssi-sdk.siopv2-oid4vp-rp-rest-api 0.32.1-next.18 → 0.32.1-next.287

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ export * from './types'
2
+ export * from './QRCode.types'
@@ -3,15 +3,18 @@ import { IPresentationExchange } from '@sphereon/ssi-sdk.presentation-exchange'
3
3
  import { ISIOPv2RP } from '@sphereon/ssi-sdk.siopv2-oid4vp-rp-auth'
4
4
  import { IAgentContext, ICredentialVerifier } from '@veramo/core'
5
5
  import { IPDManager } from '@sphereon/ssi-sdk.pd-manager'
6
+ import { QRCodeOpts } from './QRCode.types'
6
7
 
7
8
  export type SiopFeatures = 'rp-status' | 'siop'
8
9
  export interface ISIOPv2RPRestAPIOpts {
9
10
  enableFeatures?: SiopFeatures[]
10
11
  endpointOpts?: {
11
12
  basePath?: string
13
+ trustProxy?: boolean | Array<string>
12
14
  globalAuth?: GenericAuthArgs & { secureSiopEndpoints?: boolean }
13
15
  webappCreateAuthRequest?: ICreateAuthRequestWebappEndpointOpts // Override the create Auth Request path. Needs to contain correlationId and definitionId path params!
14
16
  webappDeleteAuthRequest?: ISingleEndpointOpts // Override the delete Auth Request path. Needs to contain correlationId and definitionId path params!
17
+ webappGetDefinitions?: ISingleEndpointOpts // Override the delete Auth Request path. Needs to contain correlationId and definitionId path params!
15
18
  webappAuthStatus?: ISingleEndpointOpts // Override the Auth status path. CorrelationId and definitionId need to come from the body!
16
19
  siopVerifyAuthResponse?: ISingleEndpointOpts // Override the siop Verify Response path. Needs to contain correlationId and definitionId path params!
17
20
  siopGetAuthRequest?: ISingleEndpointOpts // Override the siop get Auth Request path. Needs to contain correlationId and definitionId path params!
@@ -19,9 +22,10 @@ export interface ISIOPv2RPRestAPIOpts {
19
22
  }
20
23
  export interface ICreateAuthRequestWebappEndpointOpts extends ISingleEndpointOpts {
21
24
  siopBaseURI?: string
25
+ qrCodeOpts?: QRCodeOpts
22
26
  webappAuthStatusPath?: string
23
27
  webappBaseURI?: string
24
- nonce?: string
28
+ responseRedirectURI?: string
25
29
  }
26
30
 
27
31
  export type IRequiredPlugins = ICredentialVerifier & ISIOPv2RP & IPresentationExchange & IPDManager
@@ -17,33 +17,49 @@ export function createAuthRequestWebappEndpoint(router: Router, context: IRequir
17
17
  try {
18
18
  // if (!request.agent) throw Error('No agent configured')
19
19
  const definitionId = request.params.definitionId
20
- const state: string = uuid.uuid()
21
- const correlationId = state
20
+ if (!definitionId) {
21
+ return sendErrorResponse(response, 400, 'No definitionId query parameter provided')
22
+ }
23
+ const state: string = request.body.state ?? uuid.uuid()
24
+ const correlationId = request.body.correlationId ?? state
25
+ const qrCodeOpts = request.body.qrCodeOpts ?? opts?.qrCodeOpts
22
26
 
23
- const requestByReferenceURI = uriWithBase(`/siop/definitions/${definitionId}/auth-requests/${correlationId}`, {
27
+ const requestByReferenceURI = uriWithBase(`/siop/definitions/${definitionId}/auth-requests/${state}`, {
24
28
  baseURI: opts?.siopBaseURI,
25
29
  })
26
- const responseURI = uriWithBase(`/siop/definitions/${definitionId}/auth-responses/${correlationId}`, { baseURI: opts?.siopBaseURI })
27
- const responseRedirectURI = 'response_redirect_uri' in request.body && (request.body.response_redirect_uri as string | undefined)
30
+ const responseURI = uriWithBase(`/siop/definitions/${definitionId}/auth-responses/${state}`, { baseURI: opts?.siopBaseURI })
31
+ // first version is for backwards compat
32
+ const responseRedirectURI =
33
+ ('response_redirect_uri' in request.body && (request.body.response_redirect_uri as string | undefined)) ??
34
+ ('responseRedirectURI' in request.body && (request.body.responseRedirectURI as string | undefined))
28
35
 
29
36
  const authRequestURI = await context.agent.siopCreateAuthRequestURI({
30
37
  definitionId,
31
38
  correlationId,
32
39
  state,
33
- nonce: opts?.nonce,
40
+ nonce: uuid.uuid(),
34
41
  requestByReferenceURI,
35
42
  responseURIType: 'response_uri',
36
43
  responseURI,
37
44
  ...(responseRedirectURI && { responseRedirectURI }),
38
45
  })
46
+
47
+ let qrCodeDataUri: string | undefined
48
+ if (qrCodeOpts) {
49
+ const { AwesomeQR } = await import('awesome-qr')
50
+ const qrCode = new AwesomeQR({ ...qrCodeOpts, text: authRequestURI })
51
+ qrCodeDataUri = `data:image/png;base64,${(await qrCode.draw())!.toString('base64')}`
52
+ }
39
53
  const authRequestBody: GenerateAuthRequestURIResponse = {
40
54
  correlationId,
55
+ state,
41
56
  definitionId,
42
57
  authRequestURI,
43
58
  authStatusURI: `${uriWithBase(opts?.webappAuthStatusPath ?? '/webapp/auth-status', { baseURI: opts?.webappBaseURI })}`,
59
+ ...(qrCodeDataUri && { qrCodeDataUri }),
44
60
  }
45
61
  console.log(`Auth Request URI data to send back: ${JSON.stringify(authRequestBody)}`)
46
- return response.send(authRequestBody)
62
+ return response.json(authRequestBody)
47
63
  } catch (error) {
48
64
  return sendErrorResponse(response, 500, 'Could not create an authorization request URI', error)
49
65
  }
@@ -82,7 +98,7 @@ export function authStatusWebappEndpoint(router: Router, context: IRequiredConte
82
98
  definitionId,
83
99
  lastUpdated: requestState ? requestState.lastUpdated : Date.now(),
84
100
  }
85
- return response.send(statusBody)
101
+ return response.json(statusBody)
86
102
  }
87
103
 
88
104
  let includeVerifiedData: VerifiedDataMode = VerifiedDataMode.NONE
@@ -114,13 +130,13 @@ export function authStatusWebappEndpoint(router: Router, context: IRequiredConte
114
130
  }
115
131
  : {}),
116
132
  }
117
- console.log(`Will send auth status: ${JSON.stringify(statusBody)}`)
133
+ console.debug(`Will send auth status: ${JSON.stringify(statusBody)}`)
118
134
  if (overallState.status === 'error') {
119
135
  response.statusCode = 500
120
- return response.send(statusBody)
136
+ return response.json(statusBody)
121
137
  }
122
138
  response.statusCode = 200
123
- return response.send(statusBody)
139
+ return response.json(statusBody)
124
140
  } catch (error) {
125
141
  return sendErrorResponse(response, 500, error.message, error)
126
142
  }
@@ -142,7 +158,24 @@ export function removeAuthRequestStateWebappEndpoint(router: Router, context: IR
142
158
  return sendErrorResponse(response, 404, 'No authorization request could be found')
143
159
  }
144
160
  response.statusCode = 200
145
- return response.send(context.agent.siopDeleteAuthState({ definitionId, correlationId }))
161
+ return response.json(await context.agent.siopDeleteAuthState({ definitionId, correlationId }))
162
+ } catch (error) {
163
+ return sendErrorResponse(response, 500, error.message, error)
164
+ }
165
+ })
166
+ }
167
+
168
+ export function getDefinitionsEndpoint(router: Router, context: IRequiredContext, opts?: ISingleEndpointOpts) {
169
+ if (opts?.enabled === false) {
170
+ console.log(`getDefinitions Webapp endpoint is disabled`)
171
+ return
172
+ }
173
+ const path = opts?.path ?? '/webapp/definitions'
174
+ router.get(path, checkAuth(opts?.endpoint), async (request: Request, response: Response) => {
175
+ try {
176
+ const definitions = await context.agent.pdmGetDefinitions()
177
+ response.statusCode = 200
178
+ return response.json(definitions)
146
179
  } catch (error) {
147
180
  return sendErrorResponse(response, 500, error.message, error)
148
181
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAEzD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,MAAM,CAAA;AAC/C,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,YAAY,EAAE,CAAA;IAC/B,YAAY,CAAC,EAAE;QACb,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,UAAU,CAAC,EAAE,eAAe,GAAG;YAAE,mBAAmB,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;QAChE,uBAAuB,CAAC,EAAE,oCAAoC,CAAA;QAC9D,uBAAuB,CAAC,EAAE,mBAAmB,CAAA;QAC7C,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;QACtC,sBAAsB,CAAC,EAAE,mBAAmB,CAAA;QAC5C,kBAAkB,CAAC,EAAE,mBAAmB,CAAA;KACzC,CAAA;CACF;AACD,MAAM,WAAW,oCAAqC,SAAQ,mBAAmB;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,SAAS,GAAG,qBAAqB,GAAG,UAAU,CAAA;AACnG,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,CAAC,CAAA"}
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
File without changes