@atlasauth/js 0.23.1 → 0.25.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.
- package/CHANGELOG.md +13 -1
- package/dist/app-launcher.d.ts +11 -0
- package/dist/app-launcher.js +12 -0
- package/dist/app-launcher.js.map +1 -0
- package/dist/attempt.d.ts +52 -1
- package/dist/attempt.js +2 -0
- package/dist/attempt.js.map +1 -1
- package/dist/attestation.d.ts +52 -0
- package/dist/attestation.js +48 -0
- package/dist/attestation.js.map +1 -0
- package/dist/authorized-apps.d.ts +42 -0
- package/dist/authorized-apps.js +41 -0
- package/dist/authorized-apps.js.map +1 -0
- package/dist/compat.d.ts +1 -0
- package/dist/compat.js +5 -1
- package/dist/compat.js.map +1 -1
- package/dist/connect.d.ts +6 -0
- package/dist/connect.js +22 -0
- package/dist/connect.js.map +1 -1
- package/dist/connections.d.ts +161 -0
- package/dist/connections.js +117 -0
- package/dist/connections.js.map +1 -0
- package/dist/credentials.d.ts +47 -0
- package/dist/credentials.js +95 -0
- package/dist/credentials.js.map +1 -0
- package/dist/custom-challenge.d.ts +13 -0
- package/dist/custom-challenge.js +27 -0
- package/dist/custom-challenge.js.map +1 -0
- package/dist/delegated-ui.d.ts +93 -0
- package/dist/delegated-ui.js +62 -0
- package/dist/delegated-ui.js.map +1 -0
- package/dist/dev-browser.d.ts +9 -0
- package/dist/dev-browser.js +21 -1
- package/dist/dev-browser.js.map +1 -1
- package/dist/device-key.d.ts +65 -0
- package/dist/device-key.js +64 -0
- package/dist/device-key.js.map +1 -0
- package/dist/email-addresses.d.ts +24 -0
- package/dist/email-addresses.js +36 -0
- package/dist/email-addresses.js.map +1 -0
- package/dist/environment.d.ts +8 -0
- package/dist/environment.js +6 -0
- package/dist/environment.js.map +1 -1
- package/dist/external-passkeys.d.ts +34 -0
- package/dist/external-passkeys.js +31 -0
- package/dist/external-passkeys.js.map +1 -0
- package/dist/fapi.d.ts +36 -0
- package/dist/fapi.js +75 -4
- package/dist/fapi.js.map +1 -1
- package/dist/identity-verification.d.ts +40 -0
- package/dist/identity-verification.js +40 -0
- package/dist/identity-verification.js.map +1 -0
- package/dist/iga.d.ts +118 -0
- package/dist/iga.js +60 -0
- package/dist/iga.js.map +1 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +31 -1
- package/dist/index.js.map +1 -1
- package/dist/journey-redirect.d.ts +8 -0
- package/dist/journey-redirect.js +32 -0
- package/dist/journey-redirect.js.map +1 -0
- package/dist/marketing.d.ts +81 -0
- package/dist/marketing.js +162 -0
- package/dist/marketing.js.map +1 -0
- package/dist/mfa-enrollment.d.ts +2 -0
- package/dist/mfa-enrollment.js +1 -0
- package/dist/mfa-enrollment.js.map +1 -1
- package/dist/mfa-factors.d.ts +109 -0
- package/dist/mfa-factors.js +98 -0
- package/dist/mfa-factors.js.map +1 -0
- package/dist/migration-browser-sessions.d.ts +118 -0
- package/dist/migration-browser-sessions.js +404 -0
- package/dist/migration-browser-sessions.js.map +1 -0
- package/dist/organization-admin.d.ts +192 -0
- package/dist/organization-admin.js +53 -0
- package/dist/organization-admin.js.map +1 -0
- package/dist/passkey.d.ts +71 -2
- package/dist/passkey.js +97 -0
- package/dist/passkey.js.map +1 -1
- package/dist/password-reset.d.ts +16 -1
- package/dist/password-reset.js +19 -4
- package/dist/password-reset.js.map +1 -1
- package/dist/pricing.d.ts +80 -0
- package/dist/pricing.js +71 -0
- package/dist/pricing.js.map +1 -0
- package/dist/profile.d.ts +73 -1
- package/dist/profile.js +23 -0
- package/dist/profile.js.map +1 -1
- package/dist/redirect.js +1 -1
- package/dist/redirect.js.map +1 -1
- package/dist/srp.d.ts +55 -0
- package/dist/srp.js +120 -0
- package/dist/srp.js.map +1 -0
- package/dist/telegram.d.ts +23 -0
- package/dist/telegram.js +8 -0
- package/dist/telegram.js.map +1 -1
- package/dist/uma.d.ts +86 -0
- package/dist/uma.js +73 -0
- package/dist/uma.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegated-ui.js","sourceRoot":"","sources":["../src/delegated-ui.ts"],"names":[],"mappings":"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"}
|
package/dist/dev-browser.d.ts
CHANGED
|
@@ -21,6 +21,15 @@
|
|
|
21
21
|
* The cookies are still set and sent where the browser allows them; the
|
|
22
22
|
* header is only read when there is no cookie.
|
|
23
23
|
*/
|
|
24
|
+
/**
|
|
25
|
+
* Where the dev-browser refresh token is kept: `local` (default, survives restarts and is shared
|
|
26
|
+
* by every tab), `session` (this tab only) or `memory` (this page load only, nothing written).
|
|
27
|
+
*/
|
|
28
|
+
export type PersistenceMode = 'local' | 'session' | 'memory';
|
|
29
|
+
/** Choose the storage for this page. The FAPI client calls it from its `persistence` option. */
|
|
30
|
+
export declare function setPersistence(next: PersistenceMode | undefined): void;
|
|
31
|
+
/** The storage in force (`local` unless set). Exposed for tests. */
|
|
32
|
+
export declare function getPersistence(): PersistenceMode;
|
|
24
33
|
/** Whether the dev browser applies: a development instance's key, in a browser with storage. */
|
|
25
34
|
export declare function devBrowserEnabled(publishableKey: string): boolean;
|
|
26
35
|
/** The stored refresh token for a development instance, or null. */
|
package/dist/dev-browser.js
CHANGED
|
@@ -23,6 +23,8 @@
|
|
|
23
23
|
* header is only read when there is no cookie.
|
|
24
24
|
*/
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.setPersistence = setPersistence;
|
|
27
|
+
exports.getPersistence = getPersistence;
|
|
26
28
|
exports.devBrowserEnabled = devBrowserEnabled;
|
|
27
29
|
exports.devBrowserToken = devBrowserToken;
|
|
28
30
|
exports.forgetDevBrowserToken = forgetDevBrowserToken;
|
|
@@ -32,9 +34,27 @@ const EXCHANGE = '/v1/client/tickets/exchange';
|
|
|
32
34
|
const BOOT = '/v1/client';
|
|
33
35
|
const REFRESH = /^\/v1\/client\/sessions\/[^/]+\/tokens$/;
|
|
34
36
|
const REVOKE = /^\/v1\/client\/sessions\/[^/]+\/revoke$/;
|
|
37
|
+
const memory = new Map();
|
|
38
|
+
const memoryStore = {
|
|
39
|
+
getItem: (k) => memory.get(k) ?? null,
|
|
40
|
+
setItem: (k, v) => void memory.set(k, v),
|
|
41
|
+
removeItem: (k) => void memory.delete(k),
|
|
42
|
+
};
|
|
43
|
+
let mode = 'local';
|
|
44
|
+
/** Choose the storage for this page. The FAPI client calls it from its `persistence` option. */
|
|
45
|
+
function setPersistence(next) {
|
|
46
|
+
mode = next ?? 'local';
|
|
47
|
+
}
|
|
48
|
+
/** The storage in force (`local` unless set). Exposed for tests. */
|
|
49
|
+
function getPersistence() {
|
|
50
|
+
return mode;
|
|
51
|
+
}
|
|
35
52
|
function storage() {
|
|
53
|
+
if (mode === 'memory')
|
|
54
|
+
return memoryStore;
|
|
36
55
|
try {
|
|
37
|
-
const
|
|
56
|
+
const g = globalThis;
|
|
57
|
+
const s = mode === 'session' ? g.sessionStorage : g.localStorage;
|
|
38
58
|
return s && typeof s.getItem === 'function' ? s : null;
|
|
39
59
|
}
|
|
40
60
|
catch {
|
package/dist/dev-browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-browser.js","sourceRoot":"","sources":["../src/dev-browser.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;
|
|
1
|
+
{"version":3,"file":"dev-browser.js","sourceRoot":"","sources":["../src/dev-browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Device-bound biometric sign-in — the client half.
|
|
3
|
+
*
|
|
4
|
+
* A native app keeps an ES256 keypair in the OS secure hardware (Secure Enclave
|
|
5
|
+
* / Android Keystore), unlocked by Face ID / fingerprint. The public half is
|
|
6
|
+
* registered once while signed in; later the app signs in by signing a server
|
|
7
|
+
* challenge with the private half. The keystore is the app's: it supplies a
|
|
8
|
+
* {@link DeviceKeySigner} (`createKey` + `sign` behind a biometric prompt).
|
|
9
|
+
* {@link webCryptoSigner} is a software signer for tests and web/RN-polyfill use.
|
|
10
|
+
*
|
|
11
|
+
* Server routes: POST /v1/client/me/device_keys/challenge → /device_keys,
|
|
12
|
+
* POST /v1/client/sign_ins/device_key/challenge → /finish.
|
|
13
|
+
*/
|
|
14
|
+
import type { FapiClient, FapiResponse } from './fapi';
|
|
15
|
+
export interface DeviceKeyJwk {
|
|
16
|
+
kty: 'EC';
|
|
17
|
+
crv: 'P-256';
|
|
18
|
+
x: string;
|
|
19
|
+
y: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DeviceKeySigner {
|
|
22
|
+
/** Creates the keypair and returns its public JWK. `biometric` asks for a key that needs the OS biometric prompt to use. */
|
|
23
|
+
createKey(opts: {
|
|
24
|
+
biometric: boolean;
|
|
25
|
+
}): Promise<DeviceKeyJwk>;
|
|
26
|
+
/** Signs the UTF-8 message with ES256, returning base64url IEEE-P1363 (r||s). Shows the biometric prompt for a biometric key. */
|
|
27
|
+
sign(message: string): Promise<string>;
|
|
28
|
+
}
|
|
29
|
+
export type DeviceKeyPurpose = 'register' | 'sign_in';
|
|
30
|
+
/** The exact string the device signs; mirrors the server so a signature is bound to its use, tenant and key. */
|
|
31
|
+
export declare function deviceKeyMessage(input: {
|
|
32
|
+
purpose: DeviceKeyPurpose;
|
|
33
|
+
instanceId: string;
|
|
34
|
+
keyId: string;
|
|
35
|
+
nonce: string;
|
|
36
|
+
}): string;
|
|
37
|
+
export interface RegisterDeviceKeyOptions {
|
|
38
|
+
client: FapiClient;
|
|
39
|
+
signer: DeviceKeySigner;
|
|
40
|
+
/** Your instance id (`ins_…`), as shown in the dashboard. */
|
|
41
|
+
instanceId: string;
|
|
42
|
+
label?: string;
|
|
43
|
+
platform?: 'ios' | 'android' | 'other';
|
|
44
|
+
/** Whether the key needs biometrics to use. Default true. */
|
|
45
|
+
biometric?: boolean;
|
|
46
|
+
}
|
|
47
|
+
/** Registers this device's key for the signed-in user (needs a recent re-authentication). Returns the `device_key` resource. */
|
|
48
|
+
export declare function registerDeviceKey(opts: RegisterDeviceKeyOptions): Promise<FapiResponse<{
|
|
49
|
+
id: string;
|
|
50
|
+
}>>;
|
|
51
|
+
export interface SignInWithDeviceKeyOptions {
|
|
52
|
+
client: FapiClient;
|
|
53
|
+
signer: DeviceKeySigner;
|
|
54
|
+
instanceId: string;
|
|
55
|
+
/** The `id` returned by {@link registerDeviceKey}, which the app stores. */
|
|
56
|
+
deviceKeyId: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Signs in with the registered device key. The response is the usual sign-in
|
|
60
|
+
* attempt: `complete` with a session, or `needs_second_factor` when the instance
|
|
61
|
+
* does not let a device key stand in for MFA.
|
|
62
|
+
*/
|
|
63
|
+
export declare function signInWithDeviceKey(opts: SignInWithDeviceKeyOptions): Promise<FapiResponse<Record<string, unknown>>>;
|
|
64
|
+
/** A software signer on WebCrypto — no hardware or biometric binding; for tests and prototypes. */
|
|
65
|
+
export declare function webCryptoSigner(subtle?: SubtleCrypto): DeviceKeySigner;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deviceKeyMessage = deviceKeyMessage;
|
|
4
|
+
exports.registerDeviceKey = registerDeviceKey;
|
|
5
|
+
exports.signInWithDeviceKey = signInWithDeviceKey;
|
|
6
|
+
exports.webCryptoSigner = webCryptoSigner;
|
|
7
|
+
/** The exact string the device signs; mirrors the server so a signature is bound to its use, tenant and key. */
|
|
8
|
+
function deviceKeyMessage(input) {
|
|
9
|
+
return `atlas-device-key:v1:${input.purpose}:${input.instanceId}:${input.keyId}:${input.nonce}`;
|
|
10
|
+
}
|
|
11
|
+
/** Registers this device's key for the signed-in user (needs a recent re-authentication). Returns the `device_key` resource. */
|
|
12
|
+
async function registerDeviceKey(opts) {
|
|
13
|
+
const { client, signer, instanceId } = opts;
|
|
14
|
+
const biometric = opts.biometric ?? true;
|
|
15
|
+
const challenge = await client.post('/v1/client/me/device_keys/challenge', {});
|
|
16
|
+
if (!challenge.ok || !challenge.data)
|
|
17
|
+
return challenge;
|
|
18
|
+
const jwk = await signer.createKey({ biometric });
|
|
19
|
+
// Proof of possession: the register message names the key by its x coordinate.
|
|
20
|
+
const signature = await signer.sign(deviceKeyMessage({ purpose: 'register', instanceId, keyId: jwk.x, nonce: challenge.data.nonce }));
|
|
21
|
+
return client.post('/v1/client/me/device_keys', {
|
|
22
|
+
nonce: challenge.data.nonce,
|
|
23
|
+
public_key: jwk,
|
|
24
|
+
signature,
|
|
25
|
+
biometric_bound: biometric,
|
|
26
|
+
...(opts.label ? { label: opts.label } : {}),
|
|
27
|
+
...(opts.platform ? { platform: opts.platform } : {}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Signs in with the registered device key. The response is the usual sign-in
|
|
32
|
+
* attempt: `complete` with a session, or `needs_second_factor` when the instance
|
|
33
|
+
* does not let a device key stand in for MFA.
|
|
34
|
+
*/
|
|
35
|
+
async function signInWithDeviceKey(opts) {
|
|
36
|
+
const { client, signer, instanceId, deviceKeyId } = opts;
|
|
37
|
+
const challenge = await client.post('/v1/client/sign_ins/device_key/challenge', { device_key_id: deviceKeyId });
|
|
38
|
+
if (!challenge.ok || !challenge.data)
|
|
39
|
+
return challenge;
|
|
40
|
+
const signature = await signer.sign(deviceKeyMessage({ purpose: 'sign_in', instanceId, keyId: deviceKeyId, nonce: challenge.data.nonce }));
|
|
41
|
+
return client.post('/v1/client/sign_ins/device_key/finish', {
|
|
42
|
+
device_key_id: deviceKeyId,
|
|
43
|
+
nonce: challenge.data.nonce,
|
|
44
|
+
signature,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const toB64u = (bytes) => btoa(String.fromCharCode(...new Uint8Array(bytes))).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
48
|
+
/** A software signer on WebCrypto — no hardware or biometric binding; for tests and prototypes. */
|
|
49
|
+
function webCryptoSigner(subtle = globalThis.crypto.subtle) {
|
|
50
|
+
let pair;
|
|
51
|
+
return {
|
|
52
|
+
async createKey() {
|
|
53
|
+
pair = await subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, false, ['sign', 'verify']);
|
|
54
|
+
const jwk = await subtle.exportKey('jwk', pair.publicKey);
|
|
55
|
+
return { kty: 'EC', crv: 'P-256', x: jwk.x, y: jwk.y };
|
|
56
|
+
},
|
|
57
|
+
async sign(message) {
|
|
58
|
+
if (!pair)
|
|
59
|
+
throw new Error('No device key has been created.');
|
|
60
|
+
return toB64u(await subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, pair.privateKey, new TextEncoder().encode(message)));
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=device-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-key.js","sourceRoot":"","sources":["../src/device-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { FapiClient } from './fapi';
|
|
2
|
+
/**
|
|
3
|
+
* Secure primary-email change. Making a different verified address primary
|
|
4
|
+
* answers `status: 'pending_old_address_confirmation'` when the instance sets
|
|
5
|
+
* `accountUx.emailChange.requireOldAddressConfirm`: a code was mailed to the
|
|
6
|
+
* current primary address, and {@link confirmPrimaryEmailAddress} finishes the switch.
|
|
7
|
+
*/
|
|
8
|
+
export interface PrimaryEmailResult {
|
|
9
|
+
object: 'email_address';
|
|
10
|
+
id: string;
|
|
11
|
+
primary: boolean;
|
|
12
|
+
status?: 'pending_old_address_confirmation';
|
|
13
|
+
/** Masked current primary address that received the code. */
|
|
14
|
+
old_address?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare class EmailAddressRequestError extends Error {
|
|
17
|
+
readonly status: number;
|
|
18
|
+
readonly code: string;
|
|
19
|
+
constructor(status: number, code: string, message: string);
|
|
20
|
+
}
|
|
21
|
+
/** Make a verified address primary. Check `result.status` for a pending old-address confirmation. */
|
|
22
|
+
export declare function setPrimaryEmailAddress(client: FapiClient, id: string): Promise<PrimaryEmailResult>;
|
|
23
|
+
/** Finish a pending switch with the code mailed to the old primary address. */
|
|
24
|
+
export declare function confirmPrimaryEmailAddress(client: FapiClient, id: string, code: string): Promise<PrimaryEmailResult>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EmailAddressRequestError = void 0;
|
|
4
|
+
exports.setPrimaryEmailAddress = setPrimaryEmailAddress;
|
|
5
|
+
exports.confirmPrimaryEmailAddress = confirmPrimaryEmailAddress;
|
|
6
|
+
class EmailAddressRequestError extends Error {
|
|
7
|
+
status;
|
|
8
|
+
code;
|
|
9
|
+
constructor(status, code, message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.status = status;
|
|
12
|
+
this.code = code;
|
|
13
|
+
this.name = 'EmailAddressRequestError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.EmailAddressRequestError = EmailAddressRequestError;
|
|
17
|
+
async function call(client, id, action, body) {
|
|
18
|
+
const res = await client.request(`/v1/client/me/email_addresses/${encodeURIComponent(id)}/${action}`, {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
21
|
+
});
|
|
22
|
+
if (!res.ok || !res.data) {
|
|
23
|
+
const first = res.errors[0];
|
|
24
|
+
throw new EmailAddressRequestError(res.status, first?.code ?? 'UNKNOWN', first?.message ?? 'The request failed.');
|
|
25
|
+
}
|
|
26
|
+
return res.data;
|
|
27
|
+
}
|
|
28
|
+
/** Make a verified address primary. Check `result.status` for a pending old-address confirmation. */
|
|
29
|
+
function setPrimaryEmailAddress(client, id) {
|
|
30
|
+
return call(client, id, 'primary');
|
|
31
|
+
}
|
|
32
|
+
/** Finish a pending switch with the code mailed to the old primary address. */
|
|
33
|
+
function confirmPrimaryEmailAddress(client, id, code) {
|
|
34
|
+
return call(client, id, 'confirm_primary', { code });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=email-addresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-addresses.js","sourceRoot":"","sources":["../src/email-addresses.ts"],"names":[],"mappings":";;;AAqCA,wDAEC;AAGD,gEAEC;AA3BD,MAAa,wBAAyB,SAAQ,KAAK;IAC5B;IAAyB;IAA9C,YAAqB,MAAc,EAAW,IAAY,EAAE,OAAe;QACzE,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,WAAM,GAAN,MAAM,CAAQ;QAAW,SAAI,GAAJ,IAAI,CAAQ;QAExD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AALD,4DAKC;AAED,KAAK,UAAU,IAAI,CAAC,MAAkB,EAAE,EAAU,EAAE,MAAc,EAAE,IAAc;IAChF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,OAAO,CAAqB,iCAAiC,kBAAkB,CAAC,EAAE,CAAC,IAAI,MAAM,EAAE,EAAE;QACxH,MAAM,EAAE,MAAM;QACd,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;KAC9D,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,SAAS,EAAE,KAAK,EAAE,OAAO,IAAI,qBAAqB,CAAC,CAAC;IACpH,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,qGAAqG;AACrG,SAAgB,sBAAsB,CAAC,MAAkB,EAAE,EAAU;IACnE,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,+EAA+E;AAC/E,SAAgB,0BAA0B,CAAC,MAAkB,EAAE,EAAU,EAAE,IAAY;IACrF,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/environment.d.ts
CHANGED
|
@@ -61,6 +61,8 @@ export interface AccountUx {
|
|
|
61
61
|
passwordReset: EmailProofDelivery;
|
|
62
62
|
/** The second-factor step may offer "email me a code" ({@link prepareEmailSecondFactor}). */
|
|
63
63
|
emailSecondFactor: boolean;
|
|
64
|
+
/** The instance offers the custom challenge second factor (set only when true). */
|
|
65
|
+
customSecondFactor?: boolean;
|
|
64
66
|
/**
|
|
65
67
|
* Passkey-only sign-up ({@link startPasskeySignUp}), when the instance offers
|
|
66
68
|
* it: whether the form collects an email address. Null when not offered.
|
|
@@ -79,6 +81,12 @@ export interface AccountUx {
|
|
|
79
81
|
totp: boolean;
|
|
80
82
|
sms: boolean;
|
|
81
83
|
totpCodes: 1 | 2;
|
|
84
|
+
/** Counter tokens, YubiKeys, Duo, recovery questions and smart card sign-in. False/absent from an older server. */
|
|
85
|
+
hotp?: boolean;
|
|
86
|
+
yubikey?: boolean;
|
|
87
|
+
duo?: boolean;
|
|
88
|
+
securityQuestions?: boolean;
|
|
89
|
+
smartCard?: boolean;
|
|
82
90
|
};
|
|
83
91
|
}
|
|
84
92
|
/**
|
package/dist/environment.js
CHANGED
|
@@ -81,12 +81,18 @@ function accountUxFrom(body) {
|
|
|
81
81
|
emailVerification: proof(raw.email_verification),
|
|
82
82
|
passwordReset: proof(raw.password_reset),
|
|
83
83
|
emailSecondFactor: raw.email_second_factor === true,
|
|
84
|
+
...(raw.custom_second_factor === true ? { customSecondFactor: true } : {}),
|
|
84
85
|
...(isRecord(raw.mfa)
|
|
85
86
|
? {
|
|
86
87
|
mfa: {
|
|
87
88
|
totp: raw.mfa.totp !== false,
|
|
88
89
|
sms: raw.mfa.sms === true,
|
|
89
90
|
totpCodes: Number(raw.mfa.totp_codes ?? raw.mfa.totpCodes) >= 2 ? 2 : 1,
|
|
91
|
+
...(raw.mfa.hotp === true ? { hotp: true } : {}),
|
|
92
|
+
...(raw.mfa.yubikey === true ? { yubikey: true } : {}),
|
|
93
|
+
...(raw.mfa.duo === true ? { duo: true } : {}),
|
|
94
|
+
...(raw.mfa.security_questions === true ? { securityQuestions: true } : {}),
|
|
95
|
+
...(raw.mfa.smart_card === true ? { smartCard: true } : {}),
|
|
90
96
|
},
|
|
91
97
|
}
|
|
92
98
|
: {}),
|
package/dist/environment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":";;;AAiDA,8CAWC;AAQD,kDAMC;
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type WebAuthnHost } from './passkey';
|
|
2
|
+
/**
|
|
3
|
+
* Passkeys for a user store you own (the Atlas Passkey API). The browser never
|
|
4
|
+
* talks to Atlas: it talks to YOUR backend, which knows who is signed in and
|
|
5
|
+
* calls the Passkey API with a secret key (`atlas.passkeyApi` in @atlasauth/backend).
|
|
6
|
+
*
|
|
7
|
+
* Contract of your four endpoints (all POST, JSON):
|
|
8
|
+
* - registrationInit -> `{ options }` (your backend passes the signed-in user's id)
|
|
9
|
+
* - registrationFinalize <- `{ challenge, attestation_object, client_data_json, name?, transports? }`
|
|
10
|
+
* - loginInit -> `{ handle, options }`
|
|
11
|
+
* - loginFinalize <- `{ handle, challenge, credential_id, authenticator_data, client_data_json, signature }`
|
|
12
|
+
* -> anything your backend answers once it has started its own session
|
|
13
|
+
*/
|
|
14
|
+
export interface ExternalPasskeyEndpoints {
|
|
15
|
+
registrationInit: string;
|
|
16
|
+
registrationFinalize: string;
|
|
17
|
+
loginInit: string;
|
|
18
|
+
loginFinalize: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ExternalPasskeyOptions {
|
|
21
|
+
endpoints: ExternalPasskeyEndpoints;
|
|
22
|
+
fetch?: typeof fetch;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
host?: WebAuthnHost;
|
|
25
|
+
}
|
|
26
|
+
/** Register a passkey for the user your backend has signed in. */
|
|
27
|
+
export declare function registerExternalPasskey(o: ExternalPasskeyOptions, input?: {
|
|
28
|
+
name?: string;
|
|
29
|
+
}): Promise<unknown>;
|
|
30
|
+
/** Sign in with a passkey. `userId` (optional) is sent to your backend to narrow to one user's credentials. */
|
|
31
|
+
export declare function loginWithExternalPasskey(o: ExternalPasskeyOptions, input?: {
|
|
32
|
+
mediation?: 'optional' | 'conditional';
|
|
33
|
+
signal?: AbortSignal;
|
|
34
|
+
}): Promise<unknown>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerExternalPasskey = registerExternalPasskey;
|
|
4
|
+
exports.loginWithExternalPasskey = loginWithExternalPasskey;
|
|
5
|
+
const passkey_1 = require("./passkey");
|
|
6
|
+
async function post(o, url, body) {
|
|
7
|
+
const f = o.fetch ?? ((...a) => fetch(...a));
|
|
8
|
+
const res = await f(url, {
|
|
9
|
+
method: 'POST',
|
|
10
|
+
credentials: 'same-origin',
|
|
11
|
+
headers: { 'content-type': 'application/json', ...o.headers },
|
|
12
|
+
body: JSON.stringify(body),
|
|
13
|
+
});
|
|
14
|
+
const json = (await res.json().catch(() => ({})));
|
|
15
|
+
if (!res.ok)
|
|
16
|
+
throw new Error(json.error?.message ?? json.message ?? `Request failed (${res.status}).`);
|
|
17
|
+
return json;
|
|
18
|
+
}
|
|
19
|
+
/** Register a passkey for the user your backend has signed in. */
|
|
20
|
+
async function registerExternalPasskey(o, input = {}) {
|
|
21
|
+
const init = await post(o, o.endpoints.registrationInit, {});
|
|
22
|
+
const created = await (0, passkey_1.createPasskey)(init.options, { name: input.name, host: o.host });
|
|
23
|
+
return post(o, o.endpoints.registrationFinalize, created);
|
|
24
|
+
}
|
|
25
|
+
/** Sign in with a passkey. `userId` (optional) is sent to your backend to narrow to one user's credentials. */
|
|
26
|
+
async function loginWithExternalPasskey(o, input = {}) {
|
|
27
|
+
const init = await post(o, o.endpoints.loginInit, {});
|
|
28
|
+
const assertion = await (0, passkey_1.getPasskeyAssertion)({ ...init.options, handle: init.handle }, { host: o.host, mediation: input.mediation, signal: input.signal });
|
|
29
|
+
return post(o, o.endpoints.loginFinalize, assertion);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=external-passkeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"external-passkeys.js","sourceRoot":"","sources":["../src/external-passkeys.ts"],"names":[],"mappings":";;AA0CA,0DAIC;AAGD,4DAIC;AArDD,uCAAkF;AA4BlF,KAAK,UAAU,IAAI,CAAI,CAAyB,EAAE,GAAW,EAAE,IAAa;IAC1E,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAA2B,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE;QACvB,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE;QAC7D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA2D,CAAC;IAC5G,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,mBAAmB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;IACvG,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAC3D,KAAK,UAAU,uBAAuB,CAAC,CAAyB,EAAE,QAA2B,EAAE;IACpG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAuC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,MAAM,IAAA,uBAAa,EAAC,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,+GAA+G;AACxG,KAAK,UAAU,wBAAwB,CAAC,CAAyB,EAAE,QAA0E,EAAE;IACpJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAuD,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5G,MAAM,SAAS,GAAG,MAAM,IAAA,6BAAmB,EAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1J,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC"}
|
package/dist/fapi.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { type PolicyAcceptance } from './policies';
|
|
2
2
|
import { type AttemptView, type FieldError } from './attempt';
|
|
3
3
|
import { type AtlasSdkInfo } from './sdk-advisory';
|
|
4
|
+
import { type PersistenceMode } from './dev-browser';
|
|
4
5
|
import { type ReferralCaptureOptions, type ReferralConsent, type ReferralSourceReader } from './referral';
|
|
6
|
+
import { type AttestationProvider } from './attestation';
|
|
5
7
|
/**
|
|
6
8
|
* The FAPI client and the sign-in flow driver.
|
|
7
9
|
*
|
|
@@ -21,6 +23,13 @@ export interface FapiClientOptions {
|
|
|
21
23
|
/** The instance's FAPI origin. Empty for same-origin. */
|
|
22
24
|
baseUrl?: string;
|
|
23
25
|
fetchImpl?: typeof fetch;
|
|
26
|
+
/**
|
|
27
|
+
* Where the browser keeps the development-instance session token: `'local'`
|
|
28
|
+
* (default; survives restarts, shared by tabs), `'session'` (this tab only) or
|
|
29
|
+
* `'memory'` (this page load only; nothing is written). Production sessions
|
|
30
|
+
* live in cookies and are not affected.
|
|
31
|
+
*/
|
|
32
|
+
persistence?: PersistenceMode;
|
|
24
33
|
/**
|
|
25
34
|
* The app's UI language as a BCP-47 tag (`"es"`, `"pt-BR"`). When set, every
|
|
26
35
|
* request carries it as `Accept-Language`, so the server writes its error
|
|
@@ -43,6 +52,12 @@ export interface FapiClientOptions {
|
|
|
43
52
|
* has referrals on. `false` turns that off. See `./referral`.
|
|
44
53
|
*/
|
|
45
54
|
referral?: false | 'auto';
|
|
55
|
+
/**
|
|
56
|
+
* App and device attestation for native apps (Apple App Attest / Play
|
|
57
|
+
* Integrity). When set, sign-up, sign-in and SMS-send calls carry the
|
|
58
|
+
* `Atlas-Attestation` proof. See `./attestation`.
|
|
59
|
+
*/
|
|
60
|
+
attestation?: AttestationProvider;
|
|
46
61
|
/**
|
|
47
62
|
* The app's own consent decision for referral tracking (click and anonymous
|
|
48
63
|
* ids): `'granted'` / `'denied'`, a boolean, or a function returning one.
|
|
@@ -324,3 +339,24 @@ export declare function pollAttempt(client: FapiClient, state: FlowState): Promi
|
|
|
324
339
|
}>;
|
|
325
340
|
/** Whether polling should continue, so a tab does not poll a dead attempt forever. */
|
|
326
341
|
export declare function shouldKeepPolling(state: FlowState): boolean;
|
|
342
|
+
/**
|
|
343
|
+
* Finish a required action the sign-in is held on (`needs_required_action`):
|
|
344
|
+
* `update_password` takes `password`; `update_profile` takes `first_name` /
|
|
345
|
+
* `last_name`; `verify_email` takes `step: 'send'` (mails a code), then
|
|
346
|
+
* `step: 'verify'` with `code`. Uses the flow's one-time token (or poll secret).
|
|
347
|
+
* Returns the next flow state: `complete` with a `ticket`, still held on
|
|
348
|
+
* another action, or the next step the server demands.
|
|
349
|
+
*/
|
|
350
|
+
export declare function completeRequiredAction(client: FapiClient, state: FlowState, input: {
|
|
351
|
+
action?: string;
|
|
352
|
+
password?: string;
|
|
353
|
+
first_name?: string;
|
|
354
|
+
last_name?: string;
|
|
355
|
+
username?: string;
|
|
356
|
+
step?: 'send' | 'verify';
|
|
357
|
+
code?: string;
|
|
358
|
+
/** `complete_profile`: values by field key. */
|
|
359
|
+
fields?: Record<string, string>;
|
|
360
|
+
/** `complete_profile`: ask again later (optional fields only). */
|
|
361
|
+
skip?: boolean;
|
|
362
|
+
}): Promise<FlowState>;
|