@atlasauth/js 0.36.0 → 0.38.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 (45) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/app-approval.d.ts +54 -0
  3. package/dist/app-approval.js +66 -0
  4. package/dist/app-approval.js.map +1 -0
  5. package/dist/attempt.d.ts +2 -0
  6. package/dist/attempt.js.map +1 -1
  7. package/dist/authorized-apps.d.ts +8 -0
  8. package/dist/authorized-apps.js +9 -0
  9. package/dist/authorized-apps.js.map +1 -1
  10. package/dist/compat.js +1 -0
  11. package/dist/compat.js.map +1 -1
  12. package/dist/developer-portal.d.ts +80 -0
  13. package/dist/developer-portal.js +50 -0
  14. package/dist/developer-portal.js.map +1 -0
  15. package/dist/dpop.d.ts +30 -0
  16. package/dist/dpop.js +74 -0
  17. package/dist/dpop.js.map +1 -0
  18. package/dist/environment.d.ts +5 -0
  19. package/dist/environment.js +3 -0
  20. package/dist/environment.js.map +1 -1
  21. package/dist/errors.d.ts +8 -1
  22. package/dist/errors.js +13 -0
  23. package/dist/errors.js.map +1 -1
  24. package/dist/fapi.d.ts +3 -1
  25. package/dist/fapi.js +10 -3
  26. package/dist/fapi.js.map +1 -1
  27. package/dist/has-token.d.ts +7 -0
  28. package/dist/has-token.js +15 -0
  29. package/dist/has-token.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.js +8 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/passkey.d.ts +2 -0
  34. package/dist/passkey.js.map +1 -1
  35. package/dist/session-global.d.ts +2 -0
  36. package/dist/session-global.js.map +1 -1
  37. package/dist/sign-in-flow.d.ts +116 -0
  38. package/dist/sign-in-flow.js +232 -0
  39. package/dist/sign-in-flow.js.map +1 -0
  40. package/dist/step-up.d.ts +46 -0
  41. package/dist/step-up.js +60 -0
  42. package/dist/step-up.js.map +1 -1
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +1 -1
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SECOND_FACTOR_STRATEGIES = void 0;
4
+ exports.createSignInFlow = createSignInFlow;
5
+ exports.createSignUpFlow = createSignUpFlow;
6
+ /**
7
+ * Headless sign-in and sign-up: one typed step at a time, no UI.
8
+ *
9
+ * `createSignInFlow()` / `createSignUpFlow()` wrap the same requests the
10
+ * prebuilt components send. You render whatever the current `step` asks for and
11
+ * call the matching method; the flow never decides the next step itself, the
12
+ * server does. Captcha is handled for you: when the server asks for one the step
13
+ * is `needs_captcha`, and `solveCaptcha(container)` draws the widget for the
14
+ * right flow and submits its token.
15
+ *
16
+ * Errors carry a stable `reason` (`form_password_incorrect`, `captcha_wrong_flow`,
17
+ * …). Turn it into a sentence in the app's language with `reasonMessage`.
18
+ */
19
+ const attempt_1 = require("./attempt");
20
+ const instance_settings_1 = require("./instance-settings");
21
+ const policies_1 = require("./policies");
22
+ const passkey_sign_in_1 = require("./passkey-sign-in");
23
+ const redirect_1 = require("./redirect");
24
+ const captcha_widget_1 = require("./captcha-widget");
25
+ const fapi_1 = require("./fapi");
26
+ /** Second-factor strategies the server accepts. Not narrowed per account: that would reveal what the account has. */
27
+ exports.SECOND_FACTOR_STRATEGIES = ['totp', 'backup_code', 'sms', 'email_code'];
28
+ const CAPTCHA_CODES = ['CAPTCHA_REQUIRED', 'CAPTCHA_FAILED'];
29
+ function makeCore(opts, captchaFlow) {
30
+ const { client } = opts;
31
+ let flow = fapi_1.initialFlow;
32
+ let step = { type: 'needs_identifier' };
33
+ let busy = false;
34
+ let errors = [];
35
+ let reason = null;
36
+ let captchaToken = null;
37
+ let captchaSettings;
38
+ let redirect = null;
39
+ const listeners = new Set();
40
+ const snapshot = () => ({ step, errors, reason, busy });
41
+ const emit = () => {
42
+ const s = snapshot();
43
+ for (const l of listeners)
44
+ l(s);
45
+ return s;
46
+ };
47
+ const loadCaptcha = async () => {
48
+ if (captchaSettings === undefined) {
49
+ const settings = await (0, instance_settings_1.fetchInstanceSettings)(client);
50
+ captchaSettings = settings?.captchaFlows[captchaFlow] ?? null;
51
+ }
52
+ return captchaSettings;
53
+ };
54
+ const stepFor = async (attempt) => {
55
+ if (redirect)
56
+ return { type: 'redirect', url: redirect };
57
+ if (!attempt)
58
+ return { type: 'needs_identifier' };
59
+ const next = (0, attempt_1.nextStep)(attempt);
60
+ switch (next.kind) {
61
+ case 'collect_identifier':
62
+ case 'restart':
63
+ return { type: 'needs_identifier' };
64
+ case 'collect_captcha':
65
+ return { type: 'needs_captcha', flow: captchaFlow, captcha: await loadCaptcha() };
66
+ case 'collect_first_factor':
67
+ return { type: 'needs_first_factor', factors: next.strategies };
68
+ case 'collect_second_factor':
69
+ return { type: 'needs_second_factor', factors: [...exports.SECOND_FACTOR_STRATEGIES] };
70
+ case 'accept_policies':
71
+ return { type: 'needs_policy_acceptance', policies: next.policies };
72
+ case 'collect_email_code':
73
+ return { type: 'needs_email_verification' };
74
+ case 'done':
75
+ return { type: 'complete', sessionId: next.sessionId };
76
+ case 'await_oauth':
77
+ case 'enroll_second_factor':
78
+ case 'collect_new_password':
79
+ case 'complete_required_action':
80
+ case 'unknown':
81
+ return { type: 'needs_other', status: attempt.status };
82
+ }
83
+ };
84
+ /** Run one call, fold its resulting FlowState in, exchange a completion ticket, and publish. */
85
+ const run = async (call) => {
86
+ busy = true;
87
+ emit();
88
+ let next = await call();
89
+ if (next.ticket && next.attempt?.id) {
90
+ const exchanged = await client.post('/v1/client/tickets/exchange', { attempt_id: next.attempt.id, ticket: next.ticket });
91
+ next = exchanged.ok ? { ...next, ticket: null } : { ...next, errors: exchanged.errors };
92
+ }
93
+ flow = next;
94
+ errors = next.errors;
95
+ reason = errors[0]?.reason ?? next.attempt?.reason ?? null;
96
+ busy = false;
97
+ step = await stepFor(next.attempt);
98
+ return emit();
99
+ };
100
+ /** A captcha error on a call that has no attempt yet becomes the captcha step. */
101
+ const captchaStepFromErrors = async () => {
102
+ if (!errors.some((e) => CAPTCHA_CODES.includes(e.code)))
103
+ return false;
104
+ step = { type: 'needs_captcha', flow: captchaFlow, captcha: await loadCaptcha() };
105
+ emit();
106
+ return true;
107
+ };
108
+ return {
109
+ get flow() { return flow; },
110
+ get captchaToken() { return captchaToken; },
111
+ takeCaptchaToken() { const t = captchaToken; captchaToken = null; return t; },
112
+ setCaptchaToken(t) { captchaToken = t; },
113
+ get errors() { return errors; },
114
+ run,
115
+ captchaStepFromErrors,
116
+ setRedirect(url) { redirect = url; },
117
+ api(extra) {
118
+ return {
119
+ getSnapshot: snapshot,
120
+ subscribe(l) { listeners.add(l); return () => void listeners.delete(l); },
121
+ submitCaptcha: extra.submitCaptcha,
122
+ async solveCaptcha(container) {
123
+ const settings = await loadCaptcha();
124
+ if (!settings) {
125
+ errors = [{ code: 'CAPTCHA_UNAVAILABLE', reason: 'captcha_unavailable', message: 'No captcha is configured for this flow.' }];
126
+ reason = 'captcha_unavailable';
127
+ return emit();
128
+ }
129
+ try {
130
+ return await extra.submitCaptcha(await (0, captcha_widget_1.renderCaptchaWidget)(settings, container).token);
131
+ }
132
+ catch {
133
+ errors = [{ code: 'CAPTCHA_FAILED', reason: 'captcha_failed', message: 'The security check did not complete.' }];
134
+ reason = 'captcha_failed';
135
+ return emit();
136
+ }
137
+ },
138
+ async startOAuth(provider, redirectUrl) {
139
+ const started = await (0, redirect_1.startOauthRedirect)(client, { provider, redirectUrl });
140
+ if (!started) {
141
+ errors = [{ code: 'OAUTH_START_FAILED', reason: 'oauth_start_failed', message: 'Could not start the social sign-in.' }];
142
+ reason = 'oauth_start_failed';
143
+ return emit();
144
+ }
145
+ redirect = started.authorizationUrl;
146
+ step = { type: 'redirect', url: started.authorizationUrl };
147
+ errors = [];
148
+ reason = null;
149
+ return emit();
150
+ },
151
+ acceptPolicies: (acceptances) => run(() => (0, policies_1.acceptAttemptPolicies)(client, flow, acceptances)),
152
+ reset() {
153
+ flow = fapi_1.initialFlow;
154
+ step = { type: 'needs_identifier' };
155
+ errors = [];
156
+ reason = null;
157
+ captchaToken = null;
158
+ redirect = null;
159
+ return emit();
160
+ },
161
+ };
162
+ },
163
+ };
164
+ }
165
+ function createSignInFlow(opts) {
166
+ const core = makeCore(opts, 'signIn');
167
+ const { client } = opts;
168
+ let identifier = '';
169
+ const attemptId = () => core.flow.attempt?.id ?? '';
170
+ const start = (id) => {
171
+ identifier = id;
172
+ return core.run(() => (0, fapi_1.advance)(client, { ...fapi_1.initialFlow }, { identifier: id, ...(core.captchaToken ? { captcha_token: core.takeCaptchaToken() } : {}) }));
173
+ };
174
+ // A captcha asked for by the passkey button is answered by trying the passkey again, not by an identifier.
175
+ let viaPasskey = false;
176
+ const passkey = async () => {
177
+ viaPasskey = true;
178
+ const snap = await core.run(() => (0, passkey_sign_in_1.signInWithPasskey)(client, { captcha: core.captchaToken ? async () => core.takeCaptchaToken() : null }));
179
+ viaPasskey = await core.captchaStepFromErrors();
180
+ return viaPasskey ? api.getSnapshot() : snap;
181
+ };
182
+ const submitCaptcha = async (token) => {
183
+ core.setCaptchaToken(token);
184
+ return viaPasskey ? passkey() : start(core.flow.attempt?.identifier ?? identifier);
185
+ };
186
+ const api = core.api({ submitCaptcha });
187
+ return {
188
+ ...api,
189
+ submitIdentifier: (id) => {
190
+ viaPasskey = false;
191
+ return start(id);
192
+ },
193
+ submitPassword: (password) => core.run(() => (0, fapi_1.advance)(client, core.flow, { password })),
194
+ sendEmailCode: () => core.run(() => (0, fapi_1.prepareFactor)(client, core.flow, 'email_code')),
195
+ submitEmailCode: (code) => core.run(() => (0, fapi_1.advance)(client, core.flow, { code })),
196
+ signInWithPasskey: passkey,
197
+ submitSecondFactor: (code, strategy = 'totp', options = {}) => core.run(() => (0, fapi_1.advance)(client, core.flow, {
198
+ code,
199
+ ...(strategy === 'email_code' ? { strategy } : {}),
200
+ ...(options.rememberDevice ? { remember_device: 'true' } : {}),
201
+ })),
202
+ async sendSecondFactorCode(strategy) {
203
+ const res = await client.post(`/v1/client/sign_ins/${encodeURIComponent(attemptId())}/prepare_second_factor`, { strategy });
204
+ return core.run(async () => ({ ...core.flow, errors: res.ok ? [] : res.errors }));
205
+ },
206
+ };
207
+ }
208
+ function createSignUpFlow(opts) {
209
+ const core = makeCore(opts, 'signUp');
210
+ const { client } = opts;
211
+ let last = null;
212
+ const submit = async (input) => {
213
+ last = input;
214
+ const token = core.takeCaptchaToken();
215
+ const snap = await core.run(() => (0, fapi_1.startSignUp)(client, { ...input, ...(token ? { captchaToken: token } : {}) }));
216
+ if (!(await core.captchaStepFromErrors()))
217
+ return snap;
218
+ return api.getSnapshot();
219
+ };
220
+ const submitCaptcha = async (token) => {
221
+ core.setCaptchaToken(token);
222
+ return last ? submit(last) : api.getSnapshot();
223
+ };
224
+ const api = core.api({ submitCaptcha });
225
+ return {
226
+ ...api,
227
+ submit,
228
+ submitEmailCode: (code) => core.run(() => (0, fapi_1.advance)(client, core.flow, { code })),
229
+ resendEmailCode: () => core.run(() => (0, fapi_1.resendSignUpVerification)(client, core.flow)),
230
+ };
231
+ }
232
+ //# sourceMappingURL=sign-in-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-flow.js","sourceRoot":"","sources":["../src/sign-in-flow.ts"],"names":[],"mappings":";;;AAkOA,4CAiDC;AAuBD,4CAuBC;AAjUD;;;;;;;;;;;;GAYG;AACH,uCAA4F;AAC5F,2DAA4D;AAC5D,yCAA0E;AAC1E,uDAAsD;AACtD,yCAAgD;AAChD,qDAA8F;AAC9F,iCAQgB;AAEhB,qHAAqH;AACxG,QAAA,wBAAwB,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,CAAU,CAAC;AA4C9F,MAAM,aAAa,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;AAE7D,SAAS,QAAQ,CAAC,IAAiB,EAAE,WAA2B;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,GAAc,kBAAW,CAAC;IAClC,IAAI,IAAI,GAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAClD,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,MAAM,GAAiB,EAAE,CAAC;IAC9B,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,eAA+C,CAAC;IACpD,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;IAEvD,MAAM,QAAQ,GAAG,GAAiB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAiC,EAAE;QAC1D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,MAAM,IAAA,yCAAqB,EAAC,MAAM,CAAC,CAAC;YACrD,eAAe,GAAG,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;QAChE,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,OAA2B,EAAqB,EAAE;QACvE,IAAI,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QACzD,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC;QAC/B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,oBAAoB,CAAC;YAC1B,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;YACtC,KAAK,iBAAiB;gBACpB,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,EAAE,EAAE,CAAC;YACpF,KAAK,sBAAsB;gBACzB,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;YAClE,KAAK,uBAAuB;gBAC1B,OAAO,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,CAAC,GAAG,gCAAwB,CAAC,EAAE,CAAC;YACjF,KAAK,iBAAiB;gBACpB,OAAO,EAAE,IAAI,EAAE,yBAAyB,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtE,KAAK,oBAAoB;gBACvB,OAAO,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC;YAC9C,KAAK,MAAM;gBACT,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,KAAK,aAAa,CAAC;YACnB,KAAK,sBAAsB,CAAC;YAC5B,KAAK,sBAAsB,CAAC;YAC5B,KAAK,0BAA0B,CAAC;YAChC,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;IAEF,gGAAgG;IAChG,MAAM,GAAG,GAAG,KAAK,EAAE,IAA8B,EAAyB,EAAE;QAC1E,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,EAAE,CAAC;QACP,IAAI,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;YACpC,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YACzH,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QAC1F,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;QACZ,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;QAC3D,IAAI,GAAG,KAAK,CAAC;QACb,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;IAEF,kFAAkF;IAClF,MAAM,qBAAqB,GAAG,KAAK,IAAsB,EAAE;QACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACtE,IAAI,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,WAAW,EAAE,EAAE,CAAC;QAClF,IAAI,EAAE,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;QAC3B,IAAI,YAAY,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC;QAC3C,gBAAgB,KAAK,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7E,eAAe,CAAC,CAAS,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;QAC/B,GAAG;QACH,qBAAqB;QACrB,WAAW,CAAC,GAAW,IAAI,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5C,GAAG,CAAC,KAA8D;YAChE,OAAO;gBACL,WAAW,EAAE,QAAQ;gBACrB,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzE,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,KAAK,CAAC,YAAY,CAAC,SAAS;oBAC1B,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;oBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACd,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,yCAAyC,EAAE,CAAC,CAAC;wBAC9H,MAAM,GAAG,qBAAqB,CAAC;wBAC/B,OAAO,IAAI,EAAE,CAAC;oBAChB,CAAC;oBACD,IAAI,CAAC;wBACH,OAAO,MAAM,KAAK,CAAC,aAAa,CAAC,MAAM,IAAA,oCAAmB,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC;oBACzF,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,sCAAsC,EAAE,CAAC,CAAC;wBACjH,MAAM,GAAG,gBAAgB,CAAC;wBAC1B,OAAO,IAAI,EAAE,CAAC;oBAChB,CAAC;gBACH,CAAC;gBACD,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW;oBACpC,MAAM,OAAO,GAAG,MAAM,IAAA,6BAAkB,EAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;oBAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;wBACb,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,qCAAqC,EAAE,CAAC,CAAC;wBACxH,MAAM,GAAG,oBAAoB,CAAC;wBAC9B,OAAO,IAAI,EAAE,CAAC;oBAChB,CAAC;oBACD,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;oBACpC,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBAC3D,MAAM,GAAG,EAAE,CAAC;oBACZ,MAAM,GAAG,IAAI,CAAC;oBACd,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBACD,cAAc,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,gCAAqB,EAAC,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;gBAC5F,KAAK;oBACH,IAAI,GAAG,kBAAW,CAAC;oBAAC,IAAI,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;oBAAC,MAAM,GAAG,EAAE,CAAC;oBAAC,MAAM,GAAG,IAAI,CAAC;oBAAC,YAAY,GAAG,IAAI,CAAC;oBAAC,QAAQ,GAAG,IAAI,CAAC;oBAC1H,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAmBD,SAAgB,gBAAgB,CAAC,IAAiB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;IAEpD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE;QAC3B,UAAU,GAAG,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,EAAE,GAAG,kBAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,gBAAgB,EAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5J,CAAC,CAAC;IACF,2GAA2G;IAC3G,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,UAAU,GAAG,IAAI,CAAC;QAClB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAC/B,IAAA,mCAAiB,EAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CACvG,CAAC;QACF,UAAU,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAChD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC5C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,UAAU,CAAC,CAAC;IACrF,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IAExC,OAAO;QACL,GAAG,GAAG;QACN,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE;YACvB,UAAU,GAAG,KAAK,CAAC;YACnB,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QACD,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtF,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,oBAAa,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACnF,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,iBAAiB,EAAE,OAAO;QAC1B,kBAAkB,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAC5D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CACZ,IAAA,cAAO,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;YACzB,IAAI;YACJ,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC,CACH;QACH,KAAK,CAAC,oBAAoB,CAAC,QAAQ;YACjC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,uBAAuB,kBAAkB,CAAC,SAAS,EAAE,CAAC,wBAAwB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC5H,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC;AAuBD,SAAgB,gBAAgB,CAAC,IAAiB;IAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,IAAI,GAAuB,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAG,KAAK,EAAE,KAAkB,EAAE,EAAE;QAC1C,IAAI,GAAG,KAAK,CAAC;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,kBAAW,EAAC,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChH,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC;IAC3B,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC5C,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;IACjD,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IACxC,OAAO;QACL,GAAG,GAAG;QACN,MAAM;QACN,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,cAAO,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,+BAAwB,EAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;KACnF,CAAC;AACJ,CAAC"}
package/dist/step-up.d.ts CHANGED
@@ -13,6 +13,7 @@
13
13
  * email_code POST /v1/client/me/step_up/email_code, then { strategy: 'email_code', code }
