@pagopa/io-react-native-wallet 0.12.0 → 0.13.1

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.
Files changed (205) hide show
  1. package/lib/commonjs/client/generated/wallet-provider.js +22 -22
  2. package/lib/commonjs/client/generated/wallet-provider.js.map +1 -1
  3. package/lib/commonjs/client/index.js +1 -2
  4. package/lib/commonjs/client/index.js.map +1 -1
  5. package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js +2 -1
  6. package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js.map +1 -1
  7. package/lib/commonjs/credential/issuance/03-start-credential-issuance.js +287 -0
  8. package/lib/commonjs/credential/issuance/03-start-credential-issuance.js.map +1 -0
  9. package/lib/commonjs/credential/issuance/03-start-user-authorization.js +55 -82
  10. package/lib/commonjs/credential/issuance/03-start-user-authorization.js.map +1 -1
  11. package/lib/commonjs/credential/issuance/04-complete-user-authorization.js +88 -0
  12. package/lib/commonjs/credential/issuance/04-complete-user-authorization.js.map +1 -1
  13. package/lib/commonjs/credential/issuance/05-authorize-access.js +55 -32
  14. package/lib/commonjs/credential/issuance/05-authorize-access.js.map +1 -1
  15. package/lib/commonjs/credential/issuance/06-obtain-credential.js +50 -77
  16. package/lib/commonjs/credential/issuance/06-obtain-credential.js.map +1 -1
  17. package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js +21 -44
  18. package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
  19. package/lib/commonjs/credential/issuance/index.js +7 -0
  20. package/lib/commonjs/credential/issuance/index.js.map +1 -1
  21. package/lib/commonjs/credential/issuance/types.js +28 -0
  22. package/lib/commonjs/credential/issuance/types.js.map +1 -0
  23. package/lib/commonjs/index.js.map +1 -1
  24. package/lib/commonjs/pid/sd-jwt/converters.js +5 -9
  25. package/lib/commonjs/pid/sd-jwt/converters.js.map +1 -1
  26. package/lib/commonjs/pid/sd-jwt/types.js +3 -3
  27. package/lib/commonjs/pid/sd-jwt/types.js.map +1 -1
  28. package/lib/commonjs/sd-jwt/__test__/converters.test.js +1 -1
  29. package/lib/commonjs/sd-jwt/__test__/converters.test.js.map +1 -1
  30. package/lib/commonjs/sd-jwt/__test__/index.test.js +30 -43
  31. package/lib/commonjs/sd-jwt/__test__/index.test.js.map +1 -1
  32. package/lib/commonjs/sd-jwt/__test__/types.test.js +16 -24
  33. package/lib/commonjs/sd-jwt/__test__/types.test.js.map +1 -1
  34. package/lib/commonjs/sd-jwt/index.js +3 -9
  35. package/lib/commonjs/sd-jwt/index.js.map +1 -1
  36. package/lib/commonjs/sd-jwt/types.js +11 -16
  37. package/lib/commonjs/sd-jwt/types.js.map +1 -1
  38. package/lib/commonjs/trust/types.js +70 -29
  39. package/lib/commonjs/trust/types.js.map +1 -1
  40. package/lib/commonjs/utils/auth.js +44 -0
  41. package/lib/commonjs/utils/auth.js.map +1 -0
  42. package/lib/commonjs/utils/errors.js +77 -2
  43. package/lib/commonjs/utils/errors.js.map +1 -1
  44. package/lib/commonjs/utils/misc.js +34 -1
  45. package/lib/commonjs/utils/misc.js.map +1 -1
  46. package/lib/commonjs/utils/par.js +23 -15
  47. package/lib/commonjs/utils/par.js.map +1 -1
  48. package/lib/commonjs/utils/pop.js +33 -0
  49. package/lib/commonjs/utils/pop.js.map +1 -0
  50. package/lib/commonjs/wallet-instance-attestation/issuing.js +17 -2
  51. package/lib/commonjs/wallet-instance-attestation/issuing.js.map +1 -1
  52. package/lib/commonjs/wallet-instance-attestation/types.js +7 -7
  53. package/lib/commonjs/wallet-instance-attestation/types.js.map +1 -1
  54. package/lib/module/client/generated/wallet-provider.js +16 -19
  55. package/lib/module/client/generated/wallet-provider.js.map +1 -1
  56. package/lib/module/client/index.js +1 -2
  57. package/lib/module/client/index.js.map +1 -1
  58. package/lib/module/credential/issuance/02-evaluate-issuer-trust.js +2 -1
  59. package/lib/module/credential/issuance/02-evaluate-issuer-trust.js.map +1 -1
  60. package/lib/module/credential/issuance/03-start-credential-issuance.js +276 -0
  61. package/lib/module/credential/issuance/03-start-credential-issuance.js.map +1 -0
  62. package/lib/module/credential/issuance/03-start-user-authorization.js +55 -79
  63. package/lib/module/credential/issuance/03-start-user-authorization.js.map +1 -1
  64. package/lib/module/credential/issuance/04-complete-user-authorization.js +85 -1
  65. package/lib/module/credential/issuance/04-complete-user-authorization.js.map +1 -1
  66. package/lib/module/credential/issuance/05-authorize-access.js +53 -32
  67. package/lib/module/credential/issuance/05-authorize-access.js.map +1 -1
  68. package/lib/module/credential/issuance/06-obtain-credential.js +49 -74
  69. package/lib/module/credential/issuance/06-obtain-credential.js.map +1 -1
  70. package/lib/module/credential/issuance/07-verify-and-parse-credential.js +21 -44
  71. package/lib/module/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
  72. package/lib/module/credential/issuance/index.js +2 -1
  73. package/lib/module/credential/issuance/index.js.map +1 -1
  74. package/lib/module/credential/issuance/types.js +18 -0
  75. package/lib/module/credential/issuance/types.js.map +1 -0
  76. package/lib/module/index.js.map +1 -1
  77. package/lib/module/pid/sd-jwt/converters.js +5 -9
  78. package/lib/module/pid/sd-jwt/converters.js.map +1 -1
  79. package/lib/module/pid/sd-jwt/types.js +3 -3
  80. package/lib/module/pid/sd-jwt/types.js.map +1 -1
  81. package/lib/module/sd-jwt/__test__/converters.test.js +1 -1
  82. package/lib/module/sd-jwt/__test__/converters.test.js.map +1 -1
  83. package/lib/module/sd-jwt/__test__/index.test.js +30 -43
  84. package/lib/module/sd-jwt/__test__/index.test.js.map +1 -1
  85. package/lib/module/sd-jwt/__test__/types.test.js +16 -24
  86. package/lib/module/sd-jwt/__test__/types.test.js.map +1 -1
  87. package/lib/module/sd-jwt/index.js +3 -9
  88. package/lib/module/sd-jwt/index.js.map +1 -1
  89. package/lib/module/sd-jwt/types.js +11 -16
  90. package/lib/module/sd-jwt/types.js.map +1 -1
  91. package/lib/module/sd-jwt/verifier.js.map +1 -1
  92. package/lib/module/trust/types.js +70 -29
  93. package/lib/module/trust/types.js.map +1 -1
  94. package/lib/module/utils/auth.js +35 -0
  95. package/lib/module/utils/auth.js.map +1 -0
  96. package/lib/module/utils/errors.js +71 -0
  97. package/lib/module/utils/errors.js.map +1 -1
  98. package/lib/module/utils/misc.js +31 -0
  99. package/lib/module/utils/misc.js.map +1 -1
  100. package/lib/module/utils/par.js +24 -16
  101. package/lib/module/utils/par.js.map +1 -1
  102. package/lib/module/utils/pop.js +24 -0
  103. package/lib/module/utils/pop.js.map +1 -0
  104. package/lib/module/wallet-instance-attestation/issuing.js +17 -2
  105. package/lib/module/wallet-instance-attestation/issuing.js.map +1 -1
  106. package/lib/module/wallet-instance-attestation/types.js +7 -7
  107. package/lib/module/wallet-instance-attestation/types.js.map +1 -1
  108. package/lib/typescript/client/generated/wallet-provider.d.ts +35 -13
  109. package/lib/typescript/client/generated/wallet-provider.d.ts.map +1 -1
  110. package/lib/typescript/client/index.d.ts.map +1 -1
  111. package/lib/typescript/credential/issuance/01-start-flow.d.ts +1 -0
  112. package/lib/typescript/credential/issuance/01-start-flow.d.ts.map +1 -1
  113. package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts +2 -1
  114. package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts.map +1 -1
  115. package/lib/typescript/credential/issuance/03-start-credential-issuance.d.ts +41 -0
  116. package/lib/typescript/credential/issuance/03-start-credential-issuance.d.ts.map +1 -0
  117. package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts +22 -17
  118. package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts.map +1 -1
  119. package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts +24 -12
  120. package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts.map +1 -1
  121. package/lib/typescript/credential/issuance/05-authorize-access.d.ts +21 -15
  122. package/lib/typescript/credential/issuance/05-authorize-access.d.ts.map +1 -1
  123. package/lib/typescript/credential/issuance/06-obtain-credential.d.ts +19 -26
  124. package/lib/typescript/credential/issuance/06-obtain-credential.d.ts.map +1 -1
  125. package/lib/typescript/credential/issuance/07-verify-and-parse-credential.d.ts +10 -15
  126. package/lib/typescript/credential/issuance/07-verify-and-parse-credential.d.ts.map +1 -1
  127. package/lib/typescript/credential/issuance/index.d.ts +3 -4
  128. package/lib/typescript/credential/issuance/index.d.ts.map +1 -1
  129. package/lib/typescript/credential/issuance/types.d.ts +63 -0
  130. package/lib/typescript/credential/issuance/types.d.ts.map +1 -0
  131. package/lib/typescript/credential/presentation/types.d.ts +6 -6
  132. package/lib/typescript/index.d.ts +2 -1
  133. package/lib/typescript/index.d.ts.map +1 -1
  134. package/lib/typescript/pid/sd-jwt/converters.d.ts.map +1 -1
  135. package/lib/typescript/pid/sd-jwt/types.d.ts +36 -36
  136. package/lib/typescript/pid/sd-jwt/types.d.ts.map +1 -1
  137. package/lib/typescript/sd-jwt/index.d.ts +40 -68
  138. package/lib/typescript/sd-jwt/index.d.ts.map +1 -1
  139. package/lib/typescript/sd-jwt/types.d.ts +64 -121
  140. package/lib/typescript/sd-jwt/types.d.ts.map +1 -1
  141. package/lib/typescript/trust/index.d.ts +150 -48
  142. package/lib/typescript/trust/index.d.ts.map +1 -1
  143. package/lib/typescript/trust/types.d.ts +2838 -1740
  144. package/lib/typescript/trust/types.d.ts.map +1 -1
  145. package/lib/typescript/utils/auth.d.ts +52 -0
  146. package/lib/typescript/utils/auth.d.ts.map +1 -0
  147. package/lib/typescript/utils/errors.d.ts +36 -1
  148. package/lib/typescript/utils/errors.d.ts.map +1 -1
  149. package/lib/typescript/utils/integrity.d.ts +1 -1
  150. package/lib/typescript/utils/misc.d.ts +18 -0
  151. package/lib/typescript/utils/misc.d.ts.map +1 -1
  152. package/lib/typescript/utils/par.d.ts +8 -31
  153. package/lib/typescript/utils/par.d.ts.map +1 -1
  154. package/lib/typescript/utils/pop.d.ts +26 -0
  155. package/lib/typescript/utils/pop.d.ts.map +1 -0
  156. package/lib/typescript/wallet-instance-attestation/issuing.d.ts +2 -1
  157. package/lib/typescript/wallet-instance-attestation/issuing.d.ts.map +1 -1
  158. package/lib/typescript/wallet-instance-attestation/types.d.ts +59 -59
  159. package/lib/typescript/wallet-instance-attestation/types.d.ts.map +1 -1
  160. package/package.json +2 -1
  161. package/src/client/generated/wallet-provider.ts +24 -21
  162. package/src/client/index.ts +3 -8
  163. package/src/credential/issuance/01-start-flow.ts +1 -0
  164. package/src/credential/issuance/02-evaluate-issuer-trust.ts +2 -1
  165. package/src/credential/issuance/03-start-credential-issuance.ts +407 -0
  166. package/src/credential/issuance/03-start-user-authorization.ts +87 -92
  167. package/src/credential/issuance/04-complete-user-authorization.ts +114 -13
  168. package/src/credential/issuance/05-authorize-access.ts +73 -48
  169. package/src/credential/issuance/06-obtain-credential.ts +77 -111
  170. package/src/credential/issuance/07-verify-and-parse-credential.ts +30 -67
  171. package/src/credential/issuance/index.ts +6 -4
  172. package/src/credential/issuance/types.ts +25 -0
  173. package/src/index.ts +2 -1
  174. package/src/pid/sd-jwt/converters.ts +5 -11
  175. package/src/pid/sd-jwt/types.ts +8 -6
  176. package/src/sd-jwt/__test__/converters.test.ts +1 -1
  177. package/src/sd-jwt/__test__/index.test.ts +45 -74
  178. package/src/sd-jwt/__test__/types.test.ts +21 -33
  179. package/src/sd-jwt/index.ts +3 -12
  180. package/src/sd-jwt/types.ts +17 -22
  181. package/src/trust/types.ts +64 -32
  182. package/src/utils/auth.ts +37 -0
  183. package/src/utils/errors.ts +85 -1
  184. package/src/utils/integrity.ts +1 -1
  185. package/src/utils/misc.ts +43 -0
  186. package/src/utils/par.ts +29 -17
  187. package/src/utils/pop.ts +34 -0
  188. package/src/wallet-instance-attestation/issuing.ts +39 -2
  189. package/src/wallet-instance-attestation/types.ts +11 -7
  190. package/lib/commonjs/credential/issuance/07-confirm-credential.js +0 -6
  191. package/lib/commonjs/credential/issuance/07-confirm-credential.js.map +0 -1
  192. package/lib/commonjs/credential/issuance/08-confirm-credential.js +0 -6
  193. package/lib/commonjs/credential/issuance/08-confirm-credential.js.map +0 -1
  194. package/lib/module/credential/issuance/07-confirm-credential.js +0 -2
  195. package/lib/module/credential/issuance/07-confirm-credential.js.map +0 -1
  196. package/lib/module/credential/issuance/08-confirm-credential.js +0 -2
  197. package/lib/module/credential/issuance/08-confirm-credential.js.map +0 -1
  198. package/lib/typescript/credential/issuance/07-confirm-credential.d.ts +0 -11
  199. package/lib/typescript/credential/issuance/07-confirm-credential.d.ts.map +0 -1
  200. package/lib/typescript/credential/issuance/08-confirm-credential.d.ts +0 -11
  201. package/lib/typescript/credential/issuance/08-confirm-credential.d.ts.map +0 -1
  202. package/src/credential/issuance/07-confirm-credential.ts +0 -14
  203. package/src/credential/issuance/08-confirm-credential.ts +0 -14
  204. package/src/sd-jwt/__test__/converters.test.js +0 -24
  205. package/src/sd-jwt/verifier.js +0 -12
@@ -0,0 +1,276 @@
1
+ import uuid from "react-native-uuid";
2
+ import { makeParRequest } from "../../utils/par";
3
+ import { SignJWT } from "@pagopa/io-react-native-jwt";
4
+ import { generateRandomAlphaNumericString, hasStatus, until } from "../../utils/misc";
5
+ import { ASSERTION_TYPE } from "./const";
6
+ import parseUrl from "parse-url";
7
+ import { AuthorizationError, AuthorizationIdpError, ValidationFailed } from "../../utils/errors";
8
+ import { AuthorizationErrorShape, AuthorizationResultShape } from "../../utils/auth";
9
+ import { withEphemeralKey } from "../../utils/crypto";
10
+ import { createDPopToken } from "../../utils/dpop";
11
+ import { createPopToken } from "../../utils/pop";
12
+ import { CredentialResponse, TokenResponse } from "./types";
13
+ import * as WalletInstanceAttestation from "../../wallet-instance-attestation";
14
+ import { Linking } from "react-native";
15
+
16
+ /**
17
+ * Ensures that the credential type requested is supported by the issuer and contained in the
18
+ * issuer configuration.
19
+ * @param issuerConf The issuer configuration
20
+ * @param credentialType The type of the credential to be requested
21
+ * @returns The credential definition to be used in the request which includes the format and the type and its type
22
+ */
23
+ const selectCredentialDefinition = (issuerConf, credentialType) => {
24
+ const credential_configurations_supported = issuerConf.openid_credential_issuer.credential_configurations_supported;
25
+ const [result] = Object.keys(credential_configurations_supported).filter(e => e.includes(credentialType)).map(e => ({
26
+ credential_configuration_id: credentialType,
27
+ format: credential_configurations_supported[e].format,
28
+ type: "openid_credential"
29
+ }));
30
+ if (!result) {
31
+ throw new Error(`No credential support the type '${credentialType}'`);
32
+ }
33
+ return result;
34
+ };
35
+
36
+ /**
37
+ * Ensures that the response mode requested is supported by the issuer and contained in the issuer configuration.
38
+ * @param issuerConf The issuer configuration
39
+ * @param credentialType The type of the credential to be requested
40
+ * @returns The response mode to be used in the request, "query" for PersonIdentificationData and "form_post.jwt" for all other types.
41
+ */
42
+ const selectResponseMode = (issuerConf, credentialType) => {
43
+ const responseModeSupported = issuerConf.oauth_authorization_server.response_modes_supported;
44
+ const responseMode = credentialType === "PersonIdentificationData" ? "query" : "form_post.jwt";
45
+ if (!responseModeSupported.includes(responseMode)) {
46
+ throw new Error(`No response mode support the type '${credentialType}'`);
47
+ }
48
+ return responseMode;
49
+ };
50
+ /**
51
+ * Starts the credential issuance flow to obtain a credential from the issuer.
52
+ * @param issuerConf The Issuer configuration
53
+ * @param credentialType The type of the credential to be requested
54
+ * @param context.wiaCryptoContext The context to access the key associated with the Wallet Instance Attestation
55
+ * @param context.credentialCryptoContext The context to access the key to associat with credential
56
+ * @param context.walletInstanceAttestation The Wallet Instance Attestation token
57
+ * @param context.authorizationContext The context to identify the user which will be used to start the authorization. It's needed only when requesting a PersonalIdentificationData credential. The implementantion should open an in-app browser capable of catching the redirectSchema. If not specified, the default browser is used.
58
+ * @param context.redirectUri The internal URL to which to redirect has passed the in-app browser login phase. If you don't use authorizationContext remember to register this URL as customUrl or deepLink. See https://reactnative.dev/docs/linking
59
+ * @param context.idphint Unique identifier of the SPID IDP
60
+ * @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
61
+ * @throws {AuthorizationError} When the response from the authorization response is not parsable
62
+ * @returns The credential obtained
63
+ */
64
+
65
+ export const startCredentialIssuance = async (issuerConf, credentialType, ctx) => {
66
+ const {
67
+ wiaCryptoContext,
68
+ credentialCryptoContext,
69
+ walletInstanceAttestation,
70
+ authorizationContext,
71
+ redirectUri,
72
+ idphint,
73
+ appFetch = fetch
74
+ } = ctx;
75
+
76
+ /**
77
+ * Creates and sends a PAR request to the /as/par endpoint of the authroization server.
78
+ * This starts the authentication flow to obtain an access token.
79
+ * This token enables the Wallet Instance to request a digital credential from the Credential Endpoint of the Credential Issuer.
80
+ * This is an HTTP POST request containing the Wallet Instance identifier (client id), the code challenge and challenge method as specified by PKCE according to RFC 9126
81
+ * along with the WTE and its proof of possession (WTE-PoP).
82
+ * Additionally, it includes a request object, which is a signed JWT encapsulating the type of digital credential requested (authorization_details),
83
+ * the application session identifier on the Wallet Instance side (state),
84
+ * the method (query or form_post.jwt) by which the Authorization Server
85
+ * should transmit the Authorization Response containing the authorization code issued upon the end user's authentication (response_mode)
86
+ * to the Wallet Instance's Token Endpoint to obtain the Access Token, and the redirect_uri of the Wallet Instance where the Authorization Response
87
+ * should be delivered. The redirect is achived by using a custom URL scheme that the Wallet Instance is registered to handle.
88
+ */
89
+ const clientId = await wiaCryptoContext.getPublicKey().then(_ => _.kid);
90
+ const codeVerifier = generateRandomAlphaNumericString(64);
91
+ const parEndpoint = issuerConf.oauth_authorization_server.pushed_authorization_request_endpoint;
92
+ const parUrl = new URL(parEndpoint);
93
+ const aud = `${parUrl.protocol}//${parUrl.hostname}`;
94
+ const iss = WalletInstanceAttestation.decode(walletInstanceAttestation).payload.cnf.jwk.kid;
95
+ const credentialDefinition = selectCredentialDefinition(issuerConf, credentialType);
96
+ const responseMode = selectResponseMode(issuerConf, credentialType);
97
+ const getPar = makeParRequest({
98
+ wiaCryptoContext,
99
+ appFetch
100
+ });
101
+ const issuerRequestUri = await getPar(clientId, codeVerifier, redirectUri, responseMode, parEndpoint, walletInstanceAttestation, [credentialDefinition], ASSERTION_TYPE);
102
+
103
+ /**
104
+ * Starts the authorization flow which dependes on the response mode and the request credential.
105
+ * If the response mode is "query" the authorization flow is handled differently via the authorization context which opens an in-app browser capable of catching the redirectSchema.
106
+ * The form_post.jwt mode is not currently supported.
107
+ */
108
+ const authorizeFlowResult = await (async () => {
109
+ const authzRequestEndpoint = issuerConf.oauth_authorization_server.authorization_endpoint;
110
+ if (responseMode === "query") {
111
+ const params = new URLSearchParams({
112
+ client_id: clientId,
113
+ request_uri: issuerRequestUri,
114
+ idphint
115
+ });
116
+
117
+ /**
118
+ * Starts the authorization flow to obtain an authorization code by performing a GET request to the /authorize endpoint of the authorization server.
119
+ */
120
+ return await authorizeUserWithQueryMode(authzRequestEndpoint, params, redirectUri, authorizationContext);
121
+ } else {
122
+ throw new AuthorizationError("Response mode not supported for this type of credential");
123
+ }
124
+ })();
125
+
126
+ /**
127
+ * Creates and sends the DPoP Proof JWT to be presented with the authorization code to the /token endpoint of the authorization server
128
+ * for requesting the issuance of an access token bound to the public key of the Wallet Instance contained within the DPoP.
129
+ * This enables the Wallet Instance to request a digital credential.
130
+ * The DPoP Proof JWT is generated according to the section 4.3 of the DPoP RFC 9449 specification.
131
+ */
132
+
133
+ const {
134
+ code
135
+ } = authorizeFlowResult;
136
+ const tokenUrl = issuerConf.oauth_authorization_server.token_endpoint;
137
+ // Use an ephemeral key to be destroyed after use
138
+ const tokenRequestSignedDPop = await withEphemeralKey(async ephimeralContext => {
139
+ return await createDPopToken({
140
+ htm: "POST",
141
+ htu: tokenUrl,
142
+ jti: `${uuid.v4()}`
143
+ }, ephimeralContext);
144
+ });
145
+ const signedWiaPoP = await createPopToken({
146
+ jti: `${uuid.v4()}`,
147
+ aud,
148
+ iss
149
+ }, wiaCryptoContext);
150
+ const requestBody = {
151
+ grant_type: "authorization_code",
152
+ client_id: clientId,
153
+ code,
154
+ redirect_uri: redirectUri,
155
+ code_verifier: codeVerifier,
156
+ client_assertion_type: ASSERTION_TYPE,
157
+ client_assertion: walletInstanceAttestation + "~" + signedWiaPoP
158
+ };
159
+ const authorizationRequestFormBody = new URLSearchParams(requestBody);
160
+ const tokenRes = await appFetch(tokenUrl, {
161
+ method: "POST",
162
+ headers: {
163
+ "Content-Type": "application/x-www-form-urlencoded",
164
+ DPoP: tokenRequestSignedDPop
165
+ },
166
+ body: authorizationRequestFormBody.toString()
167
+ }).then(hasStatus(200)).then(res => res.json()).then(body => TokenResponse.safeParse(body));
168
+ if (!tokenRes.success) {
169
+ throw new ValidationFailed(tokenRes.error.message);
170
+ }
171
+
172
+ /**
173
+ * Validates the token response and extracts the access token, c_nonce and c_nonce_expires_in.
174
+ */
175
+ const accessTokenResponse = tokenRes.data;
176
+ const credentialUrl = issuerConf.openid_credential_issuer.credential_endpoint;
177
+
178
+ /**
179
+ * JWT proof token to bind the request nonce to the key that will bind the holder User with the Credential
180
+ * This is presented along with the access token to the Credential Endpoint as proof of possession of the private key used to sign the Access Token.
181
+ * @see https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-proof-types
182
+ */
183
+ const signedNonceProof = await createNonceProof(accessTokenResponse.c_nonce, clientId, credentialUrl, credentialCryptoContext);
184
+
185
+ // Validation of accessTokenResponse.authorization_details if contain credentialDefinition
186
+ const constainsCredentialDefinition = accessTokenResponse.authorization_details.some(c => c.credential_configuration_id === credentialDefinition.credential_configuration_id && c.format === credentialDefinition.format && c.type === credentialDefinition.type);
187
+ if (!constainsCredentialDefinition) {
188
+ throw new ValidationFailed("The access token response does not contain the requested credential");
189
+ }
190
+
191
+ /** The credential request body */
192
+ const credentialRequestFormBody = {
193
+ credential_definition: {
194
+ type: [credentialDefinition.credential_configuration_id]
195
+ },
196
+ format: credentialDefinition.format,
197
+ proof: {
198
+ jwt: signedNonceProof,
199
+ proof_type: "jwt"
200
+ }
201
+ };
202
+ const credentialRes = await appFetch(credentialUrl, {
203
+ method: "POST",
204
+ headers: {
205
+ "Content-Type": "application/json",
206
+ DPoP: tokenRequestSignedDPop,
207
+ Authorization: `${accessTokenResponse.token_type} ${accessTokenResponse.access_token}`
208
+ },
209
+ body: JSON.stringify(credentialRequestFormBody)
210
+ }).then(hasStatus(200)).then(res => res.json()).then(body => CredentialResponse.safeParse(body));
211
+ if (!credentialRes.success) {
212
+ throw new ValidationFailed(credentialRes.error.message);
213
+ }
214
+ return credentialRes.data;
215
+ };
216
+
217
+ /**
218
+ * Authorizes the user using the query mode and the authorization context.
219
+ * @param authzRequestEndpoint The authorization endpoint of the authorization server
220
+ * @param params The query parameters to be used in the request
221
+ * @param redirectUri The URL to which the redirect is made is usually a custom URL or deeplink
222
+ * @param authorizationContext The AuthorizationContext to manage the internal webview. If not specified, the default browser is used
223
+ * @returns The authrozation result containing the authorization code, state and issuer
224
+ */
225
+ export const authorizeUserWithQueryMode = async (authzRequestEndpoint, params, redirectUri, authorizationContext) => {
226
+ const authUrl = `${authzRequestEndpoint}?${params}`;
227
+ var authRedirectUrl;
228
+ if (authorizationContext) {
229
+ const redirectSchema = new URL(redirectUri).protocol.replace(":", "");
230
+ authRedirectUrl = await authorizationContext.authorize(authUrl, redirectSchema).catch(e => {
231
+ throw new AuthorizationError(e.message);
232
+ });
233
+ } else {
234
+ // handler for redirectUri
235
+ Linking.addEventListener("url", _ref => {
236
+ let {
237
+ url
238
+ } = _ref;
239
+ if (url.includes(redirectUri)) {
240
+ authRedirectUrl = url;
241
+ }
242
+ });
243
+ const openAuthUrlInBrowser = Linking.openURL(authUrl);
244
+
245
+ /*
246
+ * Waits for 120 seconds for the identificationRedirectUrl variable to be set
247
+ * by the custom url handler. If the timeout is exceeded, throw an exception
248
+ */
249
+ const unitAuthRedirectIsNotUndefined = until(() => authRedirectUrl !== undefined, 120);
250
+ await Promise.all([openAuthUrlInBrowser, unitAuthRedirectIsNotUndefined]);
251
+ if (authRedirectUrl === undefined) {
252
+ throw new AuthorizationError("Invalid authentication redirect url");
253
+ }
254
+ }
255
+ const urlParse = parseUrl(authRedirectUrl);
256
+ const authRes = AuthorizationResultShape.safeParse(urlParse.query);
257
+ if (!authRes.success) {
258
+ const authErr = AuthorizationErrorShape.safeParse(urlParse.query);
259
+ if (!authErr.success) {
260
+ throw new AuthorizationError(authRes.error.message); // an error occured while parsing the result and the error
261
+ }
262
+
263
+ throw new AuthorizationIdpError(authErr.data.error, authErr.data.error_description);
264
+ }
265
+ return authRes.data;
266
+ };
267
+ export const createNonceProof = async (nonce, issuer, audience, ctx) => {
268
+ const jwk = await ctx.getPublicKey();
269
+ return new SignJWT(ctx).setPayload({
270
+ nonce
271
+ }).setProtectedHeader({
272
+ typ: "openid4vci-proof+jwt",
273
+ jwk
274
+ }).setAudience(audience).setIssuer(issuer).setIssuedAt().setExpirationTime("5min").sign();
275
+ };
276
+ //# sourceMappingURL=03-start-credential-issuance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["uuid","makeParRequest","SignJWT","generateRandomAlphaNumericString","hasStatus","until","ASSERTION_TYPE","parseUrl","AuthorizationError","AuthorizationIdpError","ValidationFailed","AuthorizationErrorShape","AuthorizationResultShape","withEphemeralKey","createDPopToken","createPopToken","CredentialResponse","TokenResponse","WalletInstanceAttestation","Linking","selectCredentialDefinition","issuerConf","credentialType","credential_configurations_supported","openid_credential_issuer","result","Object","keys","filter","e","includes","map","credential_configuration_id","format","type","Error","selectResponseMode","responseModeSupported","oauth_authorization_server","response_modes_supported","responseMode","startCredentialIssuance","ctx","wiaCryptoContext","credentialCryptoContext","walletInstanceAttestation","authorizationContext","redirectUri","idphint","appFetch","fetch","clientId","getPublicKey","then","_","kid","codeVerifier","parEndpoint","pushed_authorization_request_endpoint","parUrl","URL","aud","protocol","hostname","iss","decode","payload","cnf","jwk","credentialDefinition","getPar","issuerRequestUri","authorizeFlowResult","authzRequestEndpoint","authorization_endpoint","params","URLSearchParams","client_id","request_uri","authorizeUserWithQueryMode","code","tokenUrl","token_endpoint","tokenRequestSignedDPop","ephimeralContext","htm","htu","jti","v4","signedWiaPoP","requestBody","grant_type","redirect_uri","code_verifier","client_assertion_type","client_assertion","authorizationRequestFormBody","tokenRes","method","headers","DPoP","body","toString","res","json","safeParse","success","error","message","accessTokenResponse","data","credentialUrl","credential_endpoint","signedNonceProof","createNonceProof","c_nonce","constainsCredentialDefinition","authorization_details","some","c","credentialRequestFormBody","credential_definition","proof","jwt","proof_type","credentialRes","Authorization","token_type","access_token","JSON","stringify","authUrl","authRedirectUrl","redirectSchema","replace","authorize","catch","addEventListener","_ref","url","openAuthUrlInBrowser","openURL","unitAuthRedirectIsNotUndefined","undefined","Promise","all","urlParse","authRes","query","authErr","error_description","nonce","issuer","audience","setPayload","setProtectedHeader","typ","setAudience","setIssuer","setIssuedAt","setExpirationTime","sign"],"sourceRoot":"../../../../src","sources":["credential/issuance/03-start-credential-issuance.ts"],"mappings":"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"}
@@ -1,18 +1,22 @@
1
- import * as z from "zod";
2
- import uuid from "react-native-uuid";
1
+ import { generateRandomAlphaNumericString } from "../../utils/misc";
3
2
  import { makeParRequest } from "../../utils/par";
4
- import { getJwtFromFormPost } from "../../utils/decoder";
5
- import { hasStatus } from "../../utils/misc";
6
3
  import { ASSERTION_TYPE } from "./const";
4
+ /**
5
+ * Ensures that the credential type requested is supported by the issuer and contained in the
6
+ * issuer configuration.
7
+ * @param issuerConf The issuer configuration returned by {@link evaluateIssuerTrust}
8
+ * @param credentialType The type of the credential to be requested returned by {@link startFlow}
9
+ * @param context.wiaCryptoContext The Wallet Instance's crypto context
10
+ * @param context.walletInstanceAttestation The Wallet Instance's attestation
11
+ * @param context.redirectUri The redirect URI which is the custom URL scheme that the Wallet Instance is registered to handle
12
+ * @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
13
+ * @returns The credential definition to be used in the request which includes the format and the type and its type
14
+ */
7
15
  const selectCredentialDefinition = (issuerConf, credentialType) => {
8
- const {
9
- credentials_supported
10
- } = issuerConf.openid_credential_issuer;
11
- const [result] = credentials_supported.filter(e => e.credential_definition.type.includes(credentialType)).map(e => ({
12
- credential_definition: {
13
- type: credentialType
14
- },
15
- format: e.format,
16
+ const credential_configurations_supported = issuerConf.openid_credential_issuer.credential_configurations_supported;
17
+ const [result] = Object.keys(credential_configurations_supported).filter(e => e.includes(credentialType)).map(e => ({
18
+ credential_configuration_id: credentialType,
19
+ format: credential_configurations_supported[e].format,
16
20
  type: "openid_credential"
17
21
  }));
18
22
  if (!result) {
@@ -20,90 +24,62 @@ const selectCredentialDefinition = (issuerConf, credentialType) => {
20
24
  }
21
25
  return result;
22
26
  };
23
- const decodeAuthorizationResponse = async raw => {
24
- const {
25
- decodedJwt: {
26
- payload
27
- }
28
- } = await getJwtFromFormPost(raw);
29
27
 
30
- /**
31
- * FIXME: [SIW-628] This step must not make any difference on the credential
32
- * we are authorizing for, being a PID or any other (Q)EAA.
33
- *
34
- * Currently, PID issuer is implemented to skip the CompleteUserAuthorization step
35
- * thus returning a stubbed (code, state) pair.
36
- *
37
- * This is a workaround to proceeed the flow anyway.
38
- * If the response does not map what expected (CorrectShape),
39
- * we try parse into (code, state) to check if we are in the PID scenario.
40
- * In that case, a stub value is returned (will not be evaluated anyway).
41
- *
42
- * This workaround will be obsolete once the PID issuer fixes its implementation
43
- */
44
- const CorrectShape = z.object({
45
- request_uri: z.string()
46
- });
47
- const WrongShapeForPID = z.object({
48
- code: z.string(),
49
- state: z.string()
50
- });
51
- const [correct, wrong] = [CorrectShape.safeParse(payload), WrongShapeForPID.safeParse(payload)];
52
- if (correct.success) {
53
- return correct.data;
54
- } else if (wrong.success) {
55
- return {
56
- request_uri: "https://fake-request-uri"
57
- };
28
+ /**
29
+ * Ensures that the response mode requested is supported by the issuer and contained in the issuer configuration.
30
+ * @param issuerConf The issuer configuration
31
+ * @param credentialType The type of the credential to be requested
32
+ * @returns The response mode to be used in the request, "query" for PersonIdentificationData and "form_post.jwt" for all other types.
33
+ */
34
+ const selectResponseMode = (issuerConf, credentialType) => {
35
+ const responseModeSupported = issuerConf.oauth_authorization_server.response_modes_supported;
36
+ const responseMode = credentialType === "PersonIdentificationData" ? "query" : "form_post.jwt";
37
+ if (!responseModeSupported.includes(responseMode)) {
38
+ throw new Error(`No response mode support the type '${credentialType}'`);
58
39
  }
59
- throw correct.error;
40
+ return responseMode;
60
41
  };
42
+
61
43
  /**
62
- * Start the User authorization phase.
63
- * Perform the Pushed Authorization Request as defined in OAuth 2.0 protocol.
64
- *
65
- * @param issuerConf The Issuer configuration
66
- * @param credentialType The type of the credential to be requested
67
- * @param context.wiaCryptoContext The context to access the key associated with the Wallet Instance Attestation
68
- * @param context.walletInstanceAttestation The Wallet Instance Attestation token
69
- * @param context.walletProviderBaseUrl The base url of the Wallet Provider
70
- * @param context.additionalParams Hash set of parameters to be passed to the authorization endpoint
71
- * (used as a temporary fix until we have a proper User identity in the PID token provider)
72
- * TODO: [SIW-630]
73
- * @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
74
- * @returns The request uri to continue the authorization to
44
+ * WARNING: This function must be called after {@link evaluateIssuerTrust} and {@link startFlow}. The next steam is {@link compeUserAuthorizationWithQueryMode} or {@link compeUserAuthorizationWithFormPostJwtMode}
45
+ * Creates and sends a PAR request to the /as/par endpoint of the authroization server.
46
+ * This starts the authentication flow to obtain an access token.
47
+ * This token enables the Wallet Instance to request a digital credential from the Credential Endpoint of the Credential Issuer.
48
+ * This is an HTTP POST request containing the Wallet Instance identifier (client id), the code challenge and challenge method as specified by PKCE according to RFC 9126
49
+ * along with the WTE and its proof of possession (WTE-PoP).
50
+ * Additionally, it includes a request object, which is a signed JWT encapsulating the type of digital credential requested (authorization_details),
51
+ * the application session identifier on the Wallet Instance side (state),
52
+ * the method (query or form_post.jwt) by which the Authorization Server
53
+ * should transmit the Authorization Response containing the authorization code issued upon the end user's authentication (response_mode)
54
+ * to the Wallet Instance's Token Endpoint to obtain the Access Token, and the redirect_uri of the Wallet Instance where the Authorization Response
55
+ * should be delivered. The redirect is achived by using a custom URL scheme that the Wallet Instance is registered to handle.
56
+ * @param issuerConf The issuer configuration
57
+ * @param credentialType The type of the credential to be requested returned by {@link selectCredentialDefinition}
58
+ * @param ctx The context object containing the Wallet Instance's cryptographic context, the Wallet Instance's attestation, the redirect URI and the fetch implementation
59
+ * @returns The URI to which the end user should be redirected to start the authentication flow, along with the client id, the code verifier and the credential definition
75
60
  */
76
61
  export const startUserAuthorization = async (issuerConf, credentialType, ctx) => {
77
62
  const {
78
63
  wiaCryptoContext,
79
64
  walletInstanceAttestation,
80
- walletProviderBaseUrl,
81
- additionalParams = {},
65
+ redirectUri,
82
66
  appFetch = fetch
83
67
  } = ctx;
84
68
  const clientId = await wiaCryptoContext.getPublicKey().then(_ => _.kid);
85
- const codeVerifier = `${uuid.v4()}`;
86
- // Make a PAR request to the credential issuer and return the response url
87
- const parUrl = issuerConf.openid_credential_issuer.pushed_authorization_request_endpoint;
69
+ const codeVerifier = generateRandomAlphaNumericString(64);
70
+ const parEndpoint = issuerConf.oauth_authorization_server.pushed_authorization_request_endpoint;
71
+ const credentialDefinition = selectCredentialDefinition(issuerConf, credentialType);
72
+ const responseMode = selectResponseMode(issuerConf, credentialType);
88
73
  const getPar = makeParRequest({
89
74
  wiaCryptoContext,
90
75
  appFetch
91
76
  });
92
- const issuerRequestUri = await getPar(clientId, codeVerifier, walletProviderBaseUrl, parUrl, walletInstanceAttestation, [selectCredentialDefinition(issuerConf, credentialType)], ASSERTION_TYPE);
93
-
94
- // Initialize authorization by requesting the authz request uri
95
- const authzRequestEndpoint = issuerConf.openid_credential_issuer.authorization_endpoint;
96
- const params = new URLSearchParams({
97
- client_id: clientId,
98
- request_uri: issuerRequestUri,
99
- ...additionalParams
100
- });
101
- const {
102
- request_uri
103
- } = await appFetch(`${authzRequestEndpoint}?${params}`).then(hasStatus(200)).then(res => res.text()).then(decodeAuthorizationResponse);
77
+ const issuerRequestUri = await getPar(clientId, codeVerifier, redirectUri, responseMode, parEndpoint, walletInstanceAttestation, [credentialDefinition], ASSERTION_TYPE);
104
78
  return {
105
- requestUri: request_uri,
106
- clientId
79
+ issuerRequestUri,
80
+ clientId,
81
+ codeVerifier,
82
+ credentialDefinition
107
83
  };
108
84
  };
109
85
  //# sourceMappingURL=03-start-user-authorization.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["z","uuid","makeParRequest","getJwtFromFormPost","hasStatus","ASSERTION_TYPE","selectCredentialDefinition","issuerConf","credentialType","credentials_supported","openid_credential_issuer","result","filter","e","credential_definition","type","includes","map","format","Error","decodeAuthorizationResponse","raw","decodedJwt","payload","CorrectShape","object","request_uri","string","WrongShapeForPID","code","state","correct","wrong","safeParse","success","data","error","startUserAuthorization","ctx","wiaCryptoContext","walletInstanceAttestation","walletProviderBaseUrl","additionalParams","appFetch","fetch","clientId","getPublicKey","then","_","kid","codeVerifier","v4","parUrl","pushed_authorization_request_endpoint","getPar","issuerRequestUri","authzRequestEndpoint","authorization_endpoint","params","URLSearchParams","client_id","res","text","requestUri"],"sourceRoot":"../../../../src","sources":["credential/issuance/03-start-user-authorization.ts"],"mappings":"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"}
1
+ {"version":3,"names":["generateRandomAlphaNumericString","makeParRequest","ASSERTION_TYPE","selectCredentialDefinition","issuerConf","credentialType","credential_configurations_supported","openid_credential_issuer","result","Object","keys","filter","e","includes","map","credential_configuration_id","format","type","Error","selectResponseMode","responseModeSupported","oauth_authorization_server","response_modes_supported","responseMode","startUserAuthorization","ctx","wiaCryptoContext","walletInstanceAttestation","redirectUri","appFetch","fetch","clientId","getPublicKey","then","_","kid","codeVerifier","parEndpoint","pushed_authorization_request_endpoint","credentialDefinition","getPar","issuerRequestUri"],"sourceRoot":"../../../../src","sources":["credential/issuance/03-start-user-authorization.ts"],"mappings":"AAEA,SAASA,gCAAgC,QAAkB,kBAAkB;AAG7E,SAA8BC,cAAc,QAAQ,iBAAiB;AACrE,SAASC,cAAc,QAAQ,SAAS;AAkBxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,0BAA0B,GAAGA,CACjCC,UAAkD,EAClDC,cAAgD,KACxB;EACxB,MAAMC,mCAAmC,GACvCF,UAAU,CAACG,wBAAwB,CAACD,mCAAmC;EAEzE,MAAM,CAACE,MAAM,CAAC,GAAGC,MAAM,CAACC,IAAI,CAACJ,mCAAmC,CAAC,CAC9DK,MAAM,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAACR,cAAc,CAAC,CAAC,CACzCS,GAAG,CAAEF,CAAC,KAAM;IACXG,2BAA2B,EAAEV,cAAc;IAC3CW,MAAM,EAAEV,mCAAmC,CAACM,CAAC,CAAC,CAAEI,MAAM;IACtDC,IAAI,EAAE;EACR,CAAC,CAAC,CAAC;EAEL,IAAI,CAACT,MAAM,EAAE;IACX,MAAM,IAAIU,KAAK,CAAE,mCAAkCb,cAAe,GAAE,CAAC;EACvE;EACA,OAAOG,MAAM;AACf,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMW,kBAAkB,GAAGA,CACzBf,UAAkD,EAClDC,cAAgD,KAC/B;EACjB,MAAMe,qBAAqB,GACzBhB,UAAU,CAACiB,0BAA0B,CAACC,wBAAwB;EAEhE,MAAMC,YAAY,GAChBlB,cAAc,KAAK,0BAA0B,GAAG,OAAO,GAAG,eAAe;EAE3E,IAAI,CAACe,qBAAqB,CAACP,QAAQ,CAACU,YAAY,CAAC,EAAE;IACjD,MAAM,IAAIL,KAAK,CAAE,sCAAqCb,cAAe,GAAE,CAAC;EAC1E;EAEA,OAAOkB,YAAY;AACrB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,sBAA8C,GAAG,MAAAA,CAC5DpB,UAAU,EACVC,cAAc,EACdoB,GAAG,KACA;EACH,MAAM;IACJC,gBAAgB;IAChBC,yBAAyB;IACzBC,WAAW;IACXC,QAAQ,GAAGC;EACb,CAAC,GAAGL,GAAG;EAEP,MAAMM,QAAQ,GAAG,MAAML,gBAAgB,CAACM,YAAY,CAAC,CAAC,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,GAAG,CAAC;EACzE,MAAMC,YAAY,GAAGpC,gCAAgC,CAAC,EAAE,CAAC;EACzD,MAAMqC,WAAW,GACfjC,UAAU,CAACiB,0BAA0B,CAACiB,qCAAqC;EAC7E,MAAMC,oBAAoB,GAAGpC,0BAA0B,CACrDC,UAAU,EACVC,cACF,CAAC;EACD,MAAMkB,YAAY,GAAGJ,kBAAkB,CAACf,UAAU,EAAEC,cAAc,CAAC;EAEnE,MAAMmC,MAAM,GAAGvC,cAAc,CAAC;IAAEyB,gBAAgB;IAAEG;EAAS,CAAC,CAAC;EAC7D,MAAMY,gBAAgB,GAAG,MAAMD,MAAM,CACnCT,QAAQ,EACRK,YAAY,EACZR,WAAW,EACXL,YAAY,EACZc,WAAW,EACXV,yBAAyB,EACzB,CAACY,oBAAoB,CAAC,EACtBrC,cACF,CAAC;EAED,OAAO;IAAEuC,gBAAgB;IAAEV,QAAQ;IAAEK,YAAY;IAAEG;EAAqB,CAAC;AAC3E,CAAC"}
@@ -1,2 +1,86 @@
1
- export {};
1
+ import { AuthorizationErrorShape, AuthorizationResultShape } from "../../utils/auth";
2
+ import { until } from "../../utils/misc";
3
+ import parseUrl from "parse-url";
4
+ import { AuthorizationError, AuthorizationIdpError } from "../../utils/errors";
5
+ import { Linking } from "react-native";
6
+
7
+ /**
8
+ * The interface of the phase to complete User authorization via strong identification when the response mode is "query" and the request credential is a PersonIdentificationData.
9
+ */
10
+
11
+ /**
12
+ * WARNING: This function must be called after {@link startUserAuthorization}. The next function to be called is {@link authorizeAccess}.
13
+ * The interface of the phase to complete User authorization via strong identification when the response mode is "query" and the request credential is a PersonIdentificationData.
14
+ * It is used to complete the user authorization by catching the redirectSchema from the authorization server which then contains the authorization response.
15
+ * This function utilizes the authorization context to open an in-app browser capable of catching the redirectSchema to perform a get request to the authorization endpoint.
16
+ * If the 302 redirect happens and the redirectSchema is caught, the function will return the authorization response after parsing it from the query string.
17
+ * @param issuerRequestUri the URI of the issuer where the request is sent
18
+ * @param clientId Identifies the current client across all the requests of the issuing flow returned by {@link startUserAuthorization}
19
+ * @param issuerConf The issuer configuration returned by {@link evaluateIssuerTrust}
20
+ * @param authorizationContext The context to identify the user which will be used to start the authorization. It's needed only when requesting a PersonalIdentificationData credential. The implementantion should open an in-app browser capable of catching the redirectSchema.
21
+ * If not specified, the default browser is used
22
+ * @param idphint Unique identifier of the SPID IDP selected by the user
23
+ * @param redirectUri The url to reach to complete the user authorization which is the custom URL scheme that the Wallet Instance is registered to handle, usually a custom URL or deeplink
24
+ * @throws {AuthorizationError} if an error occurs during the authorization process
25
+ * @throws {AuthorizationIdpError} if an error occurs during the authorization process and the error is related to the IDP
26
+ * @returns the authorization response which contains code, state and iss
27
+ */
28
+ export const completeUserAuthorizationWithQueryMode = async (issuerRequestUri, clientId, issuerConf, idpHint, redirectUri, authorizationContext) => {
29
+ /**
30
+ * Starts the authorization flow which dependes on the response mode and the request credential.
31
+ * If the response mode is "query" the authorization flow is handled differently via the authorization context which opens an in-app browser capable of catching the redirectSchema.
32
+ * The form_post.jwt mode is not currently supported.
33
+ */
34
+ const authzRequestEndpoint = issuerConf.oauth_authorization_server.authorization_endpoint;
35
+ const params = new URLSearchParams({
36
+ client_id: clientId,
37
+ request_uri: issuerRequestUri,
38
+ idphint: idpHint
39
+ });
40
+ const authUrl = `${authzRequestEndpoint}?${params}`;
41
+ var authRedirectUrl;
42
+ if (authorizationContext) {
43
+ const redirectSchema = new URL(redirectUri).protocol.replace(":", "");
44
+ authRedirectUrl = await authorizationContext.authorize(authUrl, redirectSchema).catch(e => {
45
+ throw new AuthorizationError(e.message);
46
+ });
47
+ } else {
48
+ // handler for redirectUri
49
+ Linking.addEventListener("url", _ref => {
50
+ let {
51
+ url
52
+ } = _ref;
53
+ if (url.includes(redirectUri)) {
54
+ authRedirectUrl = url;
55
+ }
56
+ });
57
+ const openAuthUrlInBrowser = Linking.openURL(authUrl);
58
+
59
+ /*
60
+ * Waits for 120 seconds for the identificationRedirectUrl variable to be set
61
+ * by the custom url handler. If the timeout is exceeded, throw an exception
62
+ */
63
+ const unitAuthRedirectIsNotUndefined = until(() => authRedirectUrl !== undefined, 120);
64
+ await Promise.all([openAuthUrlInBrowser, unitAuthRedirectIsNotUndefined]);
65
+ if (authRedirectUrl === undefined) {
66
+ throw new AuthorizationError("Invalid authentication redirect url");
67
+ }
68
+ }
69
+ const urlParse = parseUrl(authRedirectUrl);
70
+ const authRes = AuthorizationResultShape.safeParse(urlParse.query);
71
+ if (!authRes.success) {
72
+ const authErr = AuthorizationErrorShape.safeParse(urlParse.query);
73
+ if (!authErr.success) {
74
+ throw new AuthorizationError(authRes.error.message); // an error occured while parsing the result and the error
75
+ }
76
+
77
+ throw new AuthorizationIdpError(authErr.data.error, authErr.data.error_description);
78
+ }
79
+ return authRes.data;
80
+ };
81
+
82
+ // TODO: SIW-1120 implement generic credential issuance flow
83
+ export const completeUserAuthorizationWithFormPostJwtMode = () => {
84
+ throw new Error("Not implemented");
85
+ };
2
86
  //# sourceMappingURL=04-complete-user-authorization.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["credential/issuance/04-complete-user-authorization.ts"],"mappings":""}
1
+ {"version":3,"names":["AuthorizationErrorShape","AuthorizationResultShape","until","parseUrl","AuthorizationError","AuthorizationIdpError","Linking","completeUserAuthorizationWithQueryMode","issuerRequestUri","clientId","issuerConf","idpHint","redirectUri","authorizationContext","authzRequestEndpoint","oauth_authorization_server","authorization_endpoint","params","URLSearchParams","client_id","request_uri","idphint","authUrl","authRedirectUrl","redirectSchema","URL","protocol","replace","authorize","catch","e","message","addEventListener","_ref","url","includes","openAuthUrlInBrowser","openURL","unitAuthRedirectIsNotUndefined","undefined","Promise","all","urlParse","authRes","safeParse","query","success","authErr","error","data","error_description","completeUserAuthorizationWithFormPostJwtMode","Error"],"sourceRoot":"../../../../src","sources":["credential/issuance/04-complete-user-authorization.ts"],"mappings":"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"}