@opensyber/tokenforge 1.0.0 → 1.1.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/README.md +130 -11
- package/dist/adapters/astro.d.ts +9 -0
- package/dist/adapters/astro.d.ts.map +1 -1
- package/dist/adapters/astro.js +13 -0
- package/dist/adapters/astro.js.map +1 -1
- package/dist/adapters/cloud-v2-bridge.d.ts +8 -0
- package/dist/adapters/cloud-v2-bridge.d.ts.map +1 -0
- package/dist/adapters/cloud-v2-bridge.js +24 -0
- package/dist/adapters/cloud-v2-bridge.js.map +1 -0
- package/dist/adapters/express.d.ts +15 -2
- package/dist/adapters/express.d.ts.map +1 -1
- package/dist/adapters/express.js +38 -0
- package/dist/adapters/express.js.map +1 -1
- package/dist/adapters/fastify.d.ts +15 -6
- package/dist/adapters/fastify.d.ts.map +1 -1
- package/dist/adapters/fastify.js +38 -0
- package/dist/adapters/fastify.js.map +1 -1
- package/dist/adapters/hono.d.ts +12 -0
- package/dist/adapters/hono.d.ts.map +1 -1
- package/dist/adapters/hono.js +13 -0
- package/dist/adapters/hono.js.map +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/nextjs.d.ts +15 -0
- package/dist/adapters/nextjs.d.ts.map +1 -1
- package/dist/adapters/nextjs.js +57 -30
- package/dist/adapters/nextjs.js.map +1 -1
- package/dist/adapters/sveltekit.d.ts +9 -0
- package/dist/adapters/sveltekit.d.ts.map +1 -1
- package/dist/adapters/sveltekit.js +13 -0
- package/dist/adapters/sveltekit.js.map +1 -1
- package/dist/client/action-signer.d.ts.map +1 -1
- package/dist/client/action-signer.js.map +1 -1
- package/dist/client/binding.d.ts.map +1 -1
- package/dist/client/binding.js.map +1 -1
- package/dist/client/cloud-device.d.ts +54 -0
- package/dist/client/cloud-device.d.ts.map +1 -0
- package/dist/client/cloud-device.js +301 -0
- package/dist/client/cloud-device.js.map +1 -0
- package/dist/client/crypto.d.ts.map +1 -1
- package/dist/client/crypto.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/interceptor.d.ts.map +1 -1
- package/dist/client/interceptor.js +27 -3
- package/dist/client/interceptor.js.map +1 -1
- package/dist/client/signer.d.ts +23 -3
- package/dist/client/signer.d.ts.map +1 -1
- package/dist/client/signer.js +33 -5
- package/dist/client/signer.js.map +1 -1
- package/dist/client/storage.d.ts.map +1 -1
- package/dist/client/storage.js.map +1 -1
- package/dist/client/webauthn.d.ts.map +1 -1
- package/dist/client/webauthn.js.map +1 -1
- package/dist/protocol/v2.d.ts +23 -0
- package/dist/protocol/v2.d.ts.map +1 -0
- package/dist/protocol/v2.js +157 -0
- package/dist/protocol/v2.js.map +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.js.map +1 -1
- package/dist/server/action-verify.d.ts.map +1 -1
- package/dist/server/action-verify.js +1 -1
- package/dist/server/action-verify.js.map +1 -1
- package/dist/server/activity-histogram.d.ts +47 -0
- package/dist/server/activity-histogram.d.ts.map +1 -0
- package/dist/server/activity-histogram.js +76 -0
- package/dist/server/activity-histogram.js.map +1 -0
- package/dist/server/aitm-heuristics.d.ts.map +1 -1
- package/dist/server/aitm-heuristics.js.map +1 -1
- package/dist/server/bind-with-id-token.d.ts +55 -0
- package/dist/server/bind-with-id-token.d.ts.map +1 -0
- package/dist/server/bind-with-id-token.js +70 -0
- package/dist/server/bind-with-id-token.js.map +1 -0
- package/dist/server/bound-cookie.d.ts.map +1 -1
- package/dist/server/bound-cookie.js.map +1 -1
- package/dist/server/cbor.d.ts.map +1 -1
- package/dist/server/cbor.js.map +1 -1
- package/dist/server/cloud-bind.d.ts +42 -0
- package/dist/server/cloud-bind.d.ts.map +1 -0
- package/dist/server/cloud-bind.js +387 -0
- package/dist/server/cloud-bind.js.map +1 -0
- package/dist/server/cloud-middleware.d.ts +46 -0
- package/dist/server/cloud-middleware.d.ts.map +1 -0
- package/dist/server/cloud-middleware.js +344 -0
- package/dist/server/cloud-middleware.js.map +1 -0
- package/dist/server/cloud-verify.d.ts +30 -0
- package/dist/server/cloud-verify.d.ts.map +1 -0
- package/dist/server/cloud-verify.js +206 -0
- package/dist/server/cloud-verify.js.map +1 -0
- package/dist/server/dbsc-challenge.d.ts.map +1 -1
- package/dist/server/dbsc-challenge.js.map +1 -1
- package/dist/server/dbsc-endpoint.d.ts +20 -0
- package/dist/server/dbsc-endpoint.d.ts.map +1 -0
- package/dist/server/dbsc-endpoint.js +85 -0
- package/dist/server/dbsc-endpoint.js.map +1 -0
- package/dist/server/dbsc-verify.d.ts +32 -0
- package/dist/server/dbsc-verify.d.ts.map +1 -0
- package/dist/server/dbsc-verify.js +65 -0
- package/dist/server/dbsc-verify.js.map +1 -0
- package/dist/server/identity-profile.d.ts +18 -0
- package/dist/server/identity-profile.d.ts.map +1 -0
- package/dist/server/identity-profile.js +113 -0
- package/dist/server/identity-profile.js.map +1 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/jws-verify.d.ts.map +1 -1
- package/dist/server/jws-verify.js.map +1 -1
- package/dist/server/middleware.d.ts +9 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +60 -20
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/oidc-verify.d.ts +16 -1
- package/dist/server/oidc-verify.d.ts.map +1 -1
- package/dist/server/oidc-verify.js +9 -1
- package/dist/server/oidc-verify.js.map +1 -1
- package/dist/server/policy.d.ts.map +1 -1
- package/dist/server/policy.js.map +1 -1
- package/dist/server/step-up-policy.d.ts.map +1 -1
- package/dist/server/step-up-policy.js.map +1 -1
- package/dist/server/storage/index.d.ts +3 -0
- package/dist/server/storage/index.d.ts.map +1 -0
- package/dist/server/storage/index.js +2 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/storage/interface.d.ts +73 -0
- package/dist/server/storage/interface.d.ts.map +1 -0
- package/dist/server/storage/interface.js +2 -0
- package/dist/server/storage/interface.js.map +1 -0
- package/dist/server/storage/memory.d.ts +50 -0
- package/dist/server/storage/memory.d.ts.map +1 -0
- package/dist/server/storage/memory.js +121 -0
- package/dist/server/storage/memory.js.map +1 -0
- package/dist/server/webauthn-verify.d.ts.map +1 -1
- package/dist/server/webauthn-verify.js.map +1 -1
- package/dist/server/webhooks.d.ts.map +1 -1
- package/dist/server/webhooks.js.map +1 -1
- package/dist/shared/action-hash.d.ts.map +1 -1
- package/dist/shared/action-hash.js.map +1 -1
- package/dist/shared/identity.d.ts +45 -0
- package/dist/shared/identity.d.ts.map +1 -0
- package/dist/shared/identity.js +176 -0
- package/dist/shared/identity.js.map +1 -0
- package/dist/shared/types-internal.d.ts.map +1 -1
- package/dist/shared/types-internal.js.map +1 -1
- package/dist/shared/types.d.ts +47 -2
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/types.js +1 -0
- package/dist/shared/types.js.map +1 -1
- package/package.json +9 -47
- package/dist/server/trust-score-fixtures.d.ts +0 -9
- package/dist/server/trust-score-fixtures.d.ts.map +0 -1
- package/dist/server/trust-score-fixtures.js +0 -23
- package/dist/server/trust-score-fixtures.js.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.d.ts +0 -8
- package/dist/server/webauthn-verify.test-helpers.d.ts.map +0 -1
- package/dist/server/webauthn-verify.test-helpers.js +0 -39
- package/dist/server/webauthn-verify.test-helpers.js.map +0 -1
package/README.md
CHANGED
|
@@ -3,6 +3,119 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/@opensyber/tokenforge)
|
|
4
4
|
[](./LICENSE.md)
|
|
5
5
|
|
|
6
|
+
## TokenForge Cloud v2 integration kit
|
|
7
|
+
|
|
8
|
+
The `1.1.0` Cloud path keeps the TokenForge bearer credential on the
|
|
9
|
+
application server. The browser creates a non-extractable P-256 key, binds only
|
|
10
|
+
through an authenticated application endpoint, and signs the exact v2 request
|
|
11
|
+
contract.
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { TokenForgeDevice } from '@opensyber/tokenforge/client';
|
|
15
|
+
|
|
16
|
+
const device = await TokenForgeDevice.open({
|
|
17
|
+
bindEndpoint: '/api/v1/auth/device/bind',
|
|
18
|
+
fetch: authenticatedFetch,
|
|
19
|
+
});
|
|
20
|
+
await device.bindAuthenticatedSession();
|
|
21
|
+
export const secureFetch = device.wrapFetch(authenticatedFetch);
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The server adapter is responsible for session resolution, the server-only
|
|
25
|
+
credential, local/cloud decision composition, circuit breaking, and telemetry.
|
|
26
|
+
Set `TOKENFORGE_CLOUD_MODE` to `off`, `monitor`, or `enforce`; default/unknown
|
|
27
|
+
values are `off`. In `monitor`, a locally valid request stays available while
|
|
28
|
+
cloud failures and would-block outcomes are reported. In `enforce`, definitive
|
|
29
|
+
cloud rejection or cloud unavailability rejects the request.
|
|
30
|
+
|
|
31
|
+
See `@opensyber/tokenforge-protocol@2.0.0-rc.1` for the normative binary
|
|
32
|
+
contract, schemas, migration guide, and cross-language vectors.
|
|
33
|
+
|
|
34
|
+
### Cloud v2 server boundary
|
|
35
|
+
|
|
36
|
+
Cloud v2 intentionally separates application authentication from TokenForge
|
|
37
|
+
device proof. The application owns the authenticated bind route and resolves
|
|
38
|
+
the current session on the server. Only that route may add a
|
|
39
|
+
`TokenForgeIdentity` envelope before delegating to the generic bind handler.
|
|
40
|
+
The browser never supplies trusted profile or subject fields.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import {
|
|
44
|
+
createTokenForgeCloudBindHandler,
|
|
45
|
+
createTokenForgeCloudMiddleware,
|
|
46
|
+
} from '@opensyber/tokenforge/server';
|
|
47
|
+
import type { TokenForgeIdentity } from '@opensyber/tokenforge/identity';
|
|
48
|
+
|
|
49
|
+
// Configure these once in server-only application code. The generated types
|
|
50
|
+
// describe the required session resolver, replay store, cloud client, mode,
|
|
51
|
+
// telemetry, and circuit-breaker dependencies.
|
|
52
|
+
export const bindDevice = createTokenForgeCloudBindHandler(bindOptions);
|
|
53
|
+
export const protectRequest = createTokenForgeCloudMiddleware(verifyOptions);
|
|
54
|
+
|
|
55
|
+
// Your authenticated route resolves identity from its own session or IdP,
|
|
56
|
+
// then passes the standard Request to bindDevice. Never forward identity data
|
|
57
|
+
// accepted from the browser.
|
|
58
|
+
const identity: TokenForgeIdentity = await resolveIdentityFromSession(request);
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Framework adapters expose the same verification contract without duplicating
|
|
62
|
+
cryptography or authorization logic:
|
|
63
|
+
|
|
64
|
+
| Framework | Cloud v2 entry point | Request bridge |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| Next.js | `withTokenForgeCloudV2` / `tokenForgeCloudV2Check` | Native `Request` |
|
|
67
|
+
| Hono | `tokenForgeCloudV2Middleware` | `context.req.raw` |
|
|
68
|
+
| SvelteKit | `tokenForgeCloudV2Handle` | `event.request` |
|
|
69
|
+
| Astro | `tokenForgeCloudV2Middleware` | `context.request` |
|
|
70
|
+
| Express | `tokenForgeCloudV2Middleware` | Explicit `toRequest` required |
|
|
71
|
+
| Fastify | `tokenForgeCloudV2Plugin` | Explicit `toRequest` required |
|
|
72
|
+
|
|
73
|
+
Express and Fastify require an application-owned `toRequest` converter because
|
|
74
|
+
the SDK must not guess the external origin, proxy trust, or request-body
|
|
75
|
+
semantics. Conversion failure is rejected rather than silently bypassing
|
|
76
|
+
TokenForge.
|
|
77
|
+
|
|
78
|
+
The same named bind adapter is available from every framework entry point:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { createTokenForgeCloudBindHandler } from '@opensyber/tokenforge/server';
|
|
82
|
+
import { tokenForgeCloudV2BindRoute } from '@opensyber/tokenforge/nextjs';
|
|
83
|
+
|
|
84
|
+
const bindDevice = createTokenForgeCloudBindHandler(bindOptions);
|
|
85
|
+
export const POST = tokenForgeCloudV2BindRoute(bindDevice);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
For Hono, SvelteKit, and Astro, pass the same generic handler to
|
|
89
|
+
`tokenForgeCloudV2BindRoute`. Express and Fastify take a second argument with
|
|
90
|
+
the same explicit `toRequest` converter used by their verification adapter:
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
app.post(
|
|
94
|
+
'/api/v1/auth/device/bind',
|
|
95
|
+
tokenForgeCloudV2BindRoute(bindDevice, { toRequest }),
|
|
96
|
+
);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Mount this route only after the application's authentication middleware. The
|
|
100
|
+
generic bind handler must resolve the session and identity from trusted
|
|
101
|
+
server-side state; never copy subject or profile fields from the request body.
|
|
102
|
+
|
|
103
|
+
Recommended adoption order:
|
|
104
|
+
|
|
105
|
+
1. Mount the authenticated bind route and verify identity correlation in
|
|
106
|
+
`off` mode.
|
|
107
|
+
2. Enable `monitor` and inspect local denials, cloud would-block decisions,
|
|
108
|
+
outages, and replay telemetry without changing application availability.
|
|
109
|
+
3. Resolve all unexplained monitor findings and switch selected protected paths
|
|
110
|
+
to `enforce`.
|
|
111
|
+
4. Keep public health, callback, and webhook paths in the exact `skipPaths`
|
|
112
|
+
allowlist; do not use substring matching.
|
|
113
|
+
|
|
114
|
+
The older `tokenForgeMiddleware`, `tokenForgePlugin`, `withTokenForge`, and
|
|
115
|
+
`tokenForgeHandle` examples below use the legacy v1 fail-open cloud behavior.
|
|
116
|
+
They remain exported for staged migration but should not be selected for a new
|
|
117
|
+
Cloud v2 integration.
|
|
118
|
+
|
|
6
119
|
**Device-bound session security for the post-AiTM era.** W3C [DBSC](https://w3c.github.io/webappsec-dbsc/)–aligned, ECDSA P-256 + WebAuthn, drop-in for Auth0 / Okta / Clerk / Microsoft Entra ID. Every request after login is cryptographically signed with a device key that never leaves the browser. A stolen cookie without the device key is useless.
|
|
7
120
|
|
|
8
121
|
## Why this matters in 2026
|
|
@@ -14,16 +127,22 @@
|
|
|
14
127
|
|
|
15
128
|
## Quick Start
|
|
16
129
|
|
|
17
|
-
### 1.
|
|
130
|
+
### 1. Initialize after authenticated login
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
import { TokenForgeDevice } from '@opensyber/tokenforge/client';
|
|
18
134
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
135
|
+
const device = await TokenForgeDevice.open({
|
|
136
|
+
bindEndpoint: '/api/v1/auth/device/bind',
|
|
137
|
+
fetch: authenticatedFetch,
|
|
138
|
+
});
|
|
139
|
+
await device.bindAuthenticatedSession();
|
|
140
|
+
const secureFetch = device.wrapFetch(authenticatedFetch);
|
|
24
141
|
```
|
|
25
142
|
|
|
26
|
-
The
|
|
143
|
+
The browser receives no TokenForge API key. It generates a non-extractable
|
|
144
|
+
ECDSA P-256 device key, sends only the public JWK through the authenticated
|
|
145
|
+
application bind endpoint, and signs the exact request-bound v2 contract.
|
|
27
146
|
|
|
28
147
|
### 2. Add server middleware
|
|
29
148
|
|
|
@@ -32,20 +151,20 @@ npm install @opensyber/tokenforge
|
|
|
32
151
|
```
|
|
33
152
|
|
|
34
153
|
```ts
|
|
35
|
-
// Express
|
|
154
|
+
// Legacy v1 Express migration path
|
|
36
155
|
import { tokenForgeMiddleware } from '@opensyber/tokenforge/express';
|
|
37
156
|
app.use(tokenForgeMiddleware({ apiKey: process.env.TOKENFORGE_API_KEY! }));
|
|
38
157
|
// req.tf.bound, req.tf.trustScore, req.tf.deviceId
|
|
39
158
|
|
|
40
|
-
// Next.js
|
|
159
|
+
// Legacy v1 Next.js migration path
|
|
41
160
|
import { withTokenForge } from '@opensyber/tokenforge/nextjs';
|
|
42
161
|
export const GET = withTokenForge(handler, { apiKey: process.env.TOKENFORGE_API_KEY! });
|
|
43
162
|
|
|
44
|
-
// Fastify
|
|
163
|
+
// Legacy v1 Fastify migration path
|
|
45
164
|
import { tokenForgePlugin } from '@opensyber/tokenforge/fastify';
|
|
46
165
|
fastify.register(tokenForgePlugin, { apiKey: process.env.TOKENFORGE_API_KEY! });
|
|
47
166
|
|
|
48
|
-
// Hono
|
|
167
|
+
// Legacy v1 Hono migration path
|
|
49
168
|
import { tokenForgeMiddleware } from '@opensyber/tokenforge/hono';
|
|
50
169
|
app.use('/api/*', tokenForgeMiddleware({ apiKey: env.TOKENFORGE_API_KEY }));
|
|
51
170
|
```
|
package/dist/adapters/astro.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
|
|
1
2
|
/** TokenForge context attached to context.locals.tf */
|
|
2
3
|
export interface TfContext {
|
|
3
4
|
bound: boolean;
|
|
@@ -51,5 +52,13 @@ export declare function requireFreshSig(locals: {
|
|
|
51
52
|
}, opts?: {
|
|
52
53
|
minTrustScore?: number;
|
|
53
54
|
}): Response | null;
|
|
55
|
+
export type TokenForgeAstroCloudV2Options = TokenForgeCloudV2AdapterOptions;
|
|
56
|
+
/** Astro middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
57
|
+
export declare function tokenForgeCloudV2Middleware(options: TokenForgeAstroCloudV2Options): MiddlewareHandler;
|
|
58
|
+
export interface TokenForgeAstroCloudV2RouteContext {
|
|
59
|
+
request: Request;
|
|
60
|
+
}
|
|
61
|
+
/** Adapt the generic Cloud v2 bind handler to an Astro API route. */
|
|
62
|
+
export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): (context: TokenForgeAstroCloudV2RouteContext) => Promise<Response>;
|
|
54
63
|
export {};
|
|
55
64
|
//# sourceMappingURL=astro.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astro.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"astro.d.ts","sourceRoot":"../src/","sources":["adapters/astro.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,uDAAuD;AACvD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wCAAwC;AACxC,MAAM,WAAW,sBAAsB;IACrC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,sEAAsE;AACtE,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,MAAM,EAAE;QAAE,EAAE,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,KAAK,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AAC9C,KAAK,iBAAiB,GAAG,CACvB,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,cAAc,KACjB,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,sBAAsB,GAC9B,iBAAiB,CAoEnB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,SAAS,CAAA;CAAE,EAC1B,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACpC,QAAQ,GAAG,IAAI,CAcjB;AASD,MAAM,MAAM,6BAA6B,GAAG,+BAA+B,CAAC;AAE5E,2EAA2E;AAC3E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,6BAA6B,GACrC,iBAAiB,CAOnB;AAED,MAAM,WAAW,kCAAkC;IACjD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,qEAAqE;AACrE,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,IAGtC,SAAS,kCAAkC,KAC1C,OAAO,CAAC,QAAQ,CAAC,CACrB"}
|
package/dist/adapters/astro.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createTokenForgeCloudV2Gate, } from './cloud-v2-bridge.js';
|
|
1
2
|
const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
|
|
2
3
|
/**
|
|
3
4
|
* Astro middleware for TokenForge verification via the cloud API.
|
|
@@ -88,4 +89,16 @@ function shouldSkip(path, skipPaths) {
|
|
|
88
89
|
return false;
|
|
89
90
|
return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
|
|
90
91
|
}
|
|
92
|
+
/** Astro middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
93
|
+
export function tokenForgeCloudV2Middleware(options) {
|
|
94
|
+
const gate = createTokenForgeCloudV2Gate(options);
|
|
95
|
+
return async (context, next) => {
|
|
96
|
+
const rejection = await gate(context.request);
|
|
97
|
+
return rejection ?? next();
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Adapt the generic Cloud v2 bind handler to an Astro API route. */
|
|
101
|
+
export function tokenForgeCloudV2BindRoute(handler) {
|
|
102
|
+
return async (context) => handler(context.request);
|
|
103
|
+
}
|
|
91
104
|
//# sourceMappingURL=astro.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"astro.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"astro.js","sourceRoot":"../src/","sources":["adapters/astro.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type TokenForgeCloudMiddlewareOptions } from '../server/cloud-middleware.js';
|
|
2
|
+
export type TokenForgeCloudV2AdapterOptions = TokenForgeCloudMiddlewareOptions;
|
|
3
|
+
export type TokenForgeCloudV2RequestHandler = (request: Request) => Response | Promise<Response>;
|
|
4
|
+
/** Convert the shared Fetch middleware into a framework-friendly allow/deny gate. */
|
|
5
|
+
export declare function createTokenForgeCloudV2Gate(options: TokenForgeCloudMiddlewareOptions): (request: Request) => Promise<Response | null>;
|
|
6
|
+
/** Preserve structured Cloud v2 denials when adapting Fetch responses. */
|
|
7
|
+
export declare function tokenForgeCloudV2ResponseBody(response: Response): Promise<unknown>;
|
|
8
|
+
//# sourceMappingURL=cloud-v2-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-v2-bridge.d.ts","sourceRoot":"../src/","sources":["adapters/cloud-v2-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,gCAAgC,EACtC,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,+BAA+B,GAAG,gCAAgC,CAAC;AAC/E,MAAM,MAAM,+BAA+B,GAAG,CAC5C,OAAO,EAAE,OAAO,KACb,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC,qFAAqF;AACrF,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,gCAAgC,GACxC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQhD;AAED,0EAA0E;AAC1E,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createTokenForgeCloudMiddleware, } from '../server/cloud-middleware.js';
|
|
2
|
+
/** Convert the shared Fetch middleware into a framework-friendly allow/deny gate. */
|
|
3
|
+
export function createTokenForgeCloudV2Gate(options) {
|
|
4
|
+
const middleware = createTokenForgeCloudMiddleware(options);
|
|
5
|
+
return async (request) => {
|
|
6
|
+
const allowed = new Response(null, { status: 204 });
|
|
7
|
+
const result = await middleware(() => allowed)(request);
|
|
8
|
+
return result === allowed ? null : result;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/** Preserve structured Cloud v2 denials when adapting Fetch responses. */
|
|
12
|
+
export async function tokenForgeCloudV2ResponseBody(response) {
|
|
13
|
+
try {
|
|
14
|
+
if (response.headers.get('content-type')?.includes('application/json')) {
|
|
15
|
+
return await response.json();
|
|
16
|
+
}
|
|
17
|
+
const body = await response.text();
|
|
18
|
+
return body || null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { error: 'tokenforge_request_rejected' };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=cloud-v2-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-v2-bridge.js","sourceRoot":"../src/","sources":["adapters/cloud-v2-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,GAEhC,MAAM,+BAA+B,CAAC;AAOvC,qFAAqF;AACrF,MAAM,UAAU,2BAA2B,CACzC,OAAyC;IAEzC,MAAM,UAAU,GAAG,+BAA+B,CAAC,OAAO,CAAC,CAAC;IAE5D,OAAO,KAAK,EAAE,OAAgB,EAA4B,EAAE;QAC1D,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,QAAkB;IAElB,IAAI,CAAC;QACH,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACvE,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,IAAI,IAAI,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
|
|
1
2
|
/** Express request (minimal interface). */
|
|
2
|
-
interface ExpressRequest {
|
|
3
|
+
export interface ExpressRequest {
|
|
3
4
|
path: string;
|
|
4
5
|
method: string;
|
|
5
6
|
headers: Record<string, string | string[] | undefined>;
|
|
@@ -7,7 +8,7 @@ interface ExpressRequest {
|
|
|
7
8
|
tf?: TfContext;
|
|
8
9
|
[key: string]: unknown;
|
|
9
10
|
}
|
|
10
|
-
interface ExpressResponse {
|
|
11
|
+
export interface ExpressResponse {
|
|
11
12
|
status(code: number): ExpressResponse;
|
|
12
13
|
json(body: unknown): void;
|
|
13
14
|
}
|
|
@@ -44,6 +45,18 @@ export interface TokenForgeExpressOptions {
|
|
|
44
45
|
* - `deviceId: string | null` — device identifier
|
|
45
46
|
*/
|
|
46
47
|
export declare function tokenForgeMiddleware(options: TokenForgeExpressOptions): (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => Promise<void>;
|
|
48
|
+
export interface TokenForgeExpressCloudV2Options extends TokenForgeCloudV2AdapterOptions {
|
|
49
|
+
/** Convert the framework request without guessing its origin or body semantics. */
|
|
50
|
+
toRequest(request: ExpressRequest): Request;
|
|
51
|
+
}
|
|
52
|
+
/** Express middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
53
|
+
export declare function tokenForgeCloudV2Middleware(options: TokenForgeExpressCloudV2Options): (request: ExpressRequest, response: ExpressResponse & {
|
|
54
|
+
setHeader?: (name: string, value: string) => void;
|
|
55
|
+
}, next: NextFunction) => Promise<void>;
|
|
56
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Express route. */
|
|
57
|
+
export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler, options: Pick<TokenForgeExpressCloudV2Options, 'toRequest'>): (request: ExpressRequest, response: ExpressResponse & {
|
|
58
|
+
setHeader?: (name: string, value: string) => void;
|
|
59
|
+
}) => Promise<void>;
|
|
47
60
|
/**
|
|
48
61
|
* Per-route step-up gate. Use after `tokenForgeMiddleware` ran globally,
|
|
49
62
|
* mounted on the routes that need elevated trust.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"express.d.ts","sourceRoot":"../src/","sources":["adapters/express.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,4CAA4C;AAC5C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,KAAK,YAAY,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAE5C,0CAA0C;AAC1C,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,wBAAwB,IAGtD,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAwD5F;AAOD,MAAM,WAAW,+BACf,SAAQ,+BAA+B;IACvC,mFAAmF;IACnF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;CAC7C;AAED,6EAA6E;AAC7E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,+BAA+B,IAKtC,SAAS,cAAc,EACvB,UAAU,eAAe,GAAG;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,EACD,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAoBjB;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,WAAW,CAAC,IAGzD,SAAS,cAAc,EACvB,UAAU,eAAe,GAAG;IAC1B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,KACA,OAAO,CAAC,IAAI,CAAC,CAejB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAE3D,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,KAAG,IAAI,CAY7E"}
|
package/dist/adapters/express.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createTokenForgeCloudV2Gate, tokenForgeCloudV2ResponseBody, } from './cloud-v2-bridge.js';
|
|
1
2
|
const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
|
|
2
3
|
/**
|
|
3
4
|
* Express middleware for TokenForge verification via the cloud API.
|
|
@@ -70,6 +71,43 @@ function shouldSkip(path, skipPaths) {
|
|
|
70
71
|
return false;
|
|
71
72
|
return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
|
|
72
73
|
}
|
|
74
|
+
/** Express middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
75
|
+
export function tokenForgeCloudV2Middleware(options) {
|
|
76
|
+
const gate = createTokenForgeCloudV2Gate(options);
|
|
77
|
+
return async (request, response, next) => {
|
|
78
|
+
let fetchRequest;
|
|
79
|
+
try {
|
|
80
|
+
fetchRequest = options.toRequest(request);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
response.status(500).json({ error: 'tokenforge_adapter_invalid_request' });
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const rejection = await gate(fetchRequest);
|
|
87
|
+
if (!rejection) {
|
|
88
|
+
next();
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
rejection.headers.forEach((value, name) => response.setHeader?.(name, value));
|
|
92
|
+
response.status(rejection.status).json(await tokenForgeCloudV2ResponseBody(rejection));
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Express route. */
|
|
96
|
+
export function tokenForgeCloudV2BindRoute(handler, options) {
|
|
97
|
+
return async (request, response) => {
|
|
98
|
+
let fetchRequest;
|
|
99
|
+
try {
|
|
100
|
+
fetchRequest = options.toRequest(request);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
response.status(500).json({ error: 'tokenforge_adapter_invalid_request' });
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const result = await handler(fetchRequest);
|
|
107
|
+
result.headers.forEach((value, name) => response.setHeader?.(name, value));
|
|
108
|
+
response.status(result.status).json(await tokenForgeCloudV2ResponseBody(result));
|
|
109
|
+
};
|
|
110
|
+
}
|
|
73
111
|
/**
|
|
74
112
|
* Per-route step-up gate. Use after `tokenForgeMiddleware` ran globally,
|
|
75
113
|
* mounted on the routes that need elevated trust.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"express.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"express.js","sourceRoot":"../src/","sources":["adapters/express.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
|
|
1
2
|
/** TokenForge context attached to request.tf */
|
|
2
3
|
export interface TfContext {
|
|
3
4
|
bound: boolean;
|
|
@@ -13,19 +14,20 @@ export interface TokenForgeFastifyOptions {
|
|
|
13
14
|
/** Paths to skip verification. */
|
|
14
15
|
skipPaths?: string[];
|
|
15
16
|
}
|
|
16
|
-
interface FastifyRequest {
|
|
17
|
+
export interface FastifyRequest {
|
|
17
18
|
url: string;
|
|
18
19
|
method: string;
|
|
19
20
|
headers: Record<string, string | string[] | undefined>;
|
|
20
21
|
ip?: string;
|
|
21
22
|
tf?: TfContext;
|
|
22
23
|
}
|
|
23
|
-
interface FastifyReply {
|
|
24
|
+
export interface FastifyReply {
|
|
24
25
|
code(statusCode: number): FastifyReply;
|
|
25
|
-
|
|
26
|
+
header?(name: string, value: string): FastifyReply;
|
|
27
|
+
send(payload: unknown): FastifyReply;
|
|
26
28
|
}
|
|
27
|
-
interface FastifyInstance {
|
|
28
|
-
addHook(name: 'preHandler', handler: (req: FastifyRequest, reply: FastifyReply) => Promise<void>): void;
|
|
29
|
+
export interface FastifyInstance {
|
|
30
|
+
addHook(name: 'preHandler', handler: (req: FastifyRequest, reply: FastifyReply) => Promise<void | FastifyReply>): void;
|
|
29
31
|
decorateRequest(name: string, value: unknown): void;
|
|
30
32
|
}
|
|
31
33
|
/**
|
|
@@ -40,6 +42,14 @@ interface FastifyInstance {
|
|
|
40
42
|
* ```
|
|
41
43
|
*/
|
|
42
44
|
export declare function tokenForgePlugin(fastify: FastifyInstance, options: TokenForgeFastifyOptions, done: (err?: Error) => void): void;
|
|
45
|
+
export interface TokenForgeFastifyCloudV2Options extends TokenForgeCloudV2AdapterOptions {
|
|
46
|
+
/** Convert the framework request without guessing its origin or body semantics. */
|
|
47
|
+
toRequest(request: FastifyRequest): Request;
|
|
48
|
+
}
|
|
49
|
+
/** Register fail-closed Cloud v2 verification as a Fastify pre-handler. */
|
|
50
|
+
export declare function tokenForgeCloudV2Plugin(fastify: FastifyInstance, options: TokenForgeFastifyCloudV2Options): Promise<void>;
|
|
51
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Fastify route. */
|
|
52
|
+
export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler, options: Pick<TokenForgeFastifyCloudV2Options, 'toRequest'>): (request: FastifyRequest, reply: FastifyReply) => Promise<FastifyReply>;
|
|
43
53
|
/**
|
|
44
54
|
* Per-route step-up gate. Register after `tokenForgePlugin` ran globally,
|
|
45
55
|
* scoped to a route that needs elevated trust.
|
|
@@ -57,5 +67,4 @@ export declare function tokenForgePlugin(fastify: FastifyInstance, options: Toke
|
|
|
57
67
|
export declare function requireFreshSig(opts?: {
|
|
58
68
|
minTrustScore?: number;
|
|
59
69
|
}): (req: FastifyRequest, reply: FastifyReply) => Promise<void>;
|
|
60
|
-
export {};
|
|
61
70
|
//# sourceMappingURL=fastify.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"fastify.d.ts","sourceRoot":"../src/","sources":["adapters/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAI9B,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,wBAAwB;IACvC,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAAC;IACvC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAAC;IACnD,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CACL,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CACP,GAAG,EAAE,cAAc,EACnB,KAAK,EAAE,YAAY,KAChB,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC,GAChC,IAAI,CAAC;IACR,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,wBAAwB,EACjC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK,IAAI,GAC1B,IAAI,CA6DN;AAOD,MAAM,WAAW,+BACf,SAAQ,+BAA+B;IACvC,mFAAmF;IACnF,SAAS,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;CAC7C;AAED,2EAA2E;AAC3E,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,iFAAiF;AACjF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,IAAI,CAAC,+BAA+B,EAAE,WAAW,CAAC,IAGzD,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,YAAY,CAAC,CAgBzB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,IAErD,KAAK,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAAC,CAUvE"}
|
package/dist/adapters/fastify.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createTokenForgeCloudV2Gate, tokenForgeCloudV2ResponseBody, } from './cloud-v2-bridge.js';
|
|
1
2
|
const DEFAULT_API_BASE = 'https://tokenforge-api.opensyber.cloud';
|
|
2
3
|
/**
|
|
3
4
|
* Fastify plugin for TokenForge verification via the cloud API.
|
|
@@ -66,6 +67,43 @@ function shouldSkip(path, skipPaths) {
|
|
|
66
67
|
return false;
|
|
67
68
|
return skipPaths.some((p) => p.endsWith('*') ? path.startsWith(p.slice(0, -1)) : path === p);
|
|
68
69
|
}
|
|
70
|
+
/** Register fail-closed Cloud v2 verification as a Fastify pre-handler. */
|
|
71
|
+
export async function tokenForgeCloudV2Plugin(fastify, options) {
|
|
72
|
+
const gate = createTokenForgeCloudV2Gate(options);
|
|
73
|
+
fastify.addHook('preHandler', async (request, reply) => {
|
|
74
|
+
let fetchRequest;
|
|
75
|
+
try {
|
|
76
|
+
fetchRequest = options.toRequest(request);
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return reply.code(500).send({
|
|
80
|
+
error: 'tokenforge_adapter_invalid_request',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
const rejection = await gate(fetchRequest);
|
|
84
|
+
if (!rejection)
|
|
85
|
+
return;
|
|
86
|
+
rejection.headers.forEach((value, name) => reply.header?.(name, value));
|
|
87
|
+
return reply.code(rejection.status).send(await tokenForgeCloudV2ResponseBody(rejection));
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Fastify route. */
|
|
91
|
+
export function tokenForgeCloudV2BindRoute(handler, options) {
|
|
92
|
+
return async (request, reply) => {
|
|
93
|
+
let fetchRequest;
|
|
94
|
+
try {
|
|
95
|
+
fetchRequest = options.toRequest(request);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return reply.code(500).send({
|
|
99
|
+
error: 'tokenforge_adapter_invalid_request',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const result = await handler(fetchRequest);
|
|
103
|
+
result.headers.forEach((value, name) => reply.header?.(name, value));
|
|
104
|
+
return reply.code(result.status).send(await tokenForgeCloudV2ResponseBody(result));
|
|
105
|
+
};
|
|
106
|
+
}
|
|
69
107
|
/**
|
|
70
108
|
* Per-route step-up gate. Register after `tokenForgePlugin` ran globally,
|
|
71
109
|
* scoped to a route that needs elevated trust.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastify.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"fastify.js","sourceRoot":"../src/","sources":["adapters/fastify.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/hono.d.ts
CHANGED
|
@@ -7,6 +7,18 @@
|
|
|
7
7
|
* published tarball. Self-hosting customers should use the source repo
|
|
8
8
|
* directly instead of the npm package.
|
|
9
9
|
*/
|
|
10
|
+
import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
|
|
10
11
|
export { tokenForgeMiddleware, requireFreshSig } from '../server/middleware.js';
|
|
11
12
|
export type { TokenForgeOptions } from '../server/middleware.js';
|
|
13
|
+
export interface HonoCloudV2Context {
|
|
14
|
+
req: {
|
|
15
|
+
raw: Request;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
type HonoCloudV2Next = () => Promise<void | Response>;
|
|
19
|
+
export type TokenForgeHonoCloudV2Options = TokenForgeCloudV2AdapterOptions;
|
|
20
|
+
/** Hono middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
21
|
+
export declare function tokenForgeCloudV2Middleware(options: TokenForgeHonoCloudV2Options): (context: HonoCloudV2Context, next: HonoCloudV2Next) => Promise<void | Response>;
|
|
22
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Hono route. */
|
|
23
|
+
export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): (context: HonoCloudV2Context) => Response | Promise<Response>;
|
|
12
24
|
//# sourceMappingURL=hono.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"hono.d.ts","sourceRoot":"../src/","sources":["adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAEL,KAAK,+BAA+B,EACpC,KAAK,+BAA+B,EACrC,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChF,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE;QAAE,GAAG,EAAE,OAAO,CAAA;KAAE,CAAC;CACvB;AAED,KAAK,eAAe,GAAG,MAAM,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAC;AAEtD,MAAM,MAAM,4BAA4B,GAAG,+BAA+B,CAAC;AAE3E,0EAA0E;AAC1E,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,4BAA4B,IAKnC,SAAS,kBAAkB,EAC3B,MAAM,eAAe,KACpB,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,CAI5B;AAED,8EAA8E;AAC9E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,+BAA+B,IAEhC,SAAS,kBAAkB,KAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAEnE"}
|
package/dist/adapters/hono.js
CHANGED
|
@@ -7,5 +7,18 @@
|
|
|
7
7
|
* published tarball. Self-hosting customers should use the source repo
|
|
8
8
|
* directly instead of the npm package.
|
|
9
9
|
*/
|
|
10
|
+
import { createTokenForgeCloudV2Gate, } from './cloud-v2-bridge.js';
|
|
10
11
|
export { tokenForgeMiddleware, requireFreshSig } from '../server/middleware.js';
|
|
12
|
+
/** Hono middleware backed by the shared fail-closed Cloud v2 contract. */
|
|
13
|
+
export function tokenForgeCloudV2Middleware(options) {
|
|
14
|
+
const gate = createTokenForgeCloudV2Gate(options);
|
|
15
|
+
return async (context, next) => {
|
|
16
|
+
const rejection = await gate(context.req.raw);
|
|
17
|
+
return rejection ?? next();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/** Adapt the generic Cloud v2 bind handler to an authenticated Hono route. */
|
|
21
|
+
export function tokenForgeCloudV2BindRoute(handler) {
|
|
22
|
+
return (context) => handler(context.req.raw);
|
|
23
|
+
}
|
|
11
24
|
//# sourceMappingURL=hono.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hono.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"hono.js","sourceRoot":"../src/","sources":["adapters/hono.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EACL,2BAA2B,GAG5B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAWhF,0EAA0E;AAC1E,MAAM,UAAU,2BAA2B,CACzC,OAAqC;IAErC,MAAM,IAAI,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAElD,OAAO,KAAK,EACV,OAA2B,EAC3B,IAAqB,EACK,EAAE;QAC5B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,SAAS,IAAI,IAAI,EAAE,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,0BAA0B,CACxC,OAAwC;IAExC,OAAO,CAAC,OAA2B,EAAgC,EAAE,CACnE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"../src/","sources":["adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../src/","sources":["adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,cAAc,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAC3G,OAAO,EAAE,oBAAoB,IAAI,iBAAiB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpH,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,eAAe,IAAI,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,IAAI,eAAe,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TokenForgeCloudV2AdapterOptions, type TokenForgeCloudV2RequestHandler } from './cloud-v2-bridge.js';
|
|
1
2
|
type NextRequest = Request & {
|
|
2
3
|
nextUrl?: {
|
|
3
4
|
pathname: string;
|
|
@@ -63,5 +64,19 @@ export declare function tokenForgeCheck(req: NextRequest, options: TokenForgeNex
|
|
|
63
64
|
export declare function withFreshSig(handler: (req: NextRequest, tf: TfContext) => Promise<Response>, opts?: {
|
|
64
65
|
minTrustScore?: number;
|
|
65
66
|
}): (req: NextRequest, tf: TfContext) => Promise<Response>;
|
|
67
|
+
/**
|
|
68
|
+
* Cross-adapter alias for {@link withFreshSig}. The 5 non-Next.js adapters
|
|
69
|
+
* (astro / express / fastify / hono / sveltekit) all export `requireFreshSig`;
|
|
70
|
+
* exposing the same name here keeps the per-adapter docs uniform so the
|
|
71
|
+
* Sprint 39 step-up snippet doesn't fork by framework.
|
|
72
|
+
*/
|
|
73
|
+
export declare const requireFreshSig: typeof withFreshSig;
|
|
74
|
+
export type TokenForgeNextCloudV2Options = TokenForgeCloudV2AdapterOptions;
|
|
75
|
+
/** Wrap a Next.js route handler with the Cloud v2 local and remote gates. */
|
|
76
|
+
export declare function withTokenForgeCloudV2<TRequest extends Request = NextRequest>(handler: (request: TRequest) => Response | Promise<Response>, options: TokenForgeNextCloudV2Options): (request: TRequest) => Promise<Response>;
|
|
77
|
+
/** Run only the Cloud v2 authorization decision for middleware composition. */
|
|
78
|
+
export declare function tokenForgeCloudV2Check(options: TokenForgeNextCloudV2Options): (request: Request) => Promise<Response | null>;
|
|
79
|
+
/** Expose the generic Cloud v2 bind handler as a Next.js route handler. */
|
|
80
|
+
export declare function tokenForgeCloudV2BindRoute(handler: TokenForgeCloudV2RequestHandler): TokenForgeCloudV2RequestHandler;
|
|
66
81
|
export {};
|
|
67
82
|
//# sourceMappingURL=nextjs.d.ts.map
|