14
14
  * passkey POST /v1/client/me/step_up/passkey (challenge), then the assertion
15
15
  */
16
+ import type { FieldError } from './attempt';
16
17
  import type { FapiClient, FapiResponse } from './fapi';
17
18
  export type StepUpInput = {
18
19
  strategy: 'password';
@@ -50,3 +51,48 @@ export declare function sendStepUpEmailCode(client: FapiClient): Promise<FapiRes
50
51
  export declare function authenticatedWithin(claims: {
51
52
  auth_time?: unknown;
52
53
  }, maxAgeSeconds: number, nowMs?: number): boolean;
54
+ /** What a STEP_UP_REQUIRED refusal asks for, read off the refusal alone. */
55
+ export interface StepUpRequirement {
56
+ /** The action that was refused (`email_change`, `api_key_create`, …), when the server named it. */
57
+ action: string | null;
58
+ /** The factor strategies `stepUp()` accepts for it, e.g. `password`, `passkey`, `totp`. */
59
+ acceptedFactors: string[];
60
+ /** How recent the proof must be, in seconds; null when any multi-factor sign-in on the session counts. */
61
+ maxAgeSeconds: number | null;
62
+ }
63
+ /** The step-up a refusal asks for, or null when `errors` holds no STEP_UP_REQUIRED. */
64
+ export declare function stepUpRequirement(errors: readonly FieldError[]): StepUpRequirement | null;
65
+ /** What your prompt is asked to collect. */
66
+ export interface StepUpPrompt extends StepUpRequirement {
67
+ /** The previous credential was wrong: show this error and ask again. */
68
+ error: FieldError | null;
69
+ /** Email the step-up code (for the `email_code` factor). */
70
+ sendEmailCode(): Promise<FapiResponse<unknown>>;
71
+ }
72
+ /** Thrown by {@link requireStepUp} when the prompt gives up (returns null). */
73
+ export declare class StepUpCancelledError extends Error {
74
+ readonly code = "STEP_UP_CANCELLED";
75
+ constructor();
76
+ }
77
+ export interface RequireStepUpOptions {
78
+ client: FapiClient;
79
+ /** Ask the person for a credential; return null to cancel. */
80
+ prompt: (request: StepUpPrompt) => Promise<StepUpInput | null> | StepUpInput | null;
81
+ /** The refusal that triggered this, so the prompt knows the factors and window. */
82
+ requirement?: StepUpRequirement;
83
+ /** Wrong credentials allowed before the last error is thrown. Default 3. */
84
+ maxAttempts?: number;
85
+ }
86
+ /**
87
+ * Re-authenticate for `action`: ask `prompt` for a credential, send it to
88
+ * `POST /v1/client/me/step_up`, and resolve once the server accepts it. A wrong
89
+ * credential asks again (up to `maxAttempts`). Throws {@link StepUpCancelledError}
90
+ * when the prompt returns null.
91
+ */
92
+ export declare function requireStepUp(action: string, opts: RequireStepUpOptions): Promise<StepUpResult>;
93
+ /**
94
+ * Run `call`; if the server refuses it with STEP_UP_REQUIRED, re-authenticate
95
+ * with {@link requireStepUp} (using the refusal's own factors and window) and
96
+ * run it once more. Any other outcome is returned as is.
97
+ */
98
+ export declare function retryWithStepUp<T>(call: () => Promise<FapiResponse<T>>, opts: Omit<RequireStepUpOptions, 'requirement'>): Promise<FapiResponse<T>>;
package/dist/step-up.js CHANGED
@@ -1,8 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StepUpCancelledError = void 0;
3
4
  exports.stepUp = stepUp;
4
5
  exports.sendStepUpEmailCode = sendStepUpEmailCode;
5
6
  exports.authenticatedWithin = authenticatedWithin;
7
+ exports.stepUpRequirement = stepUpRequirement;
8
+ exports.requireStepUp = requireStepUp;
9
+ exports.retryWithStepUp = retryWithStepUp;
6
10
  /** Prove a credential of the current session again. A wrong credential is a 401. */
7
11
  function stepUp(client, input) {
8
12
  return client.post('/v1/client/me/step_up', input);
@@ -21,4 +25,60 @@ function authenticatedWithin(claims, maxAgeSeconds, nowMs = Date.now()) {
21
25
  return false;
22
26
  return nowMs / 1000 - at <= maxAgeSeconds;
23
27
  }
28
+ const DEFAULT_FACTORS = ['password', 'passkey', 'totp', 'backup_code', 'email_code'];
29
+ /** The step-up a refusal asks for, or null when `errors` holds no STEP_UP_REQUIRED. */
30
+ function stepUpRequirement(errors) {
31
+ const error = errors.find((e) => e.code === 'STEP_UP_REQUIRED');
32
+ if (!error)
33
+ return null;
34
+ const meta = error.meta ?? {};
35
+ const factors = Array.isArray(meta.accepted_factors) ? meta.accepted_factors.filter((f) => typeof f === 'string') : [];
36
+ return {
37
+ action: typeof meta.action === 'string' ? meta.action : null,
38
+ acceptedFactors: factors.length ? factors : [...DEFAULT_FACTORS],
39
+ maxAgeSeconds: typeof meta.max_age_seconds === 'number' ? meta.max_age_seconds : null,
40
+ };
41
+ }
42
+ /** Thrown by {@link requireStepUp} when the prompt gives up (returns null). */
43
+ class StepUpCancelledError extends Error {
44
+ code = 'STEP_UP_CANCELLED';
45
+ constructor() {
46
+ super('The re-authentication was cancelled.');
47
+ this.name = 'StepUpCancelledError';
48
+ }
49
+ }
50
+ exports.StepUpCancelledError = StepUpCancelledError;
51
+ /**
52
+ * Re-authenticate for `action`: ask `prompt` for a credential, send it to
53
+ * `POST /v1/client/me/step_up`, and resolve once the server accepts it. A wrong
54
+ * credential asks again (up to `maxAttempts`). Throws {@link StepUpCancelledError}
55
+ * when the prompt returns null.
56
+ */
57
+ async function requireStepUp(action, opts) {
58
+ const base = opts.requirement ?? { action, acceptedFactors: [...DEFAULT_FACTORS], maxAgeSeconds: null };
59
+ let error = null;
60
+ for (let attempt = 0; attempt < (opts.maxAttempts ?? 3); attempt++) {
61
+ const input = await opts.prompt({ ...base, action: base.action ?? action, error, sendEmailCode: () => sendStepUpEmailCode(opts.client) });
62
+ if (!input)
63
+ throw new StepUpCancelledError();
64
+ const res = await stepUp(opts.client, input);
65
+ if (res.ok && res.data)
66
+ return res.data;
67
+ error = res.errors[0] ?? { code: 'UNAUTHENTICATED', message: 'Re-authentication failed.' };
68
+ }
69
+ throw Object.assign(new Error(error?.message ?? 'Re-authentication failed.'), { code: error?.code, reason: error?.reason });
70
+ }
71
+ /**
72
+ * Run `call`; if the server refuses it with STEP_UP_REQUIRED, re-authenticate
73
+ * with {@link requireStepUp} (using the refusal's own factors and window) and
74
+ * run it once more. Any other outcome is returned as is.
75
+ */
76
+ async function retryWithStepUp(call, opts) {
77
+ const first = await call();
78
+ const requirement = first.ok ? null : stepUpRequirement(first.errors);
79
+ if (!requirement)
80
+ return first;
81
+ await requireStepUp(requirement.action ?? 'sensitive_action', { ...opts, requirement });
82
+ return call();
83
+ }
24
84
  //# sourceMappingURL=step-up.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"step-up.js","sourceRoot":"","sources":["../src/step-up.ts"],"names":[],"mappings":";;AA0CA,wBAEC;AAGD,kDAEC;AAMD,kDAIC;AAlBD,oFAAoF;AACpF,SAAgB,MAAM,CAAC,MAAkB,EAAE,KAAkB;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAe,uBAAuB,EAAE,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,qHAAqH;AACrH,SAAgB,mBAAmB,CAAC,MAAkB;IACpD,OAAO,MAAM,CAAC,IAAI,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAgB,mBAAmB,CAAC,MAA+B,EAAE,aAAqB,EAAE,QAAgB,IAAI,CAAC,GAAG,EAAE;IACpH,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;IAC5B,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IACjE,OAAO,KAAK,GAAG,IAAI,GAAG,EAAE,IAAI,aAAa,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"step-up.js","sourceRoot":"","sources":["../src/step-up.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -4,4 +4,4 @@
4
4
  * package.json at runtime) so the bundle stays dependency-free and tests stay
5
5
  * deterministic; `version.test.ts` fails when it drifts from package.json.
6
6
  */
7
- export declare const ATLAS_JS_VERSION = "0.36.0";
7
+ export declare const ATLAS_JS_VERSION = "0.38.0";
package/dist/version.js CHANGED
@@ -7,5 +7,5 @@ exports.ATLAS_JS_VERSION = void 0;
7
7
  * package.json at runtime) so the bundle stays dependency-free and tests stay
8
8
  * deterministic; `version.test.ts` fails when it drifts from package.json.
9
9
  */
10
- exports.ATLAS_JS_VERSION = '0.36.0';
10
+ exports.ATLAS_JS_VERSION = '0.38.0';
11
11
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlasauth/js",
3
- "version": "0.36.0",
3
+ "version": "0.38.0",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "exports": {