@atlasauth/js 0.16.0 → 0.18.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 +19 -0
- package/dist/better-auth-bridge.d.ts +62 -0
- package/dist/better-auth-bridge.js +83 -0
- package/dist/better-auth-bridge.js.map +1 -0
- package/dist/captcha-controller.js +1 -1
- package/dist/captcha-controller.js.map +1 -1
- package/dist/captcha-widget.d.ts +20 -2
- package/dist/captcha-widget.js +79 -4
- package/dist/captcha-widget.js.map +1 -1
- package/dist/captcha.d.ts +5 -0
- package/dist/captcha.js +30 -0
- package/dist/captcha.js.map +1 -1
- package/dist/compat.d.ts +149 -0
- package/dist/compat.js +363 -0
- package/dist/compat.js.map +1 -0
- package/dist/device-authorization.d.ts +70 -0
- package/dist/device-authorization.js +97 -0
- package/dist/device-authorization.js.map +1 -0
- package/dist/email-code-check.d.ts +60 -0
- package/dist/email-code-check.js +51 -0
- package/dist/email-code-check.js.map +1 -0
- package/dist/frontchannel-logout.d.ts +36 -0
- package/dist/frontchannel-logout.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/passkey-sign-up.d.ts +2 -2
- package/dist/passkey-sign-up.js +7 -1
- package/dist/passkey-sign-up.js.map +1 -1
- package/dist/passkey.d.ts +58 -2
- package/dist/passkey.js +61 -0
- package/dist/passkey.js.map +1 -1
- package/dist/sign-out-guard.d.ts +7 -0
- package/dist/sign-out-guard.js +38 -4
- package/dist/sign-out-guard.js.map +1 -1
- package/dist/sign-out.d.ts +23 -0
- package/dist/sign-out.js +37 -2
- package/dist/sign-out.js.map +1 -1
- package/dist/upstream-logout.d.ts +26 -0
- package/dist/upstream-logout.js +60 -0
- package/dist/upstream-logout.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeviceAuthorizationError = void 0;
|
|
4
|
+
exports.formatUserCode = formatUserCode;
|
|
5
|
+
exports.userCodeFromUrl = userCodeFromUrl;
|
|
6
|
+
exports.lookupDeviceAuthorization = lookupDeviceAuthorization;
|
|
7
|
+
exports.approveDeviceAuthorization = approveDeviceAuthorization;
|
|
8
|
+
exports.denyDeviceAuthorization = denyDeviceAuthorization;
|
|
9
|
+
/** A refused request. `code` is the server's stable error code (`NOT_FOUND`, `RATE_LIMITED`, `STEP_UP_REQUIRED`, …). */
|
|
10
|
+
class DeviceAuthorizationError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
status;
|
|
13
|
+
param;
|
|
14
|
+
reason;
|
|
15
|
+
meta;
|
|
16
|
+
constructor(status, code, message, param, reason, meta) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = 'DeviceAuthorizationError';
|
|
19
|
+
this.status = status;
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.param = param;
|
|
22
|
+
if (reason)
|
|
23
|
+
this.reason = reason;
|
|
24
|
+
if (meta)
|
|
25
|
+
this.meta = meta;
|
|
26
|
+
}
|
|
27
|
+
/** True when approving needs a fresh re-authentication first. */
|
|
28
|
+
get needsReverification() {
|
|
29
|
+
return this.code === 'STEP_UP_REQUIRED';
|
|
30
|
+
}
|
|
31
|
+
/** True when the code is unknown, expired or already used. */
|
|
32
|
+
get isInvalidCode() {
|
|
33
|
+
return this.status === 404 || this.status === 409;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.DeviceAuthorizationError = DeviceAuthorizationError;
|
|
37
|
+
const BASE = '/v1/client/me/device_authorizations';
|
|
38
|
+
function fromWire(w) {
|
|
39
|
+
return {
|
|
40
|
+
object: 'device_authorization',
|
|
41
|
+
id: w.id,
|
|
42
|
+
userCode: w.user_code,
|
|
43
|
+
status: w.status,
|
|
44
|
+
client: {
|
|
45
|
+
clientId: w.client.client_id,
|
|
46
|
+
name: w.client.name,
|
|
47
|
+
logoUrl: w.client.logo_url ?? null,
|
|
48
|
+
homepageUrl: w.client.homepage_url ?? null,
|
|
49
|
+
firstParty: w.client.first_party === true,
|
|
50
|
+
},
|
|
51
|
+
scopes: w.scopes ?? [],
|
|
52
|
+
audience: w.audience ?? null,
|
|
53
|
+
requiresStepUp: w.requires_step_up === true,
|
|
54
|
+
createdAt: w.created_at,
|
|
55
|
+
expiresAt: w.expires_at,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
async function call(client, path, body) {
|
|
59
|
+
const res = await client.request(path, { method: 'POST', body: JSON.stringify(body) });
|
|
60
|
+
if (!res.ok || !res.data) {
|
|
61
|
+
const first = res.errors[0];
|
|
62
|
+
throw new DeviceAuthorizationError(res.status, first?.code ?? 'UNKNOWN', first?.message ?? 'The request failed.', first?.param, first?.reason, first?.meta);
|
|
63
|
+
}
|
|
64
|
+
return fromWire(res.data);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Normalise what a person typed into the `XXXX-XXXX` form devices show:
|
|
68
|
+
* uppercase, spaces and dashes ignored. Returns the input unchanged when it is
|
|
69
|
+
* not 8 letters or digits, so the server answers "not valid".
|
|
70
|
+
*/
|
|
71
|
+
function formatUserCode(input) {
|
|
72
|
+
const cleaned = input.toUpperCase().replace(/[^A-Z0-9]/g, '');
|
|
73
|
+
return cleaned.length === 8 ? `${cleaned.slice(0, 4)}-${cleaned.slice(4)}` : input.trim();
|
|
74
|
+
}
|
|
75
|
+
/** Read a `user_code` from a verification URL the device displayed (`?user_code=`), if any. */
|
|
76
|
+
function userCodeFromUrl(url) {
|
|
77
|
+
try {
|
|
78
|
+
const value = new URL(String(url)).searchParams.get('user_code');
|
|
79
|
+
return value ? formatUserCode(value) : null;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Look up a pending device sign-in by the code the device shows. */
|
|
86
|
+
async function lookupDeviceAuthorization(client, userCode) {
|
|
87
|
+
return call(client, `${BASE}/lookup`, { user_code: formatUserCode(userCode) });
|
|
88
|
+
}
|
|
89
|
+
/** Approve the device sign-in for the signed-in user. The device's next poll receives its tokens. */
|
|
90
|
+
async function approveDeviceAuthorization(client, authorization) {
|
|
91
|
+
return call(client, `${BASE}/${encodeURIComponent(authorization.id)}/approve`, { user_code: authorization.userCode });
|
|
92
|
+
}
|
|
93
|
+
/** Deny the device sign-in. The device's next poll is told `access_denied`. */
|
|
94
|
+
async function denyDeviceAuthorization(client, authorization) {
|
|
95
|
+
return call(client, `${BASE}/${encodeURIComponent(authorization.id)}/deny`, { user_code: authorization.userCode });
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=device-authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-authorization.js","sourceRoot":"","sources":["../src/device-authorization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check an emailed one-time code WITHOUT using it up.
|
|
3
|
+
*
|
|
4
|
+
* Every email-code step has a `check` endpoint beside its `attempt` endpoint:
|
|
5
|
+
* the server answers whether the code is right and still live (and until when),
|
|
6
|
+
* and leaves it redeemable, so a form can show "code accepted" as the user
|
|
7
|
+
* types and only submit the step when they confirm. A wrong code spends one of
|
|
8
|
+
* the code's attempts exactly like a submission — checking is no way around the
|
|
9
|
+
* lockout — and the check endpoints share the credential-verify rate budget.
|
|
10
|
+
*
|
|
11
|
+
* sign-in first factor POST /v1/client/sign_ins/:id/check_first_factor
|
|
12
|
+
* sign-in second factor POST /v1/client/sign_ins/:id/check_second_factor
|
|
13
|
+
* sign-up verification POST /v1/client/sign_ups/:id/check_verification
|
|
14
|
+
* step-up POST /v1/client/me/step_up/check
|
|
15
|
+
* add-email verification POST /v1/client/me/email_addresses/:id/check_verification
|
|
16
|
+
*/
|
|
17
|
+
import type { FapiClient, FapiResponse } from './fapi';
|
|
18
|
+
import { type AttemptView } from './attempt';
|
|
19
|
+
/** A right, live code. */
|
|
20
|
+
export interface EmailCodeCheck {
|
|
21
|
+
object: 'email_code_check';
|
|
22
|
+
valid: true;
|
|
23
|
+
/** When the code stops working (ISO 8601). */
|
|
24
|
+
expires_at: string;
|
|
25
|
+
/** Wrong entries left before the code is locked. */
|
|
26
|
+
attempts_remaining: number;
|
|
27
|
+
}
|
|
28
|
+
/** Where the code being checked belongs. */
|
|
29
|
+
export type EmailCodeTarget = {
|
|
30
|
+
kind: 'sign_in_first_factor';
|
|
31
|
+
attemptId: string;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'sign_in_second_factor';
|
|
34
|
+
attemptId: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'sign_up_verification';
|
|
37
|
+
attemptId: string;
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'step_up';
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'email_address';
|
|
42
|
+
emailAddressId: string;
|
|
43
|
+
};
|
|
44
|
+
/** The check endpoint and body for a target. */
|
|
45
|
+
export declare function emailCodeCheckRequest(target: EmailCodeTarget, code: string): {
|
|
46
|
+
path: string;
|
|
47
|
+
body: Record<string, unknown>;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Check a code. `ok` with `data` for a right, live code; otherwise the server's
|
|
51
|
+
* errors — `VERIFICATION_FAILED` (wrong, expired or unknown) or
|
|
52
|
+
* `TOO_MANY_ATTEMPTS` (the code is locked; request a new one).
|
|
53
|
+
*/
|
|
54
|
+
export declare function checkEmailCode(client: FapiClient, target: EmailCodeTarget, code: string): Promise<FapiResponse<EmailCodeCheck>>;
|
|
55
|
+
/**
|
|
56
|
+
* The check target for the code step a flow is on, or null when the current
|
|
57
|
+
* step takes no emailed code. An emailed code on the first-factor step, the
|
|
58
|
+
* email second factor, and sign-up verification are covered.
|
|
59
|
+
*/
|
|
60
|
+
export declare function emailCodeTargetForAttempt(attempt: AttemptView | null | undefined): EmailCodeTarget | null;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.emailCodeCheckRequest = emailCodeCheckRequest;
|
|
4
|
+
exports.checkEmailCode = checkEmailCode;
|
|
5
|
+
exports.emailCodeTargetForAttempt = emailCodeTargetForAttempt;
|
|
6
|
+
const attempt_1 = require("./attempt");
|
|
7
|
+
/** The check endpoint and body for a target. */
|
|
8
|
+
function emailCodeCheckRequest(target, code) {
|
|
9
|
+
const id = (v) => encodeURIComponent(v);
|
|
10
|
+
switch (target.kind) {
|
|
11
|
+
case 'sign_in_first_factor':
|
|
12
|
+
return { path: `/v1/client/sign_ins/${id(target.attemptId)}/check_first_factor`, body: { strategy: 'email_code', code } };
|
|
13
|
+
case 'sign_in_second_factor':
|
|
14
|
+
return { path: `/v1/client/sign_ins/${id(target.attemptId)}/check_second_factor`, body: { strategy: 'email_code', code } };
|
|
15
|
+
case 'sign_up_verification':
|
|
16
|
+
return { path: `/v1/client/sign_ups/${id(target.attemptId)}/check_verification`, body: { strategy: 'email_code', code } };
|
|
17
|
+
case 'step_up':
|
|
18
|
+
return { path: '/v1/client/me/step_up/check', body: { strategy: 'email_code', code } };
|
|
19
|
+
case 'email_address':
|
|
20
|
+
return { path: `/v1/client/me/email_addresses/${id(target.emailAddressId)}/check_verification`, body: { code } };
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Check a code. `ok` with `data` for a right, live code; otherwise the server's
|
|
25
|
+
* errors — `VERIFICATION_FAILED` (wrong, expired or unknown) or
|
|
26
|
+
* `TOO_MANY_ATTEMPTS` (the code is locked; request a new one).
|
|
27
|
+
*/
|
|
28
|
+
function checkEmailCode(client, target, code) {
|
|
29
|
+
const { path, body } = emailCodeCheckRequest(target, code);
|
|
30
|
+
return client.post(path, body);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The check target for the code step a flow is on, or null when the current
|
|
34
|
+
* step takes no emailed code. An emailed code on the first-factor step, the
|
|
35
|
+
* email second factor, and sign-up verification are covered.
|
|
36
|
+
*/
|
|
37
|
+
function emailCodeTargetForAttempt(attempt) {
|
|
38
|
+
if (!attempt?.id)
|
|
39
|
+
return null;
|
|
40
|
+
switch ((0, attempt_1.nextStep)(attempt).kind) {
|
|
41
|
+
case 'collect_first_factor':
|
|
42
|
+
return { kind: 'sign_in_first_factor', attemptId: attempt.id };
|
|
43
|
+
case 'collect_second_factor':
|
|
44
|
+
return { kind: 'sign_in_second_factor', attemptId: attempt.id };
|
|
45
|
+
case 'collect_email_code':
|
|
46
|
+
return { kind: 'sign_up_verification', attemptId: attempt.id };
|
|
47
|
+
default:
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=email-code-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-code-check.js","sourceRoot":"","sources":["../src/email-code-check.ts"],"names":[],"mappings":";;AAsCA,sDAcC;AAOD,wCAGC;AAOD,8DAYC;AAhED,uCAAuD;AAoBvD,gDAAgD;AAChD,SAAgB,qBAAqB,CAAC,MAAuB,EAAE,IAAY;IACzE,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,sBAAsB;YACzB,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5H,KAAK,uBAAuB;YAC1B,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,sBAAsB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7H,KAAK,sBAAsB;YACzB,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QAC5H,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,6BAA6B,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;QACzF,KAAK,eAAe;YAClB,OAAO,EAAE,IAAI,EAAE,iCAAiC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;IACrH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,MAAkB,EAAE,MAAuB,EAAE,IAAY;IACtF,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAiB,IAAI,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,OAAuC;IAC/E,IAAI,CAAC,OAAO,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9B,QAAQ,IAAA,kBAAQ,EAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/B,KAAK,sBAAsB;YACzB,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QACjE,KAAK,uBAAuB;YAC1B,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QAClE,KAAK,oBAAoB;YACvB,OAAO,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QACjE;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -29,6 +29,42 @@ export interface SignOutOptions {
|
|
|
29
29
|
* Honoured by every framework provider.
|
|
30
30
|
*/
|
|
31
31
|
strict?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Follow the upstream provider's end-session URL after signing out locally,
|
|
34
|
+
* when the session came from a custom OAuth/OIDC provider or enterprise OIDC
|
|
35
|
+
* connection with RP-initiated logout on. Default `true`; `false` leaves it
|
|
36
|
+
* to you (`result.upstreamLogoutUrl`).
|
|
37
|
+
*/
|
|
38
|
+
upstreamLogout?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Where the user lands after that upstream logout. Must be on an allowed
|
|
41
|
+
* origin of the instance; otherwise the provider's configured post-logout
|
|
42
|
+
* page is used. Also used for SAML Single Logout when
|
|
43
|
+
* `samlLogoutRedirectUrl` is not set.
|
|
44
|
+
*/
|
|
45
|
+
returnUrl?: string;
|
|
46
|
+
/**
|
|
47
|
+
* SAML Single Logout. When the session came from a SAML connection with
|
|
48
|
+
* Single Logout on, the sign-out response carries a `saml_logout_url`; by
|
|
49
|
+
* default the browser is then sent there (after the local sign-out) so the
|
|
50
|
+
* identity provider's session ends too. Pass `false` to stay on the page and
|
|
51
|
+
* handle `SignOutResult.samlLogoutUrl` yourself.
|
|
52
|
+
*
|
|
53
|
+
* A browser can follow only one logout redirect. In the (unusual) case that
|
|
54
|
+
* the response carries both `upstream_logout_url` and `saml_logout_url`, the
|
|
55
|
+
* upstream OpenID provider's URL is followed (it has no server-to-server
|
|
56
|
+
* fallback) and the SAML identity provider is told server-to-server through
|
|
57
|
+
* SOAP back-channel logout when its connection has a SOAP endpoint;
|
|
58
|
+
* `samlLogoutUrl` is still reported. With `upstreamLogout: false`, the SAML
|
|
59
|
+
* URL is followed instead.
|
|
60
|
+
*/
|
|
61
|
+
samlLogout?: boolean;
|
|
62
|
+
/**
|
|
63
|
+
* SAML Single Logout: where the identity provider returns the browser once it
|
|
64
|
+
* has signed the user out. Must be on one of the instance's allowed origins.
|
|
65
|
+
* Defaults to `returnUrl`, else the page that signed out.
|
|
66
|
+
*/
|
|
67
|
+
samlLogoutRedirectUrl?: string;
|
|
32
68
|
}
|
|
33
69
|
/** The default wait for front-channel logout frames. */
|
|
34
70
|
export declare const FRONTCHANNEL_LOGOUT_TIMEOUT_MS = 5000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontchannel-logout.js","sourceRoot":"","sources":["../src/frontchannel-logout.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;
|
|
1
|
+
{"version":3,"file":"frontchannel-logout.js","sourceRoot":"","sources":["../src/frontchannel-logout.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAqEH,wDAgBC;AAOD,sDAuDC;AAOD,8EAaC;AA5GD,wDAAwD;AAC3C,QAAA,8BAA8B,GAAG,IAAI,CAAC;AAEnD,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;AAEpE;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,IAAa;IAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtC,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAI,MAAM,IAAI,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CACnC,IAAa,EACb,UAAqC,EAAE;IAEvC,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACvF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IACD,MAAM,IAAI,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,sCAA8B,CAAC;IAEtE,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QACnC,MAAM,MAAM,GAAwB,EAAE,CAAC;QACvC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,KAAgD,CAAC;QACrD,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,IAAI,KAAK,KAAK,SAAS;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,OAAO,IAAI,CAAC,CAAC;YACb,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,EAAE,CAAC;QAC7B,CAAC,CAAC;QACF,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACtC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC/C,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;gBAC7B,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBAC1C,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;gBACrC,iEAAiE;gBACjE,iEAAiE;gBACjE,qEAAqE;gBACrE,kEAAkE;gBAClE,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;gBACnD,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvD,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxD,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,iCAAiC,CACrD,QAAqC,EACrC,UAAqC,EAAE;IAEvC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO;IACtC,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAI,IAAsD,EAAE,wBAAwB,CAAC;IAC/F,MAAM,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,11 +24,13 @@ export * from './passkey';
|
|
|
24
24
|
export * from './mfa-enrollment';
|
|
25
25
|
export * from './passkey-sign-in';
|
|
26
26
|
export * from './passkey-sign-up';
|
|
27
|
+
export * from './email-code-check';
|
|
27
28
|
export * from './telegram';
|
|
28
29
|
export * from './siwe';
|
|
29
30
|
export * from './telemetry';
|
|
30
31
|
export * from './reauth';
|
|
31
32
|
export * from './api-keys';
|
|
33
|
+
export * from './device-authorization';
|
|
32
34
|
export * from './organizations';
|
|
33
35
|
export * from './phone-numbers';
|
|
34
36
|
export * from './account-hints';
|
|
@@ -36,7 +38,9 @@ export * from './profile';
|
|
|
36
38
|
export * from './connect';
|
|
37
39
|
export * from './password-reset';
|
|
38
40
|
export * from './check-session';
|
|
41
|
+
export * from './better-auth-bridge';
|
|
39
42
|
export * from './frontchannel-logout';
|
|
43
|
+
export * from './upstream-logout';
|
|
40
44
|
export * from './captcha';
|
|
41
45
|
export * from './captcha-widget';
|
|
42
46
|
export * from './atlas-captcha';
|
package/dist/index.js
CHANGED
|
@@ -64,12 +64,15 @@ __exportStar(require("./mfa-enrollment"), exports);
|
|
|
64
64
|
__exportStar(require("./passkey-sign-in"), exports);
|
|
65
65
|
// Passkey-only sign-up (the account is created when its passkey registers).
|
|
66
66
|
__exportStar(require("./passkey-sign-up"), exports);
|
|
67
|
+
// Check an emailed one-time code without using it up (sign-in, sign-up, step-up, email verification).
|
|
68
|
+
__exportStar(require("./email-code-check"), exports);
|
|
67
69
|
__exportStar(require("./telegram"), exports);
|
|
68
70
|
__exportStar(require("./siwe"), exports);
|
|
69
71
|
__exportStar(require("./telemetry"), exports);
|
|
70
72
|
__exportStar(require("./reauth"), exports);
|
|
71
73
|
// End-user API key self-service (`/v1/client/me/api_keys`).
|
|
72
74
|
__exportStar(require("./api-keys"), exports);
|
|
75
|
+
__exportStar(require("./device-authorization"), exports);
|
|
73
76
|
__exportStar(require("./organizations"), exports);
|
|
74
77
|
__exportStar(require("./phone-numbers"), exports);
|
|
75
78
|
// Username availability + the "Last used" sign-in method hint.
|
|
@@ -79,8 +82,12 @@ __exportStar(require("./profile"), exports);
|
|
|
79
82
|
__exportStar(require("./connect"), exports);
|
|
80
83
|
__exportStar(require("./password-reset"), exports);
|
|
81
84
|
__exportStar(require("./check-session"), exports);
|
|
85
|
+
// Moving from Better Auth: exchange a readable Better Auth session cookie for an Atlas session.
|
|
86
|
+
__exportStar(require("./better-auth-bridge"), exports);
|
|
82
87
|
// OIDC Front-Channel Logout after a browser sign-out.
|
|
83
88
|
__exportStar(require("./frontchannel-logout"), exports);
|
|
89
|
+
// RP-initiated logout at an upstream OpenID provider after a browser sign-out.
|
|
90
|
+
__exportStar(require("./upstream-logout"), exports);
|
|
84
91
|
// §5 "captcha anywhere" — fetch the central widget config, render the provider
|
|
85
92
|
// widget, and verify a solved token, all without hardcoding provider keys.
|
|
86
93
|
__exportStar(require("./captcha"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6EAA6E;AAC7E,2CAAyB;AACzB,6CAA2B;AAC3B,yDAAyD;AACzD,kDAAgC;AAChC,sFAAsF;AACtF,mDAAiC;AACjC,gDAA8B;AAC9B,iDAA+B;AAC/B,4CAA0B;AAC1B,iDAA+B;AAC/B,kDAAgC;AAChC,uEAAuE;AACvE,2CAAyB;AACzB,6CAA2B;AAC3B,qFAAqF;AACrF,kDAAgC;AAChC,yCAAuB;AACvB,mGAAmG;AACnG,2DAAyC;AACzC,+EAA+E;AAC/E,6CAA2B;AAC3B,gGAAgG;AAChG,6CAA0G;AAAjG,gHAAA,iBAAiB,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAClF,qDAW2B;AAVzB,oHAAA,iBAAiB,OAAA;AACjB,2HAAA,wBAAwB,OAAA;AACxB,oHAAA,iBAAiB,OAAA;AACjB,gHAAA,aAAa,OAAA;AACb,wHAAA,qBAAqB,OAAA;AACrB,uHAAA,oBAAoB,OAAA;AAMtB,iEAAiE;AACjE,iDAA+B;AAC/B,4CAA0B;AAC1B,yFAAyF;AACzF,oDAAkC;AAClC,2CAAyB;AACzB,mDAAiC;AACjC,4CAA0B;AAC1B,0GAA0G;AAC1G,mDAAiC;AACjC,uFAAuF;AACvF,oDAAkC;AAClC,4EAA4E;AAC5E,oDAAkC;AAClC,6CAA2B;AAC3B,yCAAuB;AACvB,8CAA4B;AAC5B,2CAAyB;AACzB,4DAA4D;AAC5D,6CAA2B;AAC3B,kDAAgC;AAChC,kDAAgC;AAChC,+DAA+D;AAC/D,kDAAgC;AAChC,qEAAqE;AACrE,4CAA0B;AAC1B,4CAA0B;AAC1B,mDAAiC;AACjC,kDAAgC;AAChC,sDAAsD;AACtD,wDAAsC;AACtC,+EAA+E;AAC/E,2EAA2E;AAC3E,4CAA0B;AAC1B,kFAAkF;AAClF,mDAAiC;AACjC,4FAA4F;AAC5F,kDAAgC;AAChC,kFAAkF;AAClF,yEAAyE;AACzE,oEAAoE;AACpE,uDAAqC;AACrC,sDAAoC;AACpC,uEAAuE;AACvE,gDAA8B;AAC9B,0EAA0E;AAC1E,4EAA4E;AAC5E,0CAa0B;AARxB,iGAAA,QAAQ,OAAA;AACR,sGAAA,aAAa,OAAA;AACb,0GAAA,iBAAiB,OAAA;AACjB,uGAAA,cAAc,OAAA;AACd,yGAAA,gBAAgB,OAAA;AAChB,+GAAA,sBAAsB,OAAA;AACtB,kGAAA,SAAS,OAAA;AACT,wGAAA,eAAe,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,6EAA6E;AAC7E,2CAAyB;AACzB,6CAA2B;AAC3B,yDAAyD;AACzD,kDAAgC;AAChC,sFAAsF;AACtF,mDAAiC;AACjC,gDAA8B;AAC9B,iDAA+B;AAC/B,4CAA0B;AAC1B,iDAA+B;AAC/B,kDAAgC;AAChC,uEAAuE;AACvE,2CAAyB;AACzB,6CAA2B;AAC3B,qFAAqF;AACrF,kDAAgC;AAChC,yCAAuB;AACvB,mGAAmG;AACnG,2DAAyC;AACzC,+EAA+E;AAC/E,6CAA2B;AAC3B,gGAAgG;AAChG,6CAA0G;AAAjG,gHAAA,iBAAiB,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAAE,6GAAA,cAAc,OAAA;AAClF,qDAW2B;AAVzB,oHAAA,iBAAiB,OAAA;AACjB,2HAAA,wBAAwB,OAAA;AACxB,oHAAA,iBAAiB,OAAA;AACjB,gHAAA,aAAa,OAAA;AACb,wHAAA,qBAAqB,OAAA;AACrB,uHAAA,oBAAoB,OAAA;AAMtB,iEAAiE;AACjE,iDAA+B;AAC/B,4CAA0B;AAC1B,yFAAyF;AACzF,oDAAkC;AAClC,2CAAyB;AACzB,mDAAiC;AACjC,4CAA0B;AAC1B,0GAA0G;AAC1G,mDAAiC;AACjC,uFAAuF;AACvF,oDAAkC;AAClC,4EAA4E;AAC5E,oDAAkC;AAClC,sGAAsG;AACtG,qDAAmC;AACnC,6CAA2B;AAC3B,yCAAuB;AACvB,8CAA4B;AAC5B,2CAAyB;AACzB,4DAA4D;AAC5D,6CAA2B;AAC3B,yDAAuC;AACvC,kDAAgC;AAChC,kDAAgC;AAChC,+DAA+D;AAC/D,kDAAgC;AAChC,qEAAqE;AACrE,4CAA0B;AAC1B,4CAA0B;AAC1B,mDAAiC;AACjC,kDAAgC;AAChC,gGAAgG;AAChG,uDAAqC;AACrC,sDAAsD;AACtD,wDAAsC;AACtC,+EAA+E;AAC/E,oDAAkC;AAClC,+EAA+E;AAC/E,2EAA2E;AAC3E,4CAA0B;AAC1B,kFAAkF;AAClF,mDAAiC;AACjC,4FAA4F;AAC5F,kDAAgC;AAChC,kFAAkF;AAClF,yEAAyE;AACzE,oEAAoE;AACpE,uDAAqC;AACrC,sDAAoC;AACpC,uEAAuE;AACvE,gDAA8B;AAC9B,0EAA0E;AAC1E,4EAA4E;AAC5E,0CAa0B;AARxB,iGAAA,QAAQ,OAAA;AACR,sGAAA,aAAa,OAAA;AACb,0GAAA,iBAAiB,OAAA;AACjB,uGAAA,cAAc,OAAA;AACd,yGAAA,gBAAgB,OAAA;AAChB,+GAAA,sBAAsB,OAAA;AACtB,kGAAA,SAAS,OAAA;AACT,wGAAA,eAAe,OAAA"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { type FapiClient, type FlowState } from './fapi';
|
|
19
19
|
import type { AttemptView } from './attempt';
|
|
20
|
-
import { type WebAuthnHost } from './passkey';
|
|
20
|
+
import { type PasskeyExtensionOptions, type WebAuthnHost } from './passkey';
|
|
21
21
|
export interface PasskeySignUpInput {
|
|
22
22
|
/** Collected when the instance's `account.passkeySignUp.email` is not `off`. */
|
|
23
23
|
email?: string;
|
|
@@ -43,4 +43,4 @@ export declare function awaitingPasskey(attempt: AttemptView | null | undefined)
|
|
|
43
43
|
export declare function registerSignUpPasskey(client: FapiClient, state: FlowState, opts?: {
|
|
44
44
|
name?: string;
|
|
45
45
|
host?: WebAuthnHost;
|
|
46
|
-
}): Promise<FlowState>;
|
|
46
|
+
} & PasskeyExtensionOptions): Promise<FlowState>;
|
package/dist/passkey-sign-up.js
CHANGED
|
@@ -66,7 +66,13 @@ async function registerSignUpPasskey(client, state, opts = {}) {
|
|
|
66
66
|
return { ...state, busy: false, errors: begin.errors };
|
|
67
67
|
let body;
|
|
68
68
|
try {
|
|
69
|
-
body = await (0, passkey_1.createPasskey)(begin.data, {
|
|
69
|
+
body = await (0, passkey_1.createPasskey)(begin.data, {
|
|
70
|
+
host: opts.host,
|
|
71
|
+
...(opts.name ? { name: opts.name } : {}),
|
|
72
|
+
// PRF (client-side keys): the salts go to the authenticator, the outputs to the app only.
|
|
73
|
+
...(opts.prf ? { prf: opts.prf } : {}),
|
|
74
|
+
...(opts.onExtensionResults ? { onExtensionResults: opts.onExtensionResults } : {}),
|
|
75
|
+
});
|
|
70
76
|
}
|
|
71
77
|
catch (error) {
|
|
72
78
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey-sign-up.js","sourceRoot":"","sources":["../src/passkey-sign-up.ts"],"names":[],"mappings":";;AAmCA,gDAgBC;AAGD,0CAOC;AAQD,
|
|
1
|
+
{"version":3,"file":"passkey-sign-up.js","sourceRoot":"","sources":["../src/passkey-sign-up.ts"],"names":[],"mappings":"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"}
|
package/dist/passkey.d.ts
CHANGED
|
@@ -34,6 +34,62 @@ export declare function base64UrlToBuffer(value: string): ArrayBuffer;
|
|
|
34
34
|
export declare function passkeysSupported(host?: unknown): boolean;
|
|
35
35
|
/** Whether conditional-UI (autofill) discovery is available (best-effort). */
|
|
36
36
|
export declare function conditionalUiAvailable(): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* A PRF salt: bytes, or a string (encoded as UTF-8). Use a fixed, app-chosen
|
|
39
|
+
* salt per purpose (for example `"myapp:vault-key:v1"`), so the same passkey
|
|
40
|
+
* always yields the same secret for that purpose.
|
|
41
|
+
*/
|
|
42
|
+
export type PasskeyPrfSalt = ArrayBuffer | ArrayBufferView | string;
|
|
43
|
+
/** The salts for one PRF evaluation (`second` asks for a second, independent output). */
|
|
44
|
+
export interface PasskeyPrfValues {
|
|
45
|
+
first: PasskeyPrfSalt;
|
|
46
|
+
second?: PasskeyPrfSalt;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Ask the authenticator for the WebAuthn `prf` extension: a secret derived from
|
|
50
|
+
* the passkey and your salt, which never leaves the browser. Use it to derive a
|
|
51
|
+
* client-side encryption key. `eval` applies to any credential;
|
|
52
|
+
* `evalByCredential` (sign-in only) gives per-credential salts keyed by
|
|
53
|
+
* base64url credential id.
|
|
54
|
+
*/
|
|
55
|
+
export interface PasskeyPrfRequest {
|
|
56
|
+
eval?: PasskeyPrfValues;
|
|
57
|
+
evalByCredential?: Record<string, PasskeyPrfValues>;
|
|
58
|
+
}
|
|
59
|
+
/** What the browser answered for `prf`. */
|
|
60
|
+
export interface PasskeyPrfResult {
|
|
61
|
+
/** Registration: whether the new passkey supports PRF. */
|
|
62
|
+
enabled?: boolean;
|
|
63
|
+
/** The PRF outputs (32 bytes each), when the authenticator evaluated them. */
|
|
64
|
+
results?: {
|
|
65
|
+
first: Uint8Array;
|
|
66
|
+
second?: Uint8Array;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The client extension results of a ceremony — returned to YOUR code only. They
|
|
71
|
+
* are never sent to Atlas: the `finish` body is unchanged.
|
|
72
|
+
*/
|
|
73
|
+
export interface PasskeyExtensionResults {
|
|
74
|
+
/** The credential the ceremony used (base64url). */
|
|
75
|
+
credentialId: string;
|
|
76
|
+
prf?: PasskeyPrfResult;
|
|
77
|
+
/** Registration: whether a discoverable credential (passkey) was created, when the browser says. */
|
|
78
|
+
credProps?: {
|
|
79
|
+
rk?: boolean;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Options shared by both ceremonies for client extensions. */
|
|
83
|
+
export interface PasskeyExtensionOptions {
|
|
84
|
+
/** Request the `prf` extension (the salts are sent to the authenticator, not to Atlas). */
|
|
85
|
+
prf?: PasskeyPrfRequest;
|
|
86
|
+
/** Receives the client extension results (PRF outputs) after a successful ceremony. */
|
|
87
|
+
onExtensionResults?: (results: PasskeyExtensionResults) => void;
|
|
88
|
+
}
|
|
89
|
+
/** The `extensions` member for a ceremony, or undefined when nothing is requested. */
|
|
90
|
+
export declare function passkeyExtensionsInput(prf: PasskeyPrfRequest | undefined, ceremony: 'create' | 'get'): Record<string, unknown> | undefined;
|
|
91
|
+
/** Read (and normalise) a credential's client extension results. */
|
|
92
|
+
export declare function readExtensionResults(credential: PublicKeyCredential): PasskeyExtensionResults;
|
|
37
93
|
/** The POST body for /v1/client/me/passkeys/finish. */
|
|
38
94
|
export interface PasskeyRegistrationBody {
|
|
39
95
|
challenge: string;
|
|
@@ -49,7 +105,7 @@ export interface PasskeyRegistrationBody {
|
|
|
49
105
|
export declare function createPasskey(begin: Record<string, unknown>, opts?: {
|
|
50
106
|
name?: string;
|
|
51
107
|
host?: WebAuthnHost;
|
|
52
|
-
}): Promise<PasskeyRegistrationBody>;
|
|
108
|
+
} & PasskeyExtensionOptions): Promise<PasskeyRegistrationBody>;
|
|
53
109
|
/** The POST body for /v1/client/sign_ins/passkey/finish. */
|
|
54
110
|
export interface PasskeyAssertionBody {
|
|
55
111
|
handle: string;
|
|
@@ -67,4 +123,4 @@ export declare function getPasskeyAssertion(begin: Record<string, unknown>, opts
|
|
|
67
123
|
host?: WebAuthnHost;
|
|
68
124
|
mediation?: 'optional' | 'conditional';
|
|
69
125
|
signal?: AbortSignal;
|
|
70
|
-
}): Promise<PasskeyAssertionBody>;
|
|
126
|
+
} & PasskeyExtensionOptions): Promise<PasskeyAssertionBody>;
|
package/dist/passkey.js
CHANGED
|
@@ -18,6 +18,8 @@ exports.bufferToBase64Url = bufferToBase64Url;
|
|
|
18
18
|
exports.base64UrlToBuffer = base64UrlToBuffer;
|
|
19
19
|
exports.passkeysSupported = passkeysSupported;
|
|
20
20
|
exports.conditionalUiAvailable = conditionalUiAvailable;
|
|
21
|
+
exports.passkeyExtensionsInput = passkeyExtensionsInput;
|
|
22
|
+
exports.readExtensionResults = readExtensionResults;
|
|
21
23
|
exports.createPasskey = createPasskey;
|
|
22
24
|
exports.getPasskeyAssertion = getPasskeyAssertion;
|
|
23
25
|
const defaultHost = () => {
|
|
@@ -61,6 +63,47 @@ async function conditionalUiAvailable() {
|
|
|
61
63
|
return false;
|
|
62
64
|
}
|
|
63
65
|
}
|
|
66
|
+
function saltBytes(salt) {
|
|
67
|
+
if (typeof salt === 'string')
|
|
68
|
+
return new TextEncoder().encode(salt);
|
|
69
|
+
if (salt instanceof ArrayBuffer)
|
|
70
|
+
return new Uint8Array(salt);
|
|
71
|
+
return new Uint8Array(salt.buffer, salt.byteOffset, salt.byteLength);
|
|
72
|
+
}
|
|
73
|
+
function prfValues(v) {
|
|
74
|
+
return { first: saltBytes(v.first), ...(v.second !== undefined ? { second: saltBytes(v.second) } : {}) };
|
|
75
|
+
}
|
|
76
|
+
/** The `extensions` member for a ceremony, or undefined when nothing is requested. */
|
|
77
|
+
function passkeyExtensionsInput(prf, ceremony) {
|
|
78
|
+
if (!prf)
|
|
79
|
+
return undefined;
|
|
80
|
+
const out = {};
|
|
81
|
+
if (prf.eval)
|
|
82
|
+
out.eval = prfValues(prf.eval);
|
|
83
|
+
if (ceremony === 'get' && prf.evalByCredential) {
|
|
84
|
+
out.evalByCredential = Object.fromEntries(Object.entries(prf.evalByCredential).map(([id, v]) => [id, prfValues(v)]));
|
|
85
|
+
}
|
|
86
|
+
return { prf: out };
|
|
87
|
+
}
|
|
88
|
+
const toBytes = (v) => v instanceof ArrayBuffer ? new Uint8Array(v) : ArrayBuffer.isView(v) ? new Uint8Array(v.buffer, v.byteOffset, v.byteLength) : undefined;
|
|
89
|
+
/** Read (and normalise) a credential's client extension results. */
|
|
90
|
+
function readExtensionResults(credential) {
|
|
91
|
+
const raw = credential.getClientExtensionResults?.() ?? {};
|
|
92
|
+
const out = { credentialId: bufferToBase64Url(credential.rawId) };
|
|
93
|
+
const prf = raw.prf;
|
|
94
|
+
if (prf && typeof prf === 'object') {
|
|
95
|
+
const first = toBytes(prf.results?.first);
|
|
96
|
+
const second = toBytes(prf.results?.second);
|
|
97
|
+
out.prf = {
|
|
98
|
+
...(typeof prf.enabled === 'boolean' ? { enabled: prf.enabled } : {}),
|
|
99
|
+
...(first ? { results: { first, ...(second ? { second } : {}) } } : {}),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const credProps = raw.credProps;
|
|
103
|
+
if (credProps && typeof credProps === 'object')
|
|
104
|
+
out.credProps = typeof credProps.rk === 'boolean' ? { rk: credProps.rk } : {};
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
64
107
|
/**
|
|
65
108
|
* Run navigator.credentials.create from a `/passkeys/begin` response and return
|
|
66
109
|
* the `/finish` body. `begin` is the JSON the server sent (challenge, rp, user,
|
|
@@ -79,11 +122,16 @@ async function createPasskey(begin, opts = {}) {
|
|
|
79
122
|
authenticatorSelection: begin.authenticatorSelection,
|
|
80
123
|
timeout: begin.timeout,
|
|
81
124
|
attestation: begin.attestation,
|
|
125
|
+
...extensionsMember(passkeyExtensionsInput(opts.prf, 'create'), begin.extensions),
|
|
82
126
|
};
|
|
83
127
|
const credential = (await host.credentials.create({ publicKey }));
|
|
84
128
|
if (!credential)
|
|
85
129
|
throw new Error('Passkey registration was cancelled.');
|
|
86
130
|
const response = credential.response;
|
|
131
|
+
// Client extension results (PRF outputs) go to the app's callback only —
|
|
132
|
+
// never into the finish body, so Atlas never sees them.
|
|
133
|
+
if (opts.onExtensionResults)
|
|
134
|
+
opts.onExtensionResults(readExtensionResults(credential));
|
|
87
135
|
return {
|
|
88
136
|
// Echo the server's challenge string — the server matched/stored it.
|
|
89
137
|
challenge: begin.challenge,
|
|
@@ -105,6 +153,7 @@ async function getPasskeyAssertion(begin, opts = {}) {
|
|
|
105
153
|
allowCredentials: allow.map((c) => ({ type: c.type, id: base64UrlToBuffer(c.id) })),
|
|
106
154
|
userVerification: begin.userVerification,
|
|
107
155
|
timeout: begin.timeout,
|
|
156
|
+
...extensionsMember(passkeyExtensionsInput(opts.prf, 'get'), begin.extensions),
|
|
108
157
|
};
|
|
109
158
|
const credential = (await host.credentials.get({
|
|
110
159
|
publicKey,
|
|
@@ -114,6 +163,8 @@ async function getPasskeyAssertion(begin, opts = {}) {
|
|
|
114
163
|
if (!credential)
|
|
115
164
|
throw new Error('Passkey sign-in was cancelled.');
|
|
116
165
|
const response = credential.response;
|
|
166
|
+
if (opts.onExtensionResults)
|
|
167
|
+
opts.onExtensionResults(readExtensionResults(credential));
|
|
117
168
|
return {
|
|
118
169
|
handle: begin.handle,
|
|
119
170
|
challenge: begin.challenge,
|
|
@@ -123,4 +174,14 @@ async function getPasskeyAssertion(begin, opts = {}) {
|
|
|
123
174
|
signature: bufferToBase64Url(response.signature),
|
|
124
175
|
};
|
|
125
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* The ceremony's `extensions`: what the server's begin response asked for
|
|
179
|
+
* (when it asks for any), with the app's PRF request merged in.
|
|
180
|
+
*/
|
|
181
|
+
function extensionsMember(app, server) {
|
|
182
|
+
const fromServer = server && typeof server === 'object' && !Array.isArray(server) ? server : undefined;
|
|
183
|
+
if (!app && !fromServer)
|
|
184
|
+
return {};
|
|
185
|
+
return { extensions: { ...(fromServer ?? {}), ...(app ?? {}) } };
|
|
186
|
+
}
|
|
126
187
|
//# sourceMappingURL=passkey.js.map
|
package/dist/passkey.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../src/passkey.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;AAuBH,8CAKC;AAGD,8CAOC;AAGD,8CAGC;AAGD,wDAQC;AAeD,
|
|
1
|
+
{"version":3,"file":"passkey.js","sourceRoot":"","sources":["../src/passkey.ts"],"names":[],"mappings":"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"}
|
package/dist/sign-out-guard.d.ts
CHANGED
|
@@ -43,6 +43,12 @@ export interface SignOutGuardOptions {
|
|
|
43
43
|
retryDelaysMs?: number[];
|
|
44
44
|
/** Skip front-channel logout entirely (runtimes without a DOM). */
|
|
45
45
|
frontChannelLogout?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* How to open the upstream end-session URL or the SAML Single Logout URL
|
|
48
|
+
* (default: `window.location.assign`).
|
|
49
|
+
* Native SDKs pass their system-browser opener.
|
|
50
|
+
*/
|
|
51
|
+
navigate?: (href: string) => void;
|
|
46
52
|
}
|
|
47
53
|
/** What {@link SignOutGuard.revoke} did on the server. */
|
|
48
54
|
export interface SignOutAttempt {
|
|
@@ -60,6 +66,7 @@ export declare class SignOutGuard {
|
|
|
60
66
|
private readonly request;
|
|
61
67
|
private readonly retryDelaysMs;
|
|
62
68
|
private readonly frontChannelLogout;
|
|
69
|
+
private readonly navigate?;
|
|
63
70
|
/** Sessions with a background revoke in flight or scheduled. */
|
|
64
71
|
private readonly retrying;
|
|
65
72
|
private readonly timers;
|