@agenticprimitives/connect-auth 0.1.0-alpha.3 → 1.0.0-alpha.11
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/README.md +17 -8
- package/dist/csrf.d.ts +72 -8
- package/dist/csrf.d.ts.map +1 -1
- package/dist/csrf.js +110 -19
- package/dist/csrf.js.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/methods/google.d.ts +30 -1
- package/dist/methods/google.d.ts.map +1 -1
- package/dist/methods/google.js +35 -6
- package/dist/methods/google.js.map +1 -1
- package/dist/methods/passkey.d.ts +1 -13
- package/dist/methods/passkey.d.ts.map +1 -1
- package/dist/methods/passkey.js +7 -12
- package/dist/methods/passkey.js.map +1 -1
- package/dist/methods/siwe.d.ts +6 -6
- package/dist/methods/siwe.d.ts.map +1 -1
- package/dist/methods/siwe.js +17 -7
- package/dist/methods/siwe.js.map +1 -1
- package/dist/methods/youversion.d.ts +10 -0
- package/dist/methods/youversion.d.ts.map +1 -0
- package/dist/methods/youversion.js +18 -0
- package/dist/methods/youversion.js.map +1 -0
- package/dist/salt.js +1 -1
- package/dist/salt.js.map +1 -1
- package/dist/sessions.d.ts +65 -7
- package/dist/sessions.d.ts.map +1 -1
- package/dist/sessions.js +117 -9
- package/dist/sessions.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/verify-signature.d.ts +1 -1
- package/dist/verify-signature.d.ts.map +1 -1
- package/package.json +11 -7
package/README.md
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
# @agenticprimitives/connect-auth
|
|
2
2
|
|
|
3
|
-
**Credential
|
|
4
|
-
JWT sessions, and pluggable `Signer` interfaces.
|
|
3
|
+
**Credential ceremonies that resolve to a canonical identity — not the other way around.**
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
**canonical identity** is the Smart Agent address (`agent-account`). Session JWTs
|
|
8
|
-
use the SA as primary subject; credentials appear as signer claims only
|
|
9
|
-
([ADR-0010](../../docs/architecture/decisions/0010-smart-agent-canonical-identifier.md)).
|
|
5
|
+
Most auth SDKs make the credential the identity: lose the passkey, lose the account. `connect-auth` inverts that. Passkey, SIWE, and OAuth are **ceremonies that prove control**; the identity they resolve to is the Smart Agent address ([ADR-0010](../../docs/architecture/decisions/0010-smart-agent-canonical-identifier.md)). Session JWTs carry the SA address as primary subject — the credential is a signer claim only. So when a credential rotates ([ADR-0011](../../docs/architecture/decisions/0011-credential-recovery-and-re-association.md)), the user signs back in as the same agent, with the same delegations, the same name, the same reputation. Identity persists; credentials rotate.
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
This package also defines the `Signer` interfaces (`Signer`, `PasskeySigner`, `EOASigner`, `KMSSigner`) that `agent-account` and `delegation` consume — the architectural contract that lets the whole stack swap signing backends without touching account or delegation code. Custodian add/remove belongs to `custody`, not here: this package never mutates a credential set, only resolves credential → SA.
|
|
8
|
+
|
|
9
|
+
> Part of [agenticprimitives](../../README.md) — the trust substrate for the agent economy: one canonical Smart Agent identity with custody, delegation, naming, credentials, and audit evidence designed as one system.
|
|
13
10
|
|
|
14
11
|
## Use This When
|
|
15
12
|
|
|
@@ -69,6 +66,14 @@ See [`docs/concepts.md`](docs/concepts.md).
|
|
|
69
66
|
- `@agenticprimitives/connect-auth/siwe`
|
|
70
67
|
- `@agenticprimitives/connect-auth/google`
|
|
71
68
|
|
|
69
|
+
## How it's different from Privy, Dynamic, and Web3Auth
|
|
70
|
+
|
|
71
|
+
Hosted auth vendors give you login plus an embedded key, and the identity lives in their database — your users exist because the vendor's account table says so. Here the identity is an on-chain address that no auth provider can revoke, and this package is one composable layer over it:
|
|
72
|
+
|
|
73
|
+
- **Framework-agnostic and stateless.** No hosted dashboard, no database, no cookie I/O — your app wires HTTP routes and storage; this package handles the cryptographic ceremonies and JWT mint/verify.
|
|
74
|
+
- **No key custody.** It defines the `KMSSigner` interface; concrete signing backends live in `key-custody`. The auth layer never holds material it could lose.
|
|
75
|
+
- **Login is not authority.** A session JWT proves who signed in. What the agent may *do* is the delegation layer's job — scoped, revocable, on-chain-enforceable — not a side effect of holding a session.
|
|
76
|
+
|
|
72
77
|
## Security Invariants
|
|
73
78
|
|
|
74
79
|
- JWT secrets never logged; CSRF origin exact-match.
|
|
@@ -88,6 +93,10 @@ See [`docs/security.md`](docs/security.md) and [`AUDIT.md`](AUDIT.md).
|
|
|
88
93
|
- [`CLAUDE.md`](CLAUDE.md) — agent routing.
|
|
89
94
|
- [`spec.md`](spec.md) — spec pointer.
|
|
90
95
|
|
|
96
|
+
## Status
|
|
97
|
+
|
|
98
|
+
Testnet/pilot-ready. Production launch is gated on the public checklist in the root README — including third-party contract audit and governance key rotation. Track every security finding live in [`docs/audits/findings.yaml`](../../docs/audits/findings.yaml).
|
|
99
|
+
|
|
91
100
|
## Validation
|
|
92
101
|
|
|
93
102
|
```bash
|
package/dist/csrf.d.ts
CHANGED
|
@@ -1,13 +1,77 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* R5.11 — Optional bindings stamped into the CSRF token.
|
|
3
|
+
*
|
|
4
|
+
* `method` HTTP method (POST, PUT, ...) the token is bound to.
|
|
5
|
+
* `path` Request path the token is bound to. Use the URL pathname
|
|
6
|
+
* (not the full URL); query string is excluded.
|
|
7
|
+
* `sessionSid` Session id (typically `JwtClaims.sid` from the session
|
|
8
|
+
* cookie) so a CSRF token is unusable with a different
|
|
9
|
+
* session — defends against an attacker stealing the
|
|
10
|
+
* CSRF token alone.
|
|
11
|
+
*
|
|
12
|
+
* Empty/undefined bindings on both sides match (legacy callers see no
|
|
13
|
+
* behavior change at the wire format level). When mint supplies a
|
|
14
|
+
* binding, verify MUST supply the same value or the token is rejected.
|
|
3
15
|
*/
|
|
4
|
-
export
|
|
16
|
+
export interface CsrfBindings {
|
|
17
|
+
method?: string;
|
|
18
|
+
path?: string;
|
|
19
|
+
sessionSid?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface CsrfMintOpts extends CsrfBindings {
|
|
22
|
+
origin: string;
|
|
23
|
+
}
|
|
24
|
+
export interface CsrfVerifyOpts extends CsrfBindings {
|
|
25
|
+
/**
|
|
26
|
+
* The ACTUAL request origin (from the inbound `Origin` header or the
|
|
27
|
+
* verified `Referer`). The verifier rejects unless
|
|
28
|
+
* `stamp.origin === actualOrigin AND actualOrigin ∈ allowedOrigins`.
|
|
29
|
+
* Pass an empty string only when the caller has explicitly chosen
|
|
30
|
+
* not to bind to the request origin (e.g. a server-to-server
|
|
31
|
+
* verifier in a test); in production that path THROWS unless
|
|
32
|
+
* `developmentMode: true` is set.
|
|
33
|
+
*/
|
|
34
|
+
actualOrigin: string;
|
|
35
|
+
/** Exact-match allowlist of acceptable origins (defense in depth). */
|
|
36
|
+
allowedOrigins: string[];
|
|
37
|
+
/** Opt-out for tests / dev paths that intentionally lack an origin. */
|
|
38
|
+
developmentMode?: boolean;
|
|
39
|
+
}
|
|
5
40
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
41
|
+
* Mint a CSRF token bound to the supplied origin (and optionally to a
|
|
42
|
+
* method / path / session id). The HMAC covers all stamped fields, so
|
|
43
|
+
* any field tampering invalidates the token.
|
|
44
|
+
*
|
|
45
|
+
* R5.11 breaking change: the function signature now takes an opts
|
|
46
|
+
* object instead of a single `origin` positional arg. Pass
|
|
47
|
+
* `{ origin }` for the legacy origin-only behavior.
|
|
11
48
|
*/
|
|
12
|
-
export declare function
|
|
49
|
+
export declare function csrfTokenFor(opts: CsrfMintOpts): string;
|
|
50
|
+
/**
|
|
51
|
+
* Verify a CSRF token. R5.11 breaking change: signature is now
|
|
52
|
+
* `verifyCsrf(token, opts: CsrfVerifyOpts)`.
|
|
53
|
+
*
|
|
54
|
+
* 1. HMAC must verify under `CSRF_SECRET`.
|
|
55
|
+
* 2. `stamp.ts` must be within the last `CSRF_VALIDITY_SECONDS` window
|
|
56
|
+
* (with a small skew for future-ts).
|
|
57
|
+
* 3. `stamp.origin === opts.actualOrigin` (R5.11 / P1-2).
|
|
58
|
+
* 4. `opts.actualOrigin ∈ opts.allowedOrigins` (defense in depth).
|
|
59
|
+
* 5. When the mint side stamped a binding, the verify side MUST
|
|
60
|
+
* supply the same value:
|
|
61
|
+
* - `stamp.method === opts.method`
|
|
62
|
+
* - `stamp.path === opts.path`
|
|
63
|
+
* - `stamp.sessionSid === opts.sessionSid`
|
|
64
|
+
* Empty / undefined matches empty / undefined. A token minted
|
|
65
|
+
* WITHOUT bindings cannot be verified WITH bindings (and vice
|
|
66
|
+
* versa) — the comparison is exact.
|
|
67
|
+
*
|
|
68
|
+
* Returns true iff all checks pass.
|
|
69
|
+
*
|
|
70
|
+
* **Production guard:** when `NODE_ENV=production` AND
|
|
71
|
+
* `developmentMode !== true`, the function THROWS if `actualOrigin`
|
|
72
|
+
* is an empty string. A silently-permissive `''` would re-open the
|
|
73
|
+
* audit finding; failing fast keeps production deploys honest. Tests
|
|
74
|
+
* / dev opt out via `developmentMode: true`.
|
|
75
|
+
*/
|
|
76
|
+
export declare function verifyCsrf(token: string, opts: CsrfVerifyOpts): boolean;
|
|
13
77
|
//# sourceMappingURL=csrf.d.ts.map
|
package/dist/csrf.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"csrf.d.ts","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"AA2EA;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY;IAChD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD;;;;;;;;OAQG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAUD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAavD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAkDvE"}
|
package/dist/csrf.js
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
|
-
// CSRF tokens: HMAC-stamped origin +
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
// CSRF tokens: HMAC-stamped origin (+ optional method / path / session) +
|
|
2
|
+
// timestamp.
|
|
3
|
+
//
|
|
4
|
+
// R5.11 / PKG-CONNECT-AUTH-004 (external audit P1-2):
|
|
5
|
+
//
|
|
6
|
+
// Pre-R5.11 the verifier only checked the token's SIGNED origin
|
|
7
|
+
// against an allowlist. It never compared to the request's ACTUAL
|
|
8
|
+
// origin — so a token legitimately minted for `https://app.com`
|
|
9
|
+
// (signed, in allowlist) would pass even when the request itself
|
|
10
|
+
// came from `https://evil.com`. The double-submit cookie pattern
|
|
11
|
+
// helps but doesn't bind the verifier to the request origin.
|
|
12
|
+
//
|
|
13
|
+
// Post-R5.11 `verifyCsrf` takes an explicit `actualOrigin` opt and
|
|
14
|
+
// rejects unless `stamp.origin === actualOrigin AND actualOrigin
|
|
15
|
+
// ∈ allowedOrigins`. The actual request origin is the load-bearing
|
|
16
|
+
// check; the allowlist is defense in depth.
|
|
17
|
+
//
|
|
18
|
+
// Additionally, the audit row PKG-CONNECT-AUTH-004 also flagged
|
|
19
|
+
// that a token usable on `POST /transfer` is also usable on
|
|
20
|
+
// `POST /grant-admin` — no method/path/session binding. R5.11 adds
|
|
21
|
+
// optional `method` / `path` / `sessionSid` bindings: both mint
|
|
22
|
+
// and verify must agree on them, and when supplied they're stamped
|
|
23
|
+
// into the HMAC. Empty matches empty so legacy "origin only"
|
|
24
|
+
// callers keep working at the wire level.
|
|
25
|
+
//
|
|
26
|
+
// Token format (unchanged shape; new fields nullable):
|
|
27
|
+
// base64url(JSON.stringify({origin, ts, method?, path?, sessionSid?}))
|
|
28
|
+
// . base64url(hmac)
|
|
29
|
+
import { hmac } from '@noble/hashes/hmac.js';
|
|
30
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
7
31
|
import { hexToBytes } from 'viem';
|
|
8
32
|
const CSRF_VALIDITY_SECONDS = 60 * 60; // 1 hour
|
|
9
33
|
function loadCsrfSecret() {
|
|
@@ -36,25 +60,76 @@ function constantTimeEqual(a, b) {
|
|
|
36
60
|
diff |= (a[i] ?? 0) ^ (b[i] ?? 0);
|
|
37
61
|
return diff === 0;
|
|
38
62
|
}
|
|
63
|
+
function isProduction(opts) {
|
|
64
|
+
if (opts?.developmentMode === true)
|
|
65
|
+
return false;
|
|
66
|
+
try {
|
|
67
|
+
return typeof process !== 'undefined' && process.env?.NODE_ENV === 'production';
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
39
73
|
/**
|
|
40
|
-
*
|
|
74
|
+
* Mint a CSRF token bound to the supplied origin (and optionally to a
|
|
75
|
+
* method / path / session id). The HMAC covers all stamped fields, so
|
|
76
|
+
* any field tampering invalidates the token.
|
|
77
|
+
*
|
|
78
|
+
* R5.11 breaking change: the function signature now takes an opts
|
|
79
|
+
* object instead of a single `origin` positional arg. Pass
|
|
80
|
+
* `{ origin }` for the legacy origin-only behavior.
|
|
41
81
|
*/
|
|
42
|
-
export function csrfTokenFor(
|
|
82
|
+
export function csrfTokenFor(opts) {
|
|
43
83
|
const secret = loadCsrfSecret();
|
|
44
84
|
const ts = Math.floor(Date.now() / 1000);
|
|
45
|
-
const stamp =
|
|
46
|
-
|
|
85
|
+
const stamp = { origin: opts.origin, ts };
|
|
86
|
+
// Only include binding fields when supplied — keeps the wire format
|
|
87
|
+
// tight for legacy callers + makes intent visible in audit logs.
|
|
88
|
+
if (opts.method !== undefined)
|
|
89
|
+
stamp.method = opts.method;
|
|
90
|
+
if (opts.path !== undefined)
|
|
91
|
+
stamp.path = opts.path;
|
|
92
|
+
if (opts.sessionSid !== undefined)
|
|
93
|
+
stamp.sessionSid = opts.sessionSid;
|
|
94
|
+
const stampEnc = base64urlEncode(JSON.stringify(stamp));
|
|
47
95
|
const sig = hmac(sha256, secret, new TextEncoder().encode(stampEnc));
|
|
48
96
|
return `${stampEnc}.${base64urlEncode(sig)}`;
|
|
49
97
|
}
|
|
50
98
|
/**
|
|
51
|
-
* Verify a CSRF token.
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
99
|
+
* Verify a CSRF token. R5.11 breaking change: signature is now
|
|
100
|
+
* `verifyCsrf(token, opts: CsrfVerifyOpts)`.
|
|
101
|
+
*
|
|
102
|
+
* 1. HMAC must verify under `CSRF_SECRET`.
|
|
103
|
+
* 2. `stamp.ts` must be within the last `CSRF_VALIDITY_SECONDS` window
|
|
104
|
+
* (with a small skew for future-ts).
|
|
105
|
+
* 3. `stamp.origin === opts.actualOrigin` (R5.11 / P1-2).
|
|
106
|
+
* 4. `opts.actualOrigin ∈ opts.allowedOrigins` (defense in depth).
|
|
107
|
+
* 5. When the mint side stamped a binding, the verify side MUST
|
|
108
|
+
* supply the same value:
|
|
109
|
+
* - `stamp.method === opts.method`
|
|
110
|
+
* - `stamp.path === opts.path`
|
|
111
|
+
* - `stamp.sessionSid === opts.sessionSid`
|
|
112
|
+
* Empty / undefined matches empty / undefined. A token minted
|
|
113
|
+
* WITHOUT bindings cannot be verified WITH bindings (and vice
|
|
114
|
+
* versa) — the comparison is exact.
|
|
115
|
+
*
|
|
116
|
+
* Returns true iff all checks pass.
|
|
117
|
+
*
|
|
118
|
+
* **Production guard:** when `NODE_ENV=production` AND
|
|
119
|
+
* `developmentMode !== true`, the function THROWS if `actualOrigin`
|
|
120
|
+
* is an empty string. A silently-permissive `''` would re-open the
|
|
121
|
+
* audit finding; failing fast keeps production deploys honest. Tests
|
|
122
|
+
* / dev opt out via `developmentMode: true`.
|
|
56
123
|
*/
|
|
57
|
-
export function verifyCsrf(token,
|
|
124
|
+
export function verifyCsrf(token, opts) {
|
|
125
|
+
if (isProduction(opts)) {
|
|
126
|
+
if (!opts.actualOrigin || opts.actualOrigin.length === 0) {
|
|
127
|
+
throw new Error('[connect-auth] verifyCsrf requires a non-empty `actualOrigin` in production. ' +
|
|
128
|
+
'Without it the request-origin binding is bypassed, re-opening the R5.11 / P1-2 ' +
|
|
129
|
+
'finding. Pass the inbound `Origin` header (or parsed `Referer`) as ' +
|
|
130
|
+
'opts.actualOrigin; for tests, pass `developmentMode: true`.');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
58
133
|
if (!token)
|
|
59
134
|
return false;
|
|
60
135
|
const parts = token.split('.');
|
|
@@ -70,9 +145,25 @@ export function verifyCsrf(token, allowedOrigins) {
|
|
|
70
145
|
}
|
|
71
146
|
if (typeof stamp.origin !== 'string' || typeof stamp.ts !== 'number')
|
|
72
147
|
return false;
|
|
73
|
-
//
|
|
74
|
-
//
|
|
75
|
-
|
|
148
|
+
// R5.11 / P1-2: bind the verifier to the ACTUAL request origin.
|
|
149
|
+
// The verifier MUST be told the actual origin (we don't reach into
|
|
150
|
+
// an HTTP request here — that's the caller's concern). If actualOrigin
|
|
151
|
+
// is empty / missing, the check rejects (production gate above throws).
|
|
152
|
+
if (!opts.actualOrigin || stamp.origin !== opts.actualOrigin)
|
|
153
|
+
return false;
|
|
154
|
+
// Defense in depth: even when actualOrigin matches, it must be in
|
|
155
|
+
// the operator-curated allowlist. Catches a misconfigured caller
|
|
156
|
+
// that wires the wrong header into `actualOrigin`.
|
|
157
|
+
if (!opts.allowedOrigins.includes(opts.actualOrigin))
|
|
158
|
+
return false;
|
|
159
|
+
// R5.11: method / path / sessionSid bindings. Empty matches empty.
|
|
160
|
+
// The stamp has the value iff mint supplied it; the same applies to
|
|
161
|
+
// opts. A mismatched declaration on either side rejects.
|
|
162
|
+
if ((stamp.method ?? undefined) !== (opts.method ?? undefined))
|
|
163
|
+
return false;
|
|
164
|
+
if ((stamp.path ?? undefined) !== (opts.path ?? undefined))
|
|
165
|
+
return false;
|
|
166
|
+
if ((stamp.sessionSid ?? undefined) !== (opts.sessionSid ?? undefined))
|
|
76
167
|
return false;
|
|
77
168
|
const now = Math.floor(Date.now() / 1000);
|
|
78
169
|
if (now - stamp.ts > CSRF_VALIDITY_SECONDS || now < stamp.ts)
|
package/dist/csrf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"csrf.js","sourceRoot":"","sources":["../src/csrf.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export { mintSession, verifySession, SESSION_COOKIE, SESSION_TTL_SECONDS } from './sessions';
|
|
2
|
-
export { csrfTokenFor, verifyCsrf } from './csrf';
|
|
3
|
-
export { deriveSaltFromLabel, deriveSaltFromEmail, type DeriveSaltFromEmailOpts } from './salt';
|
|
4
|
-
export { ERC1271_MAGIC, ERC6492_MAGIC, universalSignatureValidatorAbi, verifyUserSignature, verifyUserSignatureView, isErc6492Wrapped, } from './verify-signature';
|
|
5
|
-
export type { SignatureVerifyResult, VerifyUserSignatureArgs, UniversalValidatorClient, } from './verify-signature';
|
|
6
|
-
export { P256_N, base64urlEncode, base64urlDecode, parseDerSignature, normaliseLowS, buildWebAuthnAssertion, hashToWebAuthnChallenge, parseAttestationObject, parseAuthData, } from './methods/passkey';
|
|
7
|
-
export type { WebAuthnAssertion, ParsedAttestation } from './methods/passkey';
|
|
8
|
-
export type { Address, Hex, AuthMethod, JwtClaims, AuthenticatedUser, TypedDataDomain, TypedDataTypes, Signer, PasskeyAssertion, PasskeySigner, EOASigner, KMSSigner, } from './types';
|
|
1
|
+
export { mintSession, verifySession, SESSION_COOKIE, SESSION_TTL_SECONDS, DEFAULT_SESSION_CLOCK_SKEW_SEC, type VerifySessionOpts, } from './sessions.js';
|
|
2
|
+
export { csrfTokenFor, verifyCsrf, type CsrfBindings, type CsrfMintOpts, type CsrfVerifyOpts, } from './csrf.js';
|
|
3
|
+
export { deriveSaltFromLabel, deriveSaltFromEmail, type DeriveSaltFromEmailOpts } from './salt.js';
|
|
4
|
+
export { ERC1271_MAGIC, ERC6492_MAGIC, universalSignatureValidatorAbi, verifyUserSignature, verifyUserSignatureView, isErc6492Wrapped, } from './verify-signature.js';
|
|
5
|
+
export type { SignatureVerifyResult, VerifyUserSignatureArgs, UniversalValidatorClient, } from './verify-signature.js';
|
|
6
|
+
export { P256_N, base64urlEncode, base64urlDecode, parseDerSignature, normaliseLowS, buildWebAuthnAssertion, hashToWebAuthnChallenge, parseAttestationObject, parseAuthData, } from './methods/passkey.js';
|
|
7
|
+
export type { WebAuthnAssertion, ParsedAttestation } from './methods/passkey.js';
|
|
8
|
+
export type { Address, Hex, AuthMethod, JwtClaims, AuthenticatedUser, TypedDataDomain, TypedDataTypes, Signer, PasskeyAssertion, PasskeySigner, EOASigner, KMSSigner, } from './types.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,8BAA8B,EAC9B,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,GACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,KAAK,uBAAuB,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EACL,aAAa,EACb,aAAa,EACb,8BAA8B,EAC9B,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,YAAY,EACV,OAAO,EACP,GAAG,EACH,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,MAAM,EACN,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,SAAS,GACV,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @agenticprimitives/connect-auth — public API
|
|
2
2
|
//
|
|
3
3
|
// See ../../specs/200-connect-auth.md for the full contract.
|
|
4
|
-
export { mintSession, verifySession, SESSION_COOKIE, SESSION_TTL_SECONDS } from './sessions';
|
|
5
|
-
export { csrfTokenFor, verifyCsrf } from './csrf';
|
|
6
|
-
export { deriveSaltFromLabel, deriveSaltFromEmail } from './salt';
|
|
7
|
-
export { ERC1271_MAGIC, ERC6492_MAGIC, universalSignatureValidatorAbi, verifyUserSignature, verifyUserSignatureView, isErc6492Wrapped, } from './verify-signature';
|
|
4
|
+
export { mintSession, verifySession, SESSION_COOKIE, SESSION_TTL_SECONDS, DEFAULT_SESSION_CLOCK_SKEW_SEC, } from './sessions.js';
|
|
5
|
+
export { csrfTokenFor, verifyCsrf, } from './csrf.js';
|
|
6
|
+
export { deriveSaltFromLabel, deriveSaltFromEmail } from './salt.js';
|
|
7
|
+
export { ERC1271_MAGIC, ERC6492_MAGIC, universalSignatureValidatorAbi, verifyUserSignature, verifyUserSignatureView, isErc6492Wrapped, } from './verify-signature.js';
|
|
8
8
|
// WebAuthn ceremony helpers (preferred deep import:
|
|
9
9
|
// `@agenticprimitives/connect-auth/passkey` for tree-shaking — re-exported
|
|
10
10
|
// here for discoverability).
|
|
11
|
-
export { P256_N, base64urlEncode, base64urlDecode, parseDerSignature, normaliseLowS, buildWebAuthnAssertion, hashToWebAuthnChallenge, parseAttestationObject, parseAuthData, } from './methods/passkey';
|
|
11
|
+
export { P256_N, base64urlEncode, base64urlDecode, parseDerSignature, normaliseLowS, buildWebAuthnAssertion, hashToWebAuthnChallenge, parseAttestationObject, parseAuthData, } from './methods/passkey.js';
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,6DAA6D;AAE7D,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,EAAE;AACF,6DAA6D;AAE7D,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,8BAA8B,GAE/B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,UAAU,GAIX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAgC,MAAM,WAAW,CAAC;AACnG,OAAO,EACL,aAAa,EACb,aAAa,EACb,8BAA8B,EAC9B,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAO/B,oDAAoD;AACpD,2EAA2E;AAC3E,6BAA6B;AAC7B,OAAO,EACL,MAAM,EACN,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,aAAa,GACd,MAAM,sBAAsB,CAAC"}
|
package/dist/methods/google.d.ts
CHANGED
|
@@ -7,6 +7,12 @@ export interface OidcProviderConfig {
|
|
|
7
7
|
}
|
|
8
8
|
/** Google's stable OIDC endpoints (discovery doc values, pinned). */
|
|
9
9
|
export declare const GOOGLE_OIDC: OidcProviderConfig;
|
|
10
|
+
/** YouVersion Platform OIDC endpoints (developers.youversion.com/sign-in-apis, pinned). A PUBLIC PKCE
|
|
11
|
+
* client: the token exchange carries NO `client_secret` (pass `clientSecret: undefined` to completeLogin).
|
|
12
|
+
* YouVersion does not document an `email_verified` claim, so the consumer sets `requireEmailVerified:
|
|
13
|
+
* false` — the credential is keyed on (iss, sub), never on email, so this does not weaken takeover
|
|
14
|
+
* resistance. */
|
|
15
|
+
export declare const YOUVERSION_OIDC: OidcProviderConfig;
|
|
10
16
|
export interface BeginLoginInput {
|
|
11
17
|
clientId: string;
|
|
12
18
|
redirectUri: string;
|
|
@@ -52,16 +58,39 @@ export interface CompleteLoginInput {
|
|
|
52
58
|
/** Must match the value used in beginLogin. */
|
|
53
59
|
redirectUri: string;
|
|
54
60
|
clientId: string;
|
|
55
|
-
|
|
61
|
+
/** Confidential-client secret. OMIT for a PUBLIC PKCE client (e.g. YouVersion) — the token request
|
|
62
|
+
* then carries only `client_id` + `code_verifier`, never an (empty) `client_secret`. */
|
|
63
|
+
clientSecret?: string;
|
|
64
|
+
/** Require `email_verified === true` (default true — Google). Set false for providers that don't
|
|
65
|
+
* assert it (YouVersion); the facet is keyed on (iss, sub), not email, so this is safe. */
|
|
66
|
+
requireEmailVerified?: boolean;
|
|
67
|
+
/** Require the id_token `nonce` to match (default true — Google). Set false for providers whose
|
|
68
|
+
* non-standard multi-leg flow doesn't round-trip the authorize `nonce` into the id_token
|
|
69
|
+
* (YouVersion). PKCE (the code_verifier only we hold) already binds the code exchange, so this is
|
|
70
|
+
* safe — replay/injection of a stolen id_token still fails without the verifier. */
|
|
71
|
+
requireNonce?: boolean;
|
|
56
72
|
config?: OidcProviderConfig;
|
|
57
73
|
/** Injectable for tests (defaults to global fetch). */
|
|
58
74
|
fetchImpl?: typeof fetch;
|
|
59
75
|
/** Injectable clock in ms (defaults to Date.now). */
|
|
60
76
|
now?: () => number;
|
|
61
77
|
}
|
|
78
|
+
/** The provider OAuth tokens from the `/token` exchange. Returned so a consumer can custody the
|
|
79
|
+
* `accessToken` (+ `refreshToken`) to later call the provider's user-data APIs (spec 265). The broker
|
|
80
|
+
* uses ONLY the id_token for identity; these are additive and ignored unless a consumer opts to keep
|
|
81
|
+
* them (Google identity-only flows pass through untouched). */
|
|
82
|
+
export interface OidcTokens {
|
|
83
|
+
accessToken: string | null;
|
|
84
|
+
refreshToken: string | null;
|
|
85
|
+
/** Seconds until `accessToken` expires (provider `expires_in`). */
|
|
86
|
+
expiresIn: number | null;
|
|
87
|
+
/** Space-delimited granted scopes (provider `scope`). */
|
|
88
|
+
scope: string | null;
|
|
89
|
+
}
|
|
62
90
|
export type CompleteLoginResult = {
|
|
63
91
|
ok: true;
|
|
64
92
|
principal: OidcPrincipal;
|
|
93
|
+
tokens: OidcTokens;
|
|
65
94
|
} | {
|
|
66
95
|
ok: false;
|
|
67
96
|
reason: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/methods/google.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qEAAqE;AACrE,eAAO,MAAM,WAAW,EAAE,kBAKzB,CAAC;AA0DF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAqBnE;AAID,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iFAAiF;IACjF,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/methods/google.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,kBAAkB;IACjC,iFAAiF;IACjF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qEAAqE;AACrE,eAAO,MAAM,WAAW,EAAE,kBAKzB,CAAC;AAEF;;;;kBAIkB;AAClB,eAAO,MAAM,eAAe,EAAE,kBAO7B,CAAC;AA0DF,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CAqBnE;AAID,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iFAAiF;IACjF,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB;6FACyF;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;gGAC4F;IAC5F,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;;yFAGqF;IACrF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,uDAAuD;IACvD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED;;;gEAGgE;AAChE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yDAAyD;IACzD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAclC,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkF3F"}
|
package/dist/methods/google.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
// This method returns a *verified OIDC principal* (iss/sub/email). It does NOT
|
|
18
18
|
// resolve to a canonical Smart Agent — that binding is the directory's job
|
|
19
19
|
// (spec 223) and the broker's (spec 224); connect-auth must not import them.
|
|
20
|
-
import { sha256 } from '@noble/hashes/
|
|
20
|
+
import { sha256 } from '@noble/hashes/sha2.js';
|
|
21
21
|
/** Google's stable OIDC endpoints (discovery doc values, pinned). */
|
|
22
22
|
export const GOOGLE_OIDC = {
|
|
23
23
|
issuers: ['https://accounts.google.com', 'accounts.google.com'],
|
|
@@ -25,6 +25,19 @@ export const GOOGLE_OIDC = {
|
|
|
25
25
|
tokenEndpoint: 'https://oauth2.googleapis.com/token',
|
|
26
26
|
jwksUri: 'https://www.googleapis.com/oauth2/v3/certs',
|
|
27
27
|
};
|
|
28
|
+
/** YouVersion Platform OIDC endpoints (developers.youversion.com/sign-in-apis, pinned). A PUBLIC PKCE
|
|
29
|
+
* client: the token exchange carries NO `client_secret` (pass `clientSecret: undefined` to completeLogin).
|
|
30
|
+
* YouVersion does not document an `email_verified` claim, so the consumer sets `requireEmailVerified:
|
|
31
|
+
* false` — the credential is keyed on (iss, sub), never on email, so this does not weaken takeover
|
|
32
|
+
* resistance. */
|
|
33
|
+
export const YOUVERSION_OIDC = {
|
|
34
|
+
// YouVersion's id_token sets `iss` to the TOKEN ENDPOINT URL (observed live), not the base origin the
|
|
35
|
+
// docs state — accept both so we're robust to either.
|
|
36
|
+
issuers: ['https://api.youversion.com/auth/token', 'https://api.youversion.com'],
|
|
37
|
+
authorizationEndpoint: 'https://api.youversion.com/auth/authorize',
|
|
38
|
+
tokenEndpoint: 'https://api.youversion.com/auth/token',
|
|
39
|
+
jwksUri: 'https://api.youversion.com/.well-known/jwks.json',
|
|
40
|
+
};
|
|
28
41
|
// ─── base64url + random helpers ───────────────────────────────────────
|
|
29
42
|
function b64urlEncode(bytes) {
|
|
30
43
|
let s;
|
|
@@ -124,15 +137,19 @@ export async function completeLogin(input) {
|
|
|
124
137
|
}
|
|
125
138
|
// 2. Authorization-code → tokens (with PKCE code_verifier).
|
|
126
139
|
let idToken;
|
|
140
|
+
let tokens = { accessToken: null, refreshToken: null, expiresIn: null, scope: null };
|
|
127
141
|
try {
|
|
128
142
|
const body = new URLSearchParams({
|
|
129
143
|
grant_type: 'authorization_code',
|
|
130
144
|
code: input.code,
|
|
131
145
|
redirect_uri: input.redirectUri,
|
|
132
146
|
client_id: input.clientId,
|
|
133
|
-
client_secret: input.clientSecret,
|
|
134
147
|
code_verifier: input.codeVerifier,
|
|
135
148
|
});
|
|
149
|
+
// Confidential clients (Google) include the secret; public PKCE clients (YouVersion) MUST NOT send
|
|
150
|
+
// one — an empty `client_secret` makes some providers reject the exchange.
|
|
151
|
+
if (input.clientSecret)
|
|
152
|
+
body.set('client_secret', input.clientSecret);
|
|
136
153
|
const res = await doFetch(config.tokenEndpoint, {
|
|
137
154
|
method: 'POST',
|
|
138
155
|
headers: { 'content-type': 'application/x-www-form-urlencoded', accept: 'application/json' },
|
|
@@ -144,6 +161,14 @@ export async function completeLogin(input) {
|
|
|
144
161
|
if (!json.id_token)
|
|
145
162
|
return { ok: false, reason: 'token response missing id_token' };
|
|
146
163
|
idToken = json.id_token;
|
|
164
|
+
// Preserve the OAuth tokens (spec 265 — federated user-data access). Identity-only consumers ignore
|
|
165
|
+
// `tokens`; a consumer that wants to call the provider's user APIs custodies the access/refresh token.
|
|
166
|
+
tokens = {
|
|
167
|
+
accessToken: json.access_token ?? null,
|
|
168
|
+
refreshToken: json.refresh_token ?? null,
|
|
169
|
+
expiresIn: json.expires_in != null ? Number(json.expires_in) : null,
|
|
170
|
+
scope: json.scope ?? null,
|
|
171
|
+
};
|
|
147
172
|
}
|
|
148
173
|
catch (e) {
|
|
149
174
|
return { ok: false, reason: e instanceof Error ? `token exchange failed: ${e.message}` : 'token exchange failed' };
|
|
@@ -153,25 +178,29 @@ export async function completeLogin(input) {
|
|
|
153
178
|
config,
|
|
154
179
|
clientId: input.clientId,
|
|
155
180
|
expectedNonce: input.expectedNonce,
|
|
181
|
+
requireNonce: input.requireNonce !== false,
|
|
156
182
|
nowMs,
|
|
157
183
|
fetchImpl: doFetch,
|
|
158
184
|
});
|
|
159
185
|
if (!verified.ok)
|
|
160
186
|
return verified;
|
|
161
|
-
// 4. email_verified is mandatory (audit CN-3 / P0-3).
|
|
187
|
+
// 4. email_verified is mandatory by default (audit CN-3 / P0-3). Providers that don't assert the claim
|
|
188
|
+
// (YouVersion) opt out via `requireEmailVerified: false` — safe because the facet keys on (iss, sub).
|
|
162
189
|
const ev = verified.claims.email_verified;
|
|
163
190
|
const emailVerified = ev === true || ev === 'true';
|
|
164
|
-
if (!emailVerified)
|
|
191
|
+
if (input.requireEmailVerified !== false && !emailVerified) {
|
|
165
192
|
return { ok: false, reason: 'email_verified is not true' };
|
|
193
|
+
}
|
|
166
194
|
return {
|
|
167
195
|
ok: true,
|
|
168
196
|
principal: {
|
|
169
197
|
iss: verified.claims.iss,
|
|
170
198
|
sub: verified.claims.sub,
|
|
171
199
|
email: verified.claims.email ?? null,
|
|
172
|
-
emailVerified
|
|
200
|
+
emailVerified,
|
|
173
201
|
name: verified.claims.name ?? null,
|
|
174
202
|
},
|
|
203
|
+
tokens,
|
|
175
204
|
};
|
|
176
205
|
}
|
|
177
206
|
async function verifyIdToken(idToken, ctx) {
|
|
@@ -229,7 +258,7 @@ async function verifyIdToken(idToken, ctx) {
|
|
|
229
258
|
if (typeof claims.exp !== 'number' || claims.exp * 1000 <= ctx.nowMs) {
|
|
230
259
|
return { ok: false, reason: 'id_token expired' };
|
|
231
260
|
}
|
|
232
|
-
if (!claims.nonce || !constantTimeEqualStr(claims.nonce, ctx.expectedNonce)) {
|
|
261
|
+
if (ctx.requireNonce && (!claims.nonce || !constantTimeEqualStr(claims.nonce, ctx.expectedNonce))) {
|
|
233
262
|
return { ok: false, reason: 'id_token nonce mismatch' };
|
|
234
263
|
}
|
|
235
264
|
if (!claims.sub)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/methods/google.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,gFAAgF;AAChF,qCAAqC;AACrC,EAAE;AACF,0CAA0C;AAC1C,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,sEAAsE;AACtE,+EAA+E;AAC/E,qDAAqD;AACrD,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/methods/google.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,EAAE;AACF,+EAA+E;AAC/E,wEAAwE;AACxE,8EAA8E;AAC9E,gFAAgF;AAChF,qCAAqC;AACrC,EAAE;AACF,0CAA0C;AAC1C,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,sEAAsE;AACtE,+EAA+E;AAC/E,qDAAqD;AACrD,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAY/C,qEAAqE;AACrE,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,OAAO,EAAE,CAAC,6BAA6B,EAAE,qBAAqB,CAAC;IAC/D,qBAAqB,EAAE,8CAA8C;IACrE,aAAa,EAAE,qCAAqC;IACpD,OAAO,EAAE,4CAA4C;CACtD,CAAC;AAEF;;;;kBAIkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAuB;IACjD,sGAAsG;IACtG,sDAAsD;IACtD,OAAO,EAAE,CAAC,uCAAuC,EAAE,4BAA4B,CAAC;IAChF,qBAAqB,EAAE,2CAA2C;IAClE,aAAa,EAAE,uCAAuC;IACtD,OAAO,EAAE,kDAAkD;CAC5D,CAAC;AAEF,yEAAyE;AAEzE,SAAS,YAAY,CAAC,KAAiB;IACrC,IAAI,CAAS,CAAC;IACd,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,KAAK;YAAE,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,GAAG,CAAC;IACxC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACxF,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,CAAa;IAC/B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACvC,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,OAAO,IAAI,KAAK,CAAC,CAAC;AACpB,CAAC;AAuBD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC;IAC3C,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,uCAAuC;IAC9E,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,sBAAsB,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,KAAK,CAAC,QAAQ;QACzB,YAAY,EAAE,KAAK,CAAC,WAAW;QAC/B,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE;QAC3D,KAAK;QACL,KAAK;QACL,cAAc,EAAE,aAAa;QAC7B,qBAAqB,EAAE,MAAM;KAC9B,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAErD,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,qBAAqB,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACzG,CAAC;AA0ED,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IAClD,OAAO,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAyB;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC;IAC3C,6EAA6E;IAC7E,4EAA4E;IAC5E,+EAA+E;IAC/E,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAExC,6EAA6E;IAC7E,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;QAC5F,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACjD,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAe,CAAC;IACpB,IAAI,MAAM,GAAe,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,UAAU,EAAE,oBAAoB;YAChC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,YAAY,EAAE,KAAK,CAAC,WAAW;YAC/B,SAAS,EAAE,KAAK,CAAC,QAAQ;YACzB,aAAa,EAAE,KAAK,CAAC,YAAY;SAClC,CAAC,CAAC;QACH,mGAAmG;QACnG,2EAA2E;QAC3E,IAAI,KAAK,CAAC,YAAY;YAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC5F,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;SACtB,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAE7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAC;QACpF,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,oGAAoG;QACpG,uGAAuG;QACvG,MAAM,GAAG;YACP,WAAW,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI;YACtC,YAAY,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;YACxC,SAAS,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI;YACnE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC;IACrH,CAAC;IAED,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE;QAC5C,MAAM;QACN,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,KAAK,CAAC,YAAY,KAAK,KAAK;QAC1C,KAAK;QACL,SAAS,EAAE,OAAO;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAElC,uGAAuG;IACvG,yGAAyG;IACzG,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC;IAC1C,MAAM,aAAa,GAAG,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,MAAM,CAAC;IACnD,IAAI,KAAK,CAAC,oBAAoB,KAAK,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,SAAS,EAAE;YACT,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAI;YACzB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAI;YACzB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI;YACpC,aAAa;YACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI;SACnC;QACD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAAe,EACf,GAA2I;IAE3I,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;IACrF,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,KAAiC,CAAC;IAE1E,IAAI,MAAsC,CAAC;IAC3C,IAAI,MAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,wCAAwC,EAAE,CAAC;IACzE,CAAC;IAED,0EAA0E;IAC1E,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,oCAAoC,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;IAC5G,IAAI,CAAC,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAEtE,uCAAuC;IACvC,IAAI,GAAkC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAClF,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAoD,CAAC;QAClF,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;QAC7E,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;QACpF,GAAG,GAAG,KAAK,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC;IAC7G,CAAC;IAED,qDAAqD;IACrD,IAAI,cAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAClD,KAAK,EACL,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,EAAG,GAAsB,CAAC,CAAC,EAAE,CAAC,EAAG,GAAsB,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,EACrG,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,EAC9C,KAAK,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,cAAc,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CACpD,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAC7B,GAAG,EACH,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EACjC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,IAAI,UAAU,EAAE,CAAC,CAAC,CACnE,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,8BAA8B,EAAE,CAAC;IACnI,CAAC;IACD,IAAI,CAAC,cAAc;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;IAEhF,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC;IAC5E,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC;IAC1G,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sCAAsC,EAAE,CAAC;IACjF,IAAI,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACrE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACnD,CAAC;IACD,IAAI,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAClG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IAEtE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
* (branch 003-intent-marketplace-proposal) — adapted to agenticprimitives
|
|
21
21
|
* package boundaries.
|
|
22
22
|
*/
|
|
23
|
-
import type { Hex } from '../types';
|
|
23
|
+
import type { Hex } from '../types.js';
|
|
24
24
|
/** secp256r1 (P-256) group order. */
|
|
25
25
|
export declare const P256_N = 115792089210356248762697446949407573529996955224135760342422259061068512044369n;
|
|
26
26
|
export declare function base64urlEncode(bytes: Uint8Array): string;
|
|
@@ -91,16 +91,4 @@ export interface ParsedAttestation {
|
|
|
91
91
|
*/
|
|
92
92
|
export declare function parseAttestationObject(attestationObject: Uint8Array): ParsedAttestation;
|
|
93
93
|
export declare function parseAuthData(authData: Uint8Array): ParsedAttestation;
|
|
94
|
-
export interface PasskeySignupInput {
|
|
95
|
-
label: string;
|
|
96
|
-
challenge: Hex;
|
|
97
|
-
}
|
|
98
|
-
export declare function beginSignup(_input: {
|
|
99
|
-
label: string;
|
|
100
|
-
}): Promise<never>;
|
|
101
|
-
export declare function completeSignup(_req: unknown): Promise<never>;
|
|
102
|
-
export declare function beginLogin(_input: {
|
|
103
|
-
credentialId: string;
|
|
104
|
-
}): Promise<never>;
|
|
105
|
-
export declare function completeLogin(_req: unknown): Promise<never>;
|
|
106
94
|
//# sourceMappingURL=passkey.d.ts.map
|