@okta/okta-auth-js 5.11.0 → 6.0.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.
Files changed (228) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +5 -2
  3. package/cjs/AuthStateManager.js +2 -1
  4. package/cjs/AuthStateManager.js.map +1 -1
  5. package/cjs/OktaAuth.js +75 -71
  6. package/cjs/OktaAuth.js.map +1 -1
  7. package/cjs/OktaUserAgent.js +2 -2
  8. package/cjs/OktaUserAgent.js.map +1 -1
  9. package/cjs/PromiseQueue.js +6 -1
  10. package/cjs/PromiseQueue.js.map +1 -1
  11. package/cjs/StorageManager.js +3 -1
  12. package/cjs/StorageManager.js.map +1 -1
  13. package/cjs/TokenManager.js +9 -3
  14. package/cjs/TokenManager.js.map +1 -1
  15. package/cjs/TransactionManager.js +17 -4
  16. package/cjs/TransactionManager.js.map +1 -1
  17. package/cjs/browser/browserStorage.js +7 -5
  18. package/cjs/browser/browserStorage.js.map +1 -1
  19. package/cjs/browser/fingerprint.js +3 -1
  20. package/cjs/browser/fingerprint.js.map +1 -1
  21. package/cjs/builderUtil.js +3 -17
  22. package/cjs/builderUtil.js.map +1 -1
  23. package/cjs/crypto/oidcHash.js.map +1 -1
  24. package/cjs/features.js +9 -3
  25. package/cjs/features.js.map +1 -1
  26. package/cjs/fetch/fetchRequest.js +2 -1
  27. package/cjs/fetch/fetchRequest.js.map +1 -1
  28. package/cjs/http/request.js +2 -0
  29. package/cjs/http/request.js.map +1 -1
  30. package/cjs/idx/authenticate.js +8 -5
  31. package/cjs/idx/authenticate.js.map +1 -1
  32. package/cjs/idx/authenticator/SecurityQuestionVerification.js +1 -0
  33. package/cjs/idx/authenticator/SecurityQuestionVerification.js.map +1 -1
  34. package/cjs/idx/authenticator/VerificationCodeAuthenticator.js +2 -2
  35. package/cjs/idx/authenticator/VerificationCodeAuthenticator.js.map +1 -1
  36. package/cjs/idx/authenticator/getAuthenticator.js +5 -6
  37. package/cjs/idx/authenticator/getAuthenticator.js.map +1 -1
  38. package/cjs/idx/cancel.js.map +1 -1
  39. package/cjs/idx/emailVerify.js +73 -0
  40. package/cjs/idx/emailVerify.js.map +1 -0
  41. package/cjs/idx/flow/FlowSpecification.js +16 -4
  42. package/cjs/idx/flow/FlowSpecification.js.map +1 -1
  43. package/cjs/idx/flow/RegistrationFlow.js +2 -0
  44. package/cjs/idx/flow/RegistrationFlow.js.map +1 -1
  45. package/cjs/idx/handleInteractionCodeRedirect.js +1 -0
  46. package/cjs/idx/handleInteractionCodeRedirect.js.map +1 -1
  47. package/cjs/idx/index.js +13 -0
  48. package/cjs/idx/index.js.map +1 -1
  49. package/cjs/idx/interact.js +46 -34
  50. package/cjs/idx/interact.js.map +1 -1
  51. package/cjs/idx/introspect.js +12 -14
  52. package/cjs/idx/introspect.js.map +1 -1
  53. package/cjs/idx/proceed.js +4 -7
  54. package/cjs/idx/proceed.js.map +1 -1
  55. package/cjs/idx/recoverPassword.js +1 -1
  56. package/cjs/idx/recoverPassword.js.map +1 -1
  57. package/cjs/idx/register.js +6 -15
  58. package/cjs/idx/register.js.map +1 -1
  59. package/cjs/idx/remediate.js +21 -5
  60. package/cjs/idx/remediate.js.map +1 -1
  61. package/cjs/idx/remediators/AuthenticatorEnrollmentData.js +2 -0
  62. package/cjs/idx/remediators/AuthenticatorEnrollmentData.js.map +1 -1
  63. package/cjs/idx/remediators/AuthenticatorVerificationData.js +5 -3
  64. package/cjs/idx/remediators/AuthenticatorVerificationData.js.map +1 -1
  65. package/cjs/idx/remediators/Base/AuthenticatorData.js +5 -3
  66. package/cjs/idx/remediators/Base/AuthenticatorData.js.map +1 -1
  67. package/cjs/idx/remediators/Base/Remediator.js +2 -0
  68. package/cjs/idx/remediators/Base/Remediator.js.map +1 -1
  69. package/cjs/idx/remediators/Base/SelectAuthenticator.js +4 -3
  70. package/cjs/idx/remediators/Base/SelectAuthenticator.js.map +1 -1
  71. package/cjs/idx/remediators/Base/VerifyAuthenticator.js.map +1 -1
  72. package/cjs/idx/remediators/ChallengeAuthenticator.js.map +1 -1
  73. package/cjs/idx/remediators/EnrollAuthenticator.js.map +1 -1
  74. package/cjs/idx/remediators/EnrollPoll.js +2 -3
  75. package/cjs/idx/remediators/EnrollPoll.js.map +1 -1
  76. package/cjs/idx/remediators/EnrollProfile.js +4 -1
  77. package/cjs/idx/remediators/EnrollProfile.js.map +1 -1
  78. package/cjs/idx/remediators/EnrollmentChannelData.js +80 -0
  79. package/cjs/idx/remediators/EnrollmentChannelData.js.map +1 -0
  80. package/cjs/idx/remediators/Identify.js.map +1 -1
  81. package/cjs/idx/remediators/ReEnrollAuthenticator.js +1 -0
  82. package/cjs/idx/remediators/ReEnrollAuthenticator.js.map +1 -1
  83. package/cjs/idx/remediators/ResetAuthenticator.js.map +1 -1
  84. package/cjs/idx/remediators/SelectAuthenticatorAuthenticate.js +2 -2
  85. package/cjs/idx/remediators/SelectAuthenticatorAuthenticate.js.map +1 -1
  86. package/cjs/idx/remediators/SelectAuthenticatorEnroll.js.map +1 -1
  87. package/cjs/idx/remediators/SelectEnrollProfile.js.map +1 -1
  88. package/cjs/idx/remediators/SelectEnrollmentChannel.js +74 -0
  89. package/cjs/idx/remediators/SelectEnrollmentChannel.js.map +1 -0
  90. package/cjs/idx/remediators/Skip.js.map +1 -1
  91. package/cjs/idx/remediators/index.js +26 -0
  92. package/cjs/idx/remediators/index.js.map +1 -1
  93. package/cjs/idx/remediators/util.js +7 -2
  94. package/cjs/idx/remediators/util.js.map +1 -1
  95. package/cjs/idx/run.js +111 -45
  96. package/cjs/idx/run.js.map +1 -1
  97. package/cjs/idx/startTransaction.js +4 -2
  98. package/cjs/idx/startTransaction.js.map +1 -1
  99. package/cjs/idx/transactionMeta.js +82 -69
  100. package/cjs/idx/transactionMeta.js.map +1 -1
  101. package/cjs/idx/types/idx-js.js.map +1 -1
  102. package/cjs/idx/types/index.js +19 -3
  103. package/cjs/idx/types/index.js.map +1 -1
  104. package/cjs/index.js +14 -0
  105. package/cjs/index.js.map +1 -1
  106. package/cjs/oidc/endpoints/authorize.js +2 -0
  107. package/cjs/oidc/endpoints/authorize.js.map +1 -1
  108. package/cjs/oidc/endpoints/token.js +1 -0
  109. package/cjs/oidc/endpoints/token.js.map +1 -1
  110. package/cjs/oidc/exchangeCodeForTokens.js +3 -3
  111. package/cjs/oidc/exchangeCodeForTokens.js.map +1 -1
  112. package/cjs/oidc/getToken.js +3 -1
  113. package/cjs/oidc/getToken.js.map +1 -1
  114. package/cjs/oidc/getWithRedirect.js +10 -37
  115. package/cjs/oidc/getWithRedirect.js.map +1 -1
  116. package/cjs/oidc/handleOAuthResponse.js +80 -86
  117. package/cjs/oidc/handleOAuthResponse.js.map +1 -1
  118. package/cjs/oidc/parseFromUrl.js.map +1 -1
  119. package/cjs/oidc/renewToken.js.map +1 -1
  120. package/cjs/oidc/renewTokens.js +1 -1
  121. package/cjs/oidc/renewTokens.js.map +1 -1
  122. package/cjs/oidc/revokeToken.js +28 -29
  123. package/cjs/oidc/revokeToken.js.map +1 -1
  124. package/cjs/oidc/util/index.js +14 -0
  125. package/cjs/oidc/util/index.js.map +1 -1
  126. package/cjs/oidc/util/loginRedirect.js +6 -1
  127. package/cjs/oidc/util/loginRedirect.js.map +1 -1
  128. package/cjs/oidc/util/oauth.js.map +1 -1
  129. package/cjs/oidc/util/oauthMeta.js +36 -0
  130. package/cjs/oidc/util/oauthMeta.js.map +1 -0
  131. package/cjs/oidc/util/pkce.js.map +1 -1
  132. package/cjs/oidc/util/prepareTokenParams.js +57 -36
  133. package/cjs/oidc/util/prepareTokenParams.js.map +1 -1
  134. package/cjs/oidc/util/validateClaims.js +2 -0
  135. package/cjs/oidc/util/validateClaims.js.map +1 -1
  136. package/cjs/oidc/verifyToken.js +2 -1
  137. package/cjs/oidc/verifyToken.js.map +1 -1
  138. package/cjs/options.js +6 -2
  139. package/cjs/options.js.map +1 -1
  140. package/cjs/server/serverStorage.js +1 -1
  141. package/cjs/server/serverStorage.js.map +1 -1
  142. package/cjs/services/TokenService.js +3 -0
  143. package/cjs/services/TokenService.js.map +1 -1
  144. package/cjs/tx/AuthTransaction.js +3 -0
  145. package/cjs/tx/AuthTransaction.js.map +1 -1
  146. package/cjs/tx/TransactionState.js +0 -17
  147. package/cjs/tx/TransactionState.js.map +1 -1
  148. package/cjs/tx/api.js +3 -2
  149. package/cjs/tx/api.js.map +1 -1
  150. package/cjs/types/Transaction.js.map +1 -1
  151. package/cjs/util/index.js +0 -13
  152. package/cjs/util/index.js.map +1 -1
  153. package/cjs/util/url.js.map +1 -1
  154. package/dist/okta-auth-js.min.js +1 -1
  155. package/dist/okta-auth-js.min.js.map +1 -1
  156. package/dist/okta-auth-js.umd.js +1 -1
  157. package/dist/okta-auth-js.umd.js.map +1 -1
  158. package/esm/index.js +1334 -758
  159. package/esm/index.js.map +1 -1
  160. package/lib/AuthStateManager.d.ts +1 -2
  161. package/lib/OktaAuth.d.ts +4 -10
  162. package/lib/StorageManager.d.ts +1 -1
  163. package/lib/TokenManager.d.ts +2 -2
  164. package/lib/TransactionManager.d.ts +3 -2
  165. package/lib/browser/fingerprint.d.ts +1 -1
  166. package/lib/builderUtil.d.ts +1 -2
  167. package/lib/crypto/browser.d.ts +1 -1
  168. package/lib/features.d.ts +1 -1
  169. package/lib/idx/authenticate.d.ts +1 -1
  170. package/lib/idx/authenticator/VerificationCodeAuthenticator.d.ts +1 -1
  171. package/lib/idx/cancel.d.ts +1 -1
  172. package/lib/{util → idx}/emailVerify.d.ts +10 -1
  173. package/lib/idx/flow/FlowSpecification.d.ts +1 -0
  174. package/lib/idx/index.d.ts +1 -0
  175. package/lib/idx/interact.d.ts +4 -11
  176. package/lib/idx/introspect.d.ts +3 -2
  177. package/lib/idx/proceed.d.ts +4 -2
  178. package/lib/idx/recoverPassword.d.ts +1 -1
  179. package/lib/idx/remediate.d.ts +10 -4
  180. package/lib/idx/remediators/AuthenticatorEnrollmentData.d.ts +3 -3
  181. package/lib/idx/remediators/AuthenticatorVerificationData.d.ts +3 -3
  182. package/lib/idx/remediators/Base/AuthenticatorData.d.ts +7 -7
  183. package/lib/idx/remediators/Base/Remediator.d.ts +1 -1
  184. package/lib/idx/remediators/Base/SelectAuthenticator.d.ts +7 -7
  185. package/lib/idx/remediators/Base/VerifyAuthenticator.d.ts +2 -1
  186. package/lib/idx/remediators/EnrollProfile.d.ts +1 -1
  187. package/lib/idx/remediators/EnrollmentChannelData.d.ts +53 -0
  188. package/lib/idx/remediators/Identify.d.ts +2 -2
  189. package/lib/idx/remediators/ReEnrollAuthenticator.d.ts +2 -2
  190. package/lib/idx/remediators/RedirectIdp.d.ts +3 -3
  191. package/lib/idx/remediators/SelectEnrollmentChannel.d.ts +39 -0
  192. package/lib/idx/remediators/index.d.ts +2 -0
  193. package/lib/idx/remediators/util.d.ts +2 -2
  194. package/lib/idx/run.d.ts +3 -1
  195. package/lib/idx/startTransaction.d.ts +3 -2
  196. package/lib/idx/transactionMeta.d.ts +6 -27
  197. package/lib/idx/types/idx-js.d.ts +8 -1
  198. package/lib/idx/types/index.d.ts +17 -6
  199. package/lib/index.d.ts +1 -0
  200. package/lib/oidc/exchangeCodeForTokens.d.ts +12 -0
  201. package/lib/oidc/getWithRedirect.d.ts +1 -1
  202. package/lib/oidc/handleOAuthResponse.d.ts +1 -1
  203. package/lib/oidc/parseFromUrl.d.ts +1 -1
  204. package/lib/oidc/renewToken.d.ts +1 -1
  205. package/lib/oidc/renewTokens.d.ts +1 -1
  206. package/lib/oidc/util/browser.d.ts +1 -1
  207. package/lib/oidc/util/errors.d.ts +1 -1
  208. package/lib/oidc/util/index.d.ts +1 -0
  209. package/lib/oidc/util/oauth.d.ts +1 -8
  210. package/lib/oidc/util/oauthMeta.d.ts +2 -0
  211. package/lib/oidc/util/prepareTokenParams.d.ts +3 -0
  212. package/lib/server/serverStorage.d.ts +1 -1
  213. package/lib/services/TokenService.d.ts +2 -2
  214. package/lib/tx/AuthTransaction.d.ts +2 -2
  215. package/lib/tx/TransactionState.d.ts +11 -1
  216. package/lib/tx/api.d.ts +6 -6
  217. package/lib/types/OktaAuthOptions.d.ts +5 -6
  218. package/lib/types/Storage.d.ts +3 -3
  219. package/lib/types/Transaction.d.ts +11 -0
  220. package/lib/types/UserClaims.d.ts +3 -3
  221. package/lib/types/api.d.ts +28 -16
  222. package/lib/util/console.d.ts +1 -1
  223. package/lib/util/index.d.ts +0 -1
  224. package/lib/util/types.d.ts +1 -1
  225. package/lib/util/url.d.ts +2 -2
  226. package/package.json +5 -5
  227. package/cjs/util/emailVerify.js +0 -28
  228. package/cjs/util/emailVerify.js.map +0 -1
package/cjs/idx/run.js CHANGED
@@ -8,10 +8,14 @@ var _introspect = require("./introspect");
8
8
 
9
9
  var _remediate = require("./remediate");
10
10
 
11
+ var _flow = require("./flow");
12
+
11
13
  var remediators = _interopRequireWildcard(require("./remediators"));
12
14
 
13
15
  var _types = require("../types");
14
16
 
17
+ var _idxJs = require("./types/idx-js");
18
+
15
19
  var _transactionMeta = require("./transactionMeta");
16
20
 
17
21
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -57,7 +61,7 @@ function getEnabledFeatures(idxResponse) {
57
61
  return res;
58
62
  }
59
63
 
60
- function getAvailableSteps(remediations) {
64
+ function getAvailableSteps(idxResponse) {
61
65
  const res = [];
62
66
  const remediatorMap = Object.values(remediators).reduce((map, remediatorClass) => {
63
67
  // Only add concrete subclasses to the map
@@ -68,12 +72,12 @@ function getAvailableSteps(remediations) {
68
72
  return map;
69
73
  }, {});
70
74
 
71
- for (let remediation of remediations) {
75
+ for (let remediation of idxResponse.neededToProceed) {
72
76
  const T = remediatorMap[remediation.name];
73
77
 
74
78
  if (T) {
75
79
  const remediator = new T(remediation);
76
- res.push(remediator.getNextStep());
80
+ res.push(remediator.getNextStep(idxResponse.context));
77
81
  }
78
82
  }
79
83
 
@@ -90,21 +94,37 @@ async function run(authClient, options = {}) {
90
94
  let availableSteps;
91
95
  let status = _types.IdxStatus.PENDING;
92
96
  let shouldClearTransaction = false;
97
+ let clearSharedStorage = true;
93
98
  let idxResponse;
94
99
  let interactionHandle;
95
100
  let metaFromResp;
101
+ let interactionCode;
96
102
 
97
103
  try {
98
104
  var _metaFromResp;
99
105
 
100
- const {
106
+ let {
101
107
  flow,
102
- stateTokenExternalId,
103
- state
108
+ state,
109
+ scopes,
110
+ version,
111
+ remediators,
112
+ actions,
113
+ withCredentials,
114
+ exchangeCodeForTokens,
115
+ autoRemediate,
116
+ step
104
117
  } = options; // Only one flow can be operating at a time
105
118
 
119
+ flow = flow || authClient.idx.getFlow() || 'default';
120
+
106
121
  if (flow) {
107
122
  authClient.idx.setFlow(flow);
123
+ const flowSpec = (0, _flow.getFlowSpecification)(authClient, flow); // Favor option values over flow spec
124
+
125
+ withCredentials = typeof withCredentials !== 'undefined' ? withCredentials : flowSpec.withCredentials;
126
+ remediators = remediators || flowSpec.remediators;
127
+ actions = actions || flowSpec.actions;
108
128
  } // Try to resume saved transaction
109
129
 
110
130
 
@@ -113,26 +133,33 @@ async function run(authClient, options = {}) {
113
133
  });
114
134
  interactionHandle = (_metaFromResp = metaFromResp) === null || _metaFromResp === void 0 ? void 0 : _metaFromResp.interactionHandle; // may be undefined
115
135
 
116
- if (!interactionHandle && !stateTokenExternalId) {
136
+ if (!interactionHandle) {
117
137
  // start a new transaction
118
138
  authClient.transactionManager.clear();
119
- const interactResponse = await (0, _interact.interact)(authClient, options);
139
+ const interactResponse = await (0, _interact.interact)(authClient, {
140
+ withCredentials,
141
+ state,
142
+ scopes
143
+ });
120
144
  interactionHandle = interactResponse.interactionHandle;
121
145
  metaFromResp = interactResponse.meta;
146
+ withCredentials = metaFromResp.withCredentials;
122
147
  } // Introspect to get idx response
123
148
 
124
149
 
125
150
  idxResponse = await (0, _introspect.introspect)(authClient, {
126
- interactionHandle,
127
- stateTokenExternalId
151
+ withCredentials,
152
+ version,
153
+ interactionHandle
128
154
  });
155
+ enabledFeatures = getEnabledFeatures(idxResponse);
156
+ availableSteps = getAvailableSteps(idxResponse); // Include meta in the transaction response
157
+
158
+ meta = metaFromResp;
159
+
160
+ if (autoRemediate !== false && (remediators || actions)) {
161
+ var _idxResponse;
129
162
 
130
- if (!options.remediators && !options.actions) {
131
- // handle start transaction
132
- meta = metaFromResp;
133
- enabledFeatures = getEnabledFeatures(idxResponse);
134
- availableSteps = getAvailableSteps(idxResponse.neededToProceed);
135
- } else {
136
163
  const values = { ...options,
137
164
  stateHandle: idxResponse.rawIdxState.stateHandle
138
165
  }; // Can we handle the remediations?
@@ -143,56 +170,87 @@ async function run(authClient, options = {}) {
143
170
  terminal,
144
171
  canceled,
145
172
  messages: messagesFromResp
146
- } = await (0, _remediate.remediate)(idxResponse, values, options); // Track fields from remediation response
173
+ } = await (0, _remediate.remediate)(idxResponse, values, {
174
+ remediators,
175
+ actions,
176
+ flow,
177
+ step
178
+ });
179
+ idxResponse = idxResponseFromResp || idxResponse; // Track fields from remediation response
147
180
 
148
181
  nextStep = nextStepFromResp;
149
182
  messages = messagesFromResp; // Save intermediate idx response in storage to reduce introspect call
150
183
 
151
- if (nextStep && idxResponseFromResp) {
152
- authClient.transactionManager.saveIdxResponse(idxResponseFromResp.rawIdxState);
184
+ if (nextStep) {
185
+ authClient.transactionManager.saveIdxResponse(idxResponse.rawIdxState);
186
+ availableSteps = getAvailableSteps(idxResponse);
153
187
  }
154
188
 
155
189
  if (terminal) {
156
190
  status = _types.IdxStatus.TERMINAL;
157
191
  shouldClearTransaction = true;
192
+ clearSharedStorage = false; // transaction may be continued in another tab
158
193
  }
159
194
 
160
195
  if (canceled) {
161
196
  status = _types.IdxStatus.CANCELED;
162
197
  shouldClearTransaction = true;
163
- } else if (idxResponseFromResp !== null && idxResponseFromResp !== void 0 && idxResponseFromResp.interactionCode) {
164
- const {
165
- clientId,
166
- codeVerifier,
167
- ignoreSignature,
168
- redirectUri,
169
- urls,
170
- scopes
171
- } = metaFromResp;
172
- tokens = await authClient.token.exchangeCodeForTokens({
173
- interactionCode: idxResponseFromResp.interactionCode,
174
- clientId,
175
- codeVerifier,
176
- ignoreSignature,
177
- redirectUri,
178
- scopes
179
- }, urls);
180
- status = _types.IdxStatus.SUCCESS;
181
- shouldClearTransaction = true;
198
+ } else if ((_idxResponse = idxResponse) !== null && _idxResponse !== void 0 && _idxResponse.interactionCode) {
199
+ interactionCode = idxResponse.interactionCode;
200
+
201
+ if (exchangeCodeForTokens === false) {
202
+ status = _types.IdxStatus.SUCCESS;
203
+ shouldClearTransaction = false;
204
+ } else {
205
+ // exchange the interaction code for tokens
206
+ const {
207
+ clientId,
208
+ codeVerifier,
209
+ ignoreSignature,
210
+ redirectUri,
211
+ urls,
212
+ scopes
213
+ } = metaFromResp;
214
+ tokens = await authClient.token.exchangeCodeForTokens({
215
+ interactionCode,
216
+ clientId,
217
+ codeVerifier,
218
+ ignoreSignature,
219
+ redirectUri,
220
+ scopes
221
+ }, urls);
222
+ status = _types.IdxStatus.SUCCESS;
223
+ shouldClearTransaction = true;
224
+ }
182
225
  }
183
226
  }
184
227
  } catch (err) {
185
- error = err;
186
- status = _types.IdxStatus.FAILURE;
187
- shouldClearTransaction = true;
228
+ // current version of idx-js will throw/reject IDX responses. Handle these differently than regular errors
229
+ if ((0, _idxJs.isIdxResponse)(err)) {
230
+ error = err;
231
+ status = _types.IdxStatus.FAILURE;
232
+ shouldClearTransaction = true;
233
+ } else {
234
+ // error is not an IDX response, throw it like a regular error
235
+ throw err;
236
+ }
188
237
  }
189
238
 
190
239
  if (shouldClearTransaction) {
191
- authClient.transactionManager.clear();
192
- }
240
+ authClient.transactionManager.clear({
241
+ clearSharedStorage
242
+ });
243
+ } // from idx-js, used by the widget
244
+
193
245
 
246
+ const {
247
+ actions,
248
+ context,
249
+ neededToProceed,
250
+ proceed,
251
+ rawIdxState
252
+ } = idxResponse || {};
194
253
  return {
195
- _idxResponse: idxResponse,
196
254
  status,
197
255
  ...(meta && {
198
256
  meta
@@ -214,7 +272,15 @@ async function run(authClient, options = {}) {
214
272
  }),
215
273
  ...(error && {
216
274
  error
217
- })
275
+ }),
276
+ interactionCode,
277
+ // if options.exchangeCodeForTokens is false
278
+ // from idx-js
279
+ actions,
280
+ context,
281
+ neededToProceed,
282
+ proceed,
283
+ rawIdxState
218
284
  };
219
285
  }
220
286
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/idx/run.ts"],"names":["getEnabledFeatures","idxResponse","res","actions","neededToProceed","push","IdxFeature","PASSWORD_RECOVERY","some","name","REGISTRATION","SOCIAL_IDP","getAvailableSteps","remediations","remediatorMap","Object","values","remediators","reduce","map","remediatorClass","remediationName","remediation","T","remediator","getNextStep","run","authClient","options","tokens","nextStep","messages","error","meta","enabledFeatures","availableSteps","status","IdxStatus","PENDING","shouldClearTransaction","interactionHandle","metaFromResp","flow","stateTokenExternalId","state","idx","setFlow","transactionManager","clear","interactResponse","stateHandle","rawIdxState","idxResponseFromResp","nextStepFromResp","terminal","canceled","messagesFromResp","saveIdxResponse","TERMINAL","CANCELED","interactionCode","clientId","codeVerifier","ignoreSignature","redirectUri","urls","scopes","token","exchangeCodeForTokens","SUCCESS","err","FAILURE","_idxResponse"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * \n * See the License for the specific language governing permissions and limitations under the License.\n */\n\n\n/* eslint-disable max-statements, complexity, max-depth */\nimport { interact } from './interact';\nimport { introspect } from './introspect';\nimport { remediate } from './remediate';\nimport { RemediationFlow } from './flow';\nimport * as remediators from './remediators';\nimport { \n OktaAuth,\n IdxStatus,\n IdxTransaction,\n IdxFeature,\n NextStep,\n FlowIdentifier,\n} from '../types';\nimport { IdxResponse, IdxRemediation } from './types/idx-js';\nimport { getSavedTransactionMeta } from './transactionMeta';\nimport { ProceedOptions } from './proceed';\n\nexport type RunOptions = ProceedOptions & {\n flow?: FlowIdentifier;\n remediators?: RemediationFlow;\n actions?: string[];\n}\n\nfunction getEnabledFeatures(idxResponse: IdxResponse): IdxFeature[] {\n const res = [];\n const { actions, neededToProceed } = idxResponse;\n\n if (actions['currentAuthenticator-recover']) {\n res.push(IdxFeature.PASSWORD_RECOVERY);\n }\n\n if (neededToProceed.some(({ name }) => name === 'select-enroll-profile')) {\n res.push(IdxFeature.REGISTRATION);\n }\n\n if (neededToProceed.some(({ name }) => name === 'redirect-idp')) {\n res.push(IdxFeature.SOCIAL_IDP);\n }\n\n return res;\n}\n\nfunction getAvailableSteps(remediations: IdxRemediation[]): NextStep[] {\n const res = [];\n\n const remediatorMap = Object.values(remediators).reduce((map, remediatorClass) => {\n // Only add concrete subclasses to the map\n if (remediatorClass.remediationName) {\n map[remediatorClass.remediationName] = remediatorClass;\n }\n return map;\n }, {});\n\n for (let remediation of remediations) {\n const T = remediatorMap[remediation.name];\n if (T) {\n const remediator = new T(remediation);\n res.push (remediator.getNextStep());\n }\n }\n\n return res;\n}\n\nexport async function run(\n authClient: OktaAuth, \n options: RunOptions = {},\n): Promise<IdxTransaction> {\n let tokens;\n let nextStep;\n let messages;\n let error;\n let meta;\n let enabledFeatures;\n let availableSteps;\n let status = IdxStatus.PENDING;\n let shouldClearTransaction = false;\n let idxResponse;\n let interactionHandle;\n let metaFromResp;\n\n try {\n\n const { flow, stateTokenExternalId, state } = options;\n\n // Only one flow can be operating at a time\n if (flow) {\n authClient.idx.setFlow(flow);\n }\n\n // Try to resume saved transaction\n metaFromResp = getSavedTransactionMeta(authClient, { state });\n interactionHandle = metaFromResp?.interactionHandle; // may be undefined\n\n if (!interactionHandle && !stateTokenExternalId) {\n // start a new transaction\n authClient.transactionManager.clear();\n const interactResponse = await interact(authClient, options); \n interactionHandle = interactResponse.interactionHandle;\n metaFromResp = interactResponse.meta;\n }\n\n // Introspect to get idx response\n idxResponse = await introspect(authClient, { interactionHandle, stateTokenExternalId });\n\n if (!options.remediators && !options.actions) {\n // handle start transaction\n meta = metaFromResp;\n enabledFeatures = getEnabledFeatures(idxResponse);\n availableSteps = getAvailableSteps(idxResponse.neededToProceed);\n } else {\n const values: remediators.RemediationValues = { \n ...options, \n stateHandle: idxResponse.rawIdxState.stateHandle \n };\n\n // Can we handle the remediations?\n const { \n idxResponse: idxResponseFromResp, \n nextStep: nextStepFromResp,\n terminal,\n canceled,\n messages: messagesFromResp,\n } = await remediate(idxResponse, values, options);\n\n // Track fields from remediation response\n nextStep = nextStepFromResp;\n messages = messagesFromResp;\n\n // Save intermediate idx response in storage to reduce introspect call\n if (nextStep && idxResponseFromResp) {\n authClient.transactionManager.saveIdxResponse(idxResponseFromResp.rawIdxState);\n }\n\n if (terminal) {\n status = IdxStatus.TERMINAL;\n shouldClearTransaction = true;\n } if (canceled) {\n status = IdxStatus.CANCELED;\n shouldClearTransaction = true;\n } else if (idxResponseFromResp?.interactionCode) { \n const {\n clientId,\n codeVerifier,\n ignoreSignature,\n redirectUri,\n urls,\n scopes,\n } = metaFromResp;\n tokens = await authClient.token.exchangeCodeForTokens({\n interactionCode: idxResponseFromResp.interactionCode,\n clientId,\n codeVerifier,\n ignoreSignature,\n redirectUri,\n scopes\n }, urls);\n\n status = IdxStatus.SUCCESS;\n shouldClearTransaction = true;\n }\n }\n } catch (err) {\n error = err;\n status = IdxStatus.FAILURE;\n shouldClearTransaction = true;\n }\n\n if (shouldClearTransaction) {\n authClient.transactionManager.clear();\n }\n \n return {\n _idxResponse: idxResponse, \n status,\n ...(meta && { meta }),\n ...(enabledFeatures && { enabledFeatures }),\n ...(availableSteps && { availableSteps }),\n ...(tokens && { tokens: tokens.tokens }),\n ...(nextStep && { nextStep }),\n ...(messages && { messages }),\n ...(error && { error }),\n };\n}\n"],"file":"run.js"}
1
+ {"version":3,"sources":["../../../lib/idx/run.ts"],"names":["getEnabledFeatures","idxResponse","res","actions","neededToProceed","push","IdxFeature","PASSWORD_RECOVERY","some","name","REGISTRATION","SOCIAL_IDP","getAvailableSteps","remediatorMap","Object","values","remediators","reduce","map","remediatorClass","remediationName","remediation","T","remediator","getNextStep","context","run","authClient","options","tokens","nextStep","messages","error","meta","enabledFeatures","availableSteps","status","IdxStatus","PENDING","shouldClearTransaction","clearSharedStorage","interactionHandle","metaFromResp","interactionCode","flow","state","scopes","version","withCredentials","exchangeCodeForTokens","autoRemediate","step","idx","getFlow","setFlow","flowSpec","transactionManager","clear","interactResponse","stateHandle","rawIdxState","idxResponseFromResp","nextStepFromResp","terminal","canceled","messagesFromResp","saveIdxResponse","TERMINAL","CANCELED","SUCCESS","clientId","codeVerifier","ignoreSignature","redirectUri","urls","token","err","FAILURE","proceed"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * \n * See the License for the specific language governing permissions and limitations under the License.\n */\n\n\n/* eslint-disable max-statements, complexity, max-depth */\nimport { interact } from './interact';\nimport { introspect } from './introspect';\nimport { remediate, RemediateOptions } from './remediate';\nimport { getFlowSpecification, RemediationFlow } from './flow';\nimport * as remediators from './remediators';\nimport { \n OktaAuth,\n IdxStatus,\n IdxTransaction,\n IdxFeature,\n NextStep,\n FlowIdentifier,\n} from '../types';\nimport { IdxResponse, isIdxResponse } from './types/idx-js';\nimport { getSavedTransactionMeta } from './transactionMeta';\nimport { ProceedOptions } from './proceed';\n\nexport type RunOptions = ProceedOptions & RemediateOptions & {\n flow?: FlowIdentifier;\n remediators?: RemediationFlow;\n actions?: string[];\n withCredentials?: boolean;\n}\n\nfunction getEnabledFeatures(idxResponse: IdxResponse): IdxFeature[] {\n const res = [];\n const { actions, neededToProceed } = idxResponse;\n\n if (actions['currentAuthenticator-recover']) {\n res.push(IdxFeature.PASSWORD_RECOVERY as never);\n }\n\n if (neededToProceed.some(({ name }) => name === 'select-enroll-profile')) {\n res.push(IdxFeature.REGISTRATION as never);\n }\n\n if (neededToProceed.some(({ name }) => name === 'redirect-idp')) {\n res.push(IdxFeature.SOCIAL_IDP as never);\n }\n\n return res;\n}\n\nfunction getAvailableSteps(idxResponse: IdxResponse): NextStep[] {\n const res = [];\n\n const remediatorMap = Object.values(remediators).reduce((map, remediatorClass) => {\n // Only add concrete subclasses to the map\n if (remediatorClass.remediationName) {\n map[remediatorClass.remediationName] = remediatorClass;\n }\n return map;\n }, {});\n\n for (let remediation of idxResponse.neededToProceed) {\n const T = remediatorMap[remediation.name];\n if (T) {\n const remediator = new T(remediation);\n res.push (remediator.getNextStep(idxResponse.context) as never);\n }\n }\n\n return res;\n}\n\nexport async function run(\n authClient: OktaAuth, \n options: RunOptions = {},\n): Promise<IdxTransaction> {\n let tokens;\n let nextStep;\n let messages;\n let error;\n let meta;\n let enabledFeatures;\n let availableSteps;\n let status = IdxStatus.PENDING;\n let shouldClearTransaction = false;\n let clearSharedStorage = true;\n let idxResponse;\n let interactionHandle;\n let metaFromResp;\n let interactionCode;\n\n try {\n\n let {\n flow,\n state,\n scopes,\n version,\n remediators,\n actions,\n withCredentials,\n exchangeCodeForTokens,\n autoRemediate,\n step\n } = options;\n\n // Only one flow can be operating at a time\n flow = flow || authClient.idx.getFlow() || 'default';\n if (flow) {\n authClient.idx.setFlow(flow);\n const flowSpec = getFlowSpecification(authClient, flow);\n // Favor option values over flow spec\n withCredentials = (typeof withCredentials !== 'undefined') ? withCredentials : flowSpec.withCredentials;\n remediators = remediators || flowSpec.remediators;\n actions = actions || flowSpec.actions;\n }\n\n // Try to resume saved transaction\n metaFromResp = getSavedTransactionMeta(authClient, { state });\n interactionHandle = metaFromResp?.interactionHandle; // may be undefined\n\n if (!interactionHandle) {\n // start a new transaction\n authClient.transactionManager.clear();\n const interactResponse = await interact(authClient, { withCredentials, state, scopes }); \n interactionHandle = interactResponse.interactionHandle;\n metaFromResp = interactResponse.meta;\n withCredentials = metaFromResp.withCredentials;\n }\n\n // Introspect to get idx response\n idxResponse = await introspect(authClient, { withCredentials, version, interactionHandle });\n enabledFeatures = getEnabledFeatures(idxResponse);\n availableSteps = getAvailableSteps(idxResponse);\n \n // Include meta in the transaction response\n meta = metaFromResp;\n\n if (autoRemediate !== false && (remediators || actions)) {\n const values: remediators.RemediationValues = { \n ...options, \n stateHandle: idxResponse.rawIdxState.stateHandle \n };\n\n // Can we handle the remediations?\n const { \n idxResponse: idxResponseFromResp, \n nextStep: nextStepFromResp,\n terminal,\n canceled,\n messages: messagesFromResp,\n } = await remediate(idxResponse, values, { remediators, actions, flow, step });\n idxResponse = idxResponseFromResp || idxResponse;\n\n // Track fields from remediation response\n nextStep = nextStepFromResp;\n messages = messagesFromResp;\n\n // Save intermediate idx response in storage to reduce introspect call\n if (nextStep) {\n authClient.transactionManager.saveIdxResponse(idxResponse.rawIdxState);\n availableSteps = getAvailableSteps(idxResponse);\n }\n\n if (terminal) {\n status = IdxStatus.TERMINAL;\n shouldClearTransaction = true;\n clearSharedStorage = false; // transaction may be continued in another tab\n } if (canceled) {\n status = IdxStatus.CANCELED;\n shouldClearTransaction = true;\n } else if (idxResponse?.interactionCode) { \n interactionCode = idxResponse.interactionCode;\n\n if (exchangeCodeForTokens === false) {\n status = IdxStatus.SUCCESS;\n shouldClearTransaction = false;\n } else {\n // exchange the interaction code for tokens\n const {\n clientId,\n codeVerifier,\n ignoreSignature,\n redirectUri,\n urls,\n scopes,\n } = metaFromResp;\n tokens = await authClient.token.exchangeCodeForTokens({\n interactionCode,\n clientId,\n codeVerifier,\n ignoreSignature,\n redirectUri,\n scopes\n }, urls);\n\n status = IdxStatus.SUCCESS;\n shouldClearTransaction = true;\n }\n }\n }\n } catch (err) {\n // current version of idx-js will throw/reject IDX responses. Handle these differently than regular errors\n if (isIdxResponse(err)) {\n error = err;\n status = IdxStatus.FAILURE;\n shouldClearTransaction = true;\n } else {\n // error is not an IDX response, throw it like a regular error\n throw err;\n }\n\n }\n\n if (shouldClearTransaction) {\n authClient.transactionManager.clear({ clearSharedStorage });\n }\n \n // from idx-js, used by the widget\n const { actions, context, neededToProceed, proceed, rawIdxState } = idxResponse || {};\n return {\n status,\n ...(meta && { meta }),\n ...(enabledFeatures && { enabledFeatures }),\n ...(availableSteps && { availableSteps }),\n ...(tokens && { tokens: tokens.tokens }),\n ...(nextStep && { nextStep }),\n ...(messages && { messages }),\n ...(error && { error }),\n interactionCode, // if options.exchangeCodeForTokens is false\n\n // from idx-js\n actions,\n context,\n neededToProceed,\n proceed,\n rawIdxState,\n };\n}\n"],"file":"run.js"}
@@ -15,10 +15,12 @@ var _run = require("./run");
15
15
  *
16
16
  * See the License for the specific language governing permissions and limitations under the License.
17
17
  */
18
- // This method only resolves { status: IdxStatus.PENDING } if transaction has already started
19
18
  async function startTransaction(authClient, options = {}) {
20
19
  // Clear IDX response cache and saved transaction meta (if any)
21
20
  authClient.transactionManager.clear();
22
- return (0, _run.run)(authClient, options);
21
+ return (0, _run.run)(authClient, {
22
+ exchangeCodeForTokens: false,
23
+ ...options
24
+ });
23
25
  }
24
26
  //# sourceMappingURL=startTransaction.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/idx/startTransaction.ts"],"names":["startTransaction","authClient","options","transactionManager","clear"],"mappings":";;;;AAaA;;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMA;AACO,eAAeA,gBAAf,CACLC,UADK,EAELC,OAAmB,GAAG,EAFjB,EAGoB;AACzB;AACAD,EAAAA,UAAU,CAACE,kBAAX,CAA8BC,KAA9B;AAEA,SAAO,cAAIH,UAAJ,EAAgBC,OAAhB,CAAP;AACD","sourcesContent":["/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * \n * See the License for the specific language governing permissions and limitations under the License.\n */\n\n\nimport { run } from './run';\nimport { OktaAuth, IdxOptions, IdxTransaction } from '../types';\n\n// This method only resolves { status: IdxStatus.PENDING } if transaction has already started\nexport async function startTransaction(\n authClient: OktaAuth, \n options: IdxOptions = {}\n): Promise<IdxTransaction> {\n // Clear IDX response cache and saved transaction meta (if any)\n authClient.transactionManager.clear();\n\n return run(authClient, options);\n}\n"],"file":"startTransaction.js"}
1
+ {"version":3,"sources":["../../../lib/idx/startTransaction.ts"],"names":["startTransaction","authClient","options","transactionManager","clear","exchangeCodeForTokens"],"mappings":";;;;AAaA;;AAbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAMO,eAAeA,gBAAf,CACLC,UADK,EAELC,OAAmB,GAAG,EAFjB,EAGoB;AACzB;AACAD,EAAAA,UAAU,CAACE,kBAAX,CAA8BC,KAA9B;AAEA,SAAO,cAAIH,UAAJ,EAAgB;AACrBI,IAAAA,qBAAqB,EAAE,KADF;AAErB,OAAGH;AAFkB,GAAhB,CAAP;AAID","sourcesContent":["/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * \n * See the License for the specific language governing permissions and limitations under the License.\n */\n\n\nimport { run, RunOptions } from './run';\nimport { OktaAuth, IdxTransaction } from '../types';\n\nexport async function startTransaction(\n authClient: OktaAuth, \n options: RunOptions = {}\n): Promise<IdxTransaction> {\n // Clear IDX response cache and saved transaction meta (if any)\n authClient.transactionManager.clear();\n\n return run(authClient, {\n exchangeCodeForTokens: false,\n ...options\n });\n}\n"],"file":"startTransaction.js"}
@@ -1,17 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  exports.createTransactionMeta = createTransactionMeta;
4
- exports.transactionMetaExist = transactionMetaExist;
4
+ exports.hasSavedInteractionHandle = hasSavedInteractionHandle;
5
5
  exports.getSavedTransactionMeta = getSavedTransactionMeta;
6
6
  exports.getTransactionMeta = getTransactionMeta;
7
7
  exports.saveTransactionMeta = saveTransactionMeta;
8
8
  exports.clearTransactionMeta = clearTransactionMeta;
9
9
  exports.isTransactionMetaValid = isTransactionMetaValid;
10
+ exports.isTransactionMetaValidForFlow = isTransactionMetaValidForFlow;
11
+ exports.isTransactionMetaValidForOptions = isTransactionMetaValidForOptions;
10
12
 
11
13
  var _util = require("../util");
12
14
 
13
15
  var _oidc = require("../oidc");
14
16
 
17
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
18
+
15
19
  /*!
16
20
  * Copyright (c) 2021, Okta, Inc. and/or its affiliates. All rights reserved.
17
21
  * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
@@ -24,83 +28,78 @@ var _oidc = require("../oidc");
24
28
  * See the License for the specific language governing permissions and limitations under the License.
25
29
  */
26
30
  // Calculate new values
27
- async function createTransactionMeta(authClient, options) {
31
+ async function createTransactionMeta(authClient, options = {}) {
28
32
  const tokenParams = await authClient.token.prepareTokenParams(options);
29
- const {
30
- pkce,
31
- clientId,
32
- redirectUri,
33
- responseType,
34
- responseMode,
35
- scopes,
36
- state,
37
- nonce,
38
- ignoreSignature,
39
- codeVerifier,
40
- codeChallengeMethod,
41
- codeChallenge
42
- } = tokenParams;
43
- const urls = (0, _oidc.getOAuthUrls)(authClient, tokenParams);
44
- const flow = authClient.idx.getFlow() || 'default';
45
- const issuer = authClient.options.issuer;
46
- const meta = {
33
+ const pkceMeta = (0, _oidc.createOAuthMeta)(authClient, tokenParams);
34
+ let {
35
+ flow = 'default',
36
+ withCredentials = true,
37
+ activationToken = undefined,
38
+ recoveryToken = undefined
39
+ } = { ...authClient.options,
40
+ ...options
41
+ }; // local options override SDK options
42
+
43
+ const meta = { ...pkceMeta,
47
44
  flow,
48
- issuer,
49
- pkce,
50
- clientId,
51
- redirectUri,
52
- responseType,
53
- responseMode,
54
- scopes,
55
- state,
56
- nonce,
57
- urls,
58
- ignoreSignature,
59
- codeVerifier,
60
- codeChallengeMethod,
61
- codeChallenge
45
+ withCredentials,
46
+ activationToken,
47
+ recoveryToken
62
48
  };
63
49
  return meta;
64
50
  }
65
51
 
66
- function transactionMetaExist(authClient, options) {
67
- if (authClient.transactionManager.exists(options)) {
68
- const existing = authClient.transactionManager.load(options);
52
+ function hasSavedInteractionHandle(authClient, options) {
53
+ const savedMeta = getSavedTransactionMeta(authClient, options);
69
54
 
70
- if (isTransactionMetaValid(authClient, existing) && existing.interactionHandle) {
71
- return true;
72
- }
55
+ if (savedMeta !== null && savedMeta !== void 0 && savedMeta.interactionHandle) {
56
+ return true;
73
57
  }
74
58
 
75
59
  return false;
76
- } // Returns the saved transaction meta, if it exists and is valid, or undefined
60
+ } // Returns the saved transaction meta, if it exists and is valid
77
61
 
78
62
 
79
63
  function getSavedTransactionMeta(authClient, options) {
80
- const state = (options === null || options === void 0 ? void 0 : options.state) || authClient.options.state;
81
- const existing = authClient.transactionManager.load({
82
- state
83
- });
64
+ options = (0, _util.removeNils)(options);
65
+ options = { ...authClient.options,
66
+ ...options
67
+ }; // local options override SDK options
68
+
69
+ let savedMeta;
84
70
 
85
- if (existing && isTransactionMetaValid(authClient, existing)) {
86
- return existing;
71
+ try {
72
+ savedMeta = authClient.transactionManager.load(options);
73
+ } catch (e) {// ignore errors here
87
74
  }
75
+
76
+ if (!savedMeta) {
77
+ return;
78
+ }
79
+
80
+ if (isTransactionMetaValid(savedMeta, options)) {
81
+ return savedMeta;
82
+ } // existing meta is not valid for this configuration
83
+ // this is common when changing configuration in local development environment
84
+ // in a production environment, this may indicate that two apps are sharing a storage key
85
+
86
+
87
+ (0, _util.warn)('Saved transaction meta does not match the current configuration. ' + 'This may indicate that two apps are sharing a storage key.');
88
88
  }
89
89
 
90
90
  async function getTransactionMeta(authClient, options) {
91
+ options = (0, _util.removeNils)(options);
92
+ options = { ...authClient.options,
93
+ ...options
94
+ }; // local options override SDK options
91
95
  // Load existing transaction meta from storage
92
- if (authClient.transactionManager.exists(options)) {
93
- const validExistingMeta = getSavedTransactionMeta(authClient, options);
94
96
 
95
- if (validExistingMeta) {
96
- return validExistingMeta;
97
- } // existing meta is not valid for this configuration
98
- // this is common when changing configuration in local development environment
99
- // in a production environment, this may indicate that two apps are sharing a storage key
97
+ const validExistingMeta = getSavedTransactionMeta(authClient, options);
100
98
 
99
+ if (validExistingMeta) {
100
+ return validExistingMeta;
101
+ } // No existing? Create new transaction meta.
101
102
 
102
- (0, _util.warn)('Saved transaction meta does not match the current configuration. ' + 'This may indicate that two apps are sharing a storage key.');
103
- }
104
103
 
105
104
  return createTransactionMeta(authClient, options);
106
105
  }
@@ -113,29 +112,30 @@ function saveTransactionMeta(authClient, meta) {
113
112
 
114
113
  function clearTransactionMeta(authClient) {
115
114
  authClient.transactionManager.clear();
116
- } // returns true if values in meta match current authClient options
117
- // eslint-disable-next-line complexity
118
-
115
+ }
119
116
 
120
- function isTransactionMetaValid(authClient, meta) {
121
- // First validate against required config
122
- const keys = ['issuer', 'clientId', 'redirectUri'];
117
+ function isTransactionMetaValid(meta, options = {}) {
118
+ // Validate against certain options. If these exist in options, they must match in meta
119
+ const keys = ['issuer', 'clientId', 'redirectUri', 'state', 'codeChallenge', 'codeChallengeMethod', 'activationToken', 'recoveryToken'];
123
120
 
124
- if (keys.some(key => authClient.options[key] !== meta[key])) {
121
+ if (isTransactionMetaValidForOptions(meta, options, keys) === false) {
125
122
  return false;
126
- } // Validate optional config
123
+ } // Validate configured flow
127
124
 
128
125
 
129
126
  const {
130
- flow,
131
- state
132
- } = authClient.options; // If state is specified, it must match meta to be valid
127
+ flow
128
+ } = options;
133
129
 
134
- if (state && state !== meta.state) {
130
+ if (isTransactionMetaValidForFlow(meta, flow) === false) {
135
131
  return false;
136
- } // Specific flows should not share transaction data
132
+ }
137
133
 
134
+ return true;
135
+ }
138
136
 
137
+ function isTransactionMetaValidForFlow(meta, flow) {
138
+ // Specific flows should not share transaction data
139
139
  const shouldValidateFlow = flow && flow !== 'default' && flow !== 'proceed';
140
140
 
141
141
  if (shouldValidateFlow) {
@@ -147,4 +147,17 @@ function isTransactionMetaValid(authClient, meta) {
147
147
 
148
148
  return true;
149
149
  }
150
+
151
+ function isTransactionMetaValidForOptions(meta, options, keys) {
152
+ // returns false if values in meta do not match options
153
+ // if the option does not have a value for a specific key, it is ignored
154
+ const mismatch = keys.some(key => {
155
+ const value = options[key];
156
+
157
+ if (value && value !== meta[key]) {
158
+ return true;
159
+ }
160
+ });
161
+ return !mismatch;
162
+ }
150
163
  //# sourceMappingURL=transactionMeta.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../lib/idx/transactionMeta.ts"],"names":["createTransactionMeta","authClient","options","tokenParams","token","prepareTokenParams","pkce","clientId","redirectUri","responseType","responseMode","scopes","state","nonce","ignoreSignature","codeVerifier","codeChallengeMethod","codeChallenge","urls","flow","idx","getFlow","issuer","meta","transactionMetaExist","transactionManager","exists","existing","load","isTransactionMetaValid","interactionHandle","getSavedTransactionMeta","getTransactionMeta","validExistingMeta","saveTransactionMeta","save","muteWarning","clearTransactionMeta","clear","keys","some","key","shouldValidateFlow"],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) 2021, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { OktaAuth, IdxTransactionMeta, TransactionMetaOptions } from '../types';\nimport { warn } from '../util';\nimport { getOAuthUrls } from '../oidc';\n\n// Calculate new values\nexport async function createTransactionMeta(authClient: OktaAuth, options?: TransactionMetaOptions) {\n const tokenParams = await authClient.token.prepareTokenParams(options);\n const {\n pkce,\n clientId,\n redirectUri,\n responseType,\n responseMode,\n scopes,\n state,\n nonce,\n ignoreSignature,\n codeVerifier,\n codeChallengeMethod,\n codeChallenge,\n } = tokenParams;\n const urls = getOAuthUrls(authClient, tokenParams);\n const flow = authClient.idx.getFlow() || 'default';\n const issuer = authClient.options.issuer;\n const meta = {\n flow,\n issuer,\n pkce,\n clientId,\n redirectUri,\n responseType,\n responseMode,\n scopes,\n state,\n nonce,\n urls,\n ignoreSignature,\n codeVerifier,\n codeChallengeMethod,\n codeChallenge \n };\n return meta;\n}\n\nexport function transactionMetaExist(authClient: OktaAuth, options?: TransactionMetaOptions): boolean {\n if (authClient.transactionManager.exists(options)) {\n const existing = authClient.transactionManager.load(options) as IdxTransactionMeta;\n if (isTransactionMetaValid(authClient, existing) && existing.interactionHandle) {\n return true;\n }\n }\n return false;\n}\n\n// Returns the saved transaction meta, if it exists and is valid, or undefined\nexport function getSavedTransactionMeta(authClient: OktaAuth, options?: TransactionMetaOptions): IdxTransactionMeta {\n const state = options?.state || authClient.options.state;\n const existing = authClient.transactionManager.load({ state }) as IdxTransactionMeta;\n if (existing && isTransactionMetaValid(authClient, existing)) {\n return existing;\n }\n}\n\nexport async function getTransactionMeta(\n authClient: OktaAuth,\n options?: TransactionMetaOptions\n): Promise<IdxTransactionMeta> {\n // Load existing transaction meta from storage\n if (authClient.transactionManager.exists(options)) {\n const validExistingMeta = getSavedTransactionMeta(authClient, options);\n if (validExistingMeta) {\n return validExistingMeta;\n }\n // existing meta is not valid for this configuration\n // this is common when changing configuration in local development environment\n // in a production environment, this may indicate that two apps are sharing a storage key\n warn('Saved transaction meta does not match the current configuration. ' + \n 'This may indicate that two apps are sharing a storage key.');\n }\n\n return createTransactionMeta(authClient, options);\n}\n\nexport function saveTransactionMeta (authClient: OktaAuth, meta) {\n authClient.transactionManager.save(meta, { muteWarning: true });\n}\n\nexport function clearTransactionMeta (authClient: OktaAuth) {\n authClient.transactionManager.clear();\n}\n\n// returns true if values in meta match current authClient options\n// eslint-disable-next-line complexity\nexport function isTransactionMetaValid (authClient: OktaAuth, meta) {\n // First validate against required config\n const keys = ['issuer', 'clientId', 'redirectUri'];\n if (keys.some(key => authClient.options[key] !== meta[key])) {\n return false;\n }\n\n // Validate optional config\n const { flow, state } = authClient.options;\n \n // If state is specified, it must match meta to be valid\n if (state && state !== meta.state) {\n return false;\n }\n\n // Specific flows should not share transaction data\n const shouldValidateFlow = flow && flow !== 'default' && flow !== 'proceed';\n if (shouldValidateFlow) {\n if (flow !== meta.flow) {\n // The flow has changed; abandon the old transaction\n return false;\n }\n }\n\n return true;\n}\n"],"file":"transactionMeta.js"}
1
+ {"version":3,"sources":["../../../lib/idx/transactionMeta.ts"],"names":["createTransactionMeta","authClient","options","tokenParams","token","prepareTokenParams","pkceMeta","flow","withCredentials","activationToken","undefined","recoveryToken","meta","hasSavedInteractionHandle","savedMeta","getSavedTransactionMeta","interactionHandle","transactionManager","load","e","isTransactionMetaValid","getTransactionMeta","validExistingMeta","saveTransactionMeta","save","muteWarning","clearTransactionMeta","clear","keys","isTransactionMetaValidForOptions","isTransactionMetaValidForFlow","shouldValidateFlow","mismatch","some","key","value"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/*!\n * Copyright (c) 2021, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { OktaAuth, IdxTransactionMeta, TransactionMetaOptions, PKCETransactionMeta } from '../types';\nimport { removeNils, warn } from '../util';\nimport { createOAuthMeta } from '../oidc';\n\n// Calculate new values\nexport async function createTransactionMeta(\n authClient: OktaAuth,\n options: TransactionMetaOptions = {}\n): Promise<IdxTransactionMeta> {\n const tokenParams = await authClient.token.prepareTokenParams(options);\n const pkceMeta = createOAuthMeta(authClient, tokenParams) as PKCETransactionMeta;\n let {\n flow = 'default',\n withCredentials = true,\n activationToken = undefined,\n recoveryToken = undefined,\n } = { ...authClient.options, ...options }; // local options override SDK options\n\n const meta: IdxTransactionMeta = {\n ...pkceMeta,\n flow,\n withCredentials,\n activationToken,\n recoveryToken,\n };\n return meta;\n}\n\nexport function hasSavedInteractionHandle(authClient: OktaAuth, options?: TransactionMetaOptions): boolean {\n const savedMeta = getSavedTransactionMeta(authClient, options);\n if (savedMeta?.interactionHandle) {\n return true;\n }\n return false;\n}\n\n// Returns the saved transaction meta, if it exists and is valid\nexport function getSavedTransactionMeta(\n authClient: OktaAuth,\n options?: TransactionMetaOptions\n): IdxTransactionMeta | undefined {\n options = removeNils(options);\n options = { ...authClient.options, ...options }; // local options override SDK options\n let savedMeta;\n try {\n savedMeta = authClient.transactionManager.load(options) as IdxTransactionMeta;\n } catch (e) {\n // ignore errors here\n }\n\n if (!savedMeta) {\n return;\n }\n\n if (isTransactionMetaValid(savedMeta, options)) {\n return savedMeta;\n }\n\n // existing meta is not valid for this configuration\n // this is common when changing configuration in local development environment\n // in a production environment, this may indicate that two apps are sharing a storage key\n warn('Saved transaction meta does not match the current configuration. ' + \n 'This may indicate that two apps are sharing a storage key.');\n\n}\n\nexport async function getTransactionMeta(\n authClient: OktaAuth,\n options?: TransactionMetaOptions\n): Promise<IdxTransactionMeta> {\n options = removeNils(options);\n options = { ...authClient.options, ...options }; // local options override SDK options\n // Load existing transaction meta from storage\n const validExistingMeta = getSavedTransactionMeta(authClient, options);\n if (validExistingMeta) {\n return validExistingMeta;\n }\n // No existing? Create new transaction meta.\n return createTransactionMeta(authClient, options);\n}\n\nexport function saveTransactionMeta (authClient: OktaAuth, meta): void {\n authClient.transactionManager.save(meta, { muteWarning: true });\n}\n\nexport function clearTransactionMeta (authClient: OktaAuth): void {\n authClient.transactionManager.clear();\n}\n\nexport function isTransactionMetaValid (meta, options: TransactionMetaOptions = {}): boolean {\n // Validate against certain options. If these exist in options, they must match in meta\n const keys = [\n 'issuer',\n 'clientId',\n 'redirectUri',\n 'state',\n 'codeChallenge',\n 'codeChallengeMethod',\n 'activationToken',\n 'recoveryToken'\n ];\n if (isTransactionMetaValidForOptions(meta, options, keys) === false) {\n return false;\n }\n\n // Validate configured flow\n const { flow } = options;\n if (isTransactionMetaValidForFlow(meta, flow) === false) {\n return false;\n }\n\n return true;\n}\n\nexport function isTransactionMetaValidForFlow(meta, flow) {\n // Specific flows should not share transaction data\n const shouldValidateFlow = flow && flow !== 'default' && flow !== 'proceed';\n if (shouldValidateFlow) {\n if (flow !== meta.flow) {\n // The flow has changed; abandon the old transaction\n return false;\n }\n }\n return true;\n}\n\nexport function isTransactionMetaValidForOptions(meta, options, keys) {\n // returns false if values in meta do not match options\n // if the option does not have a value for a specific key, it is ignored\n const mismatch = keys.some(key => {\n const value = options[key];\n if (value && value !== meta[key]) {\n return true;\n }\n });\n return !mismatch;\n}\n"],"file":"transactionMeta.js"}