@arcblock/did-connect-service 4.0.5 → 4.0.7
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/assets/fonts/noto-sans-sc-regular.otf +0 -0
- package/dist/_generated/asset-bytes.d.ts +3 -0
- package/dist/_generated/asset-bytes.d.ts.map +1 -0
- package/dist/_generated/asset-bytes.js +2 -0
- package/dist/_generated/asset-bytes.js.map +1 -0
- package/dist/_generated/asset-manifest.d.ts +3 -0
- package/dist/_generated/asset-manifest.d.ts.map +1 -0
- package/dist/_generated/asset-manifest.js +12 -0
- package/dist/_generated/asset-manifest.js.map +1 -0
- package/dist/asset-registry.d.ts +38 -0
- package/dist/asset-registry.d.ts.map +1 -0
- package/dist/asset-registry.js +73 -0
- package/dist/asset-registry.js.map +1 -0
- package/dist/assets/admin-core.c0b5af61.js +1393 -0
- package/dist/assets/admin-extra.7ca9c16b.js +2529 -0
- package/dist/assets/admin.c26bb17a.css +2219 -0
- package/dist/assets/design.99dc4ddc.css +97 -0
- package/dist/assets/did-address.7df30f28.js +51 -0
- package/dist/assets/header.94d9e46b.js +136 -0
- package/dist/assets/login.7b12c6dc.css +662 -0
- package/dist/assets/login.d3f05790.js +720 -0
- package/dist/assets/qr.c0d203ca.js +3 -0
- package/dist/embedded.d.ts +32 -0
- package/dist/embedded.d.ts.map +1 -1
- package/dist/embedded.js +3 -0
- package/dist/embedded.js.map +1 -1
- package/dist/handlers/auth-handler.d.ts +5 -0
- package/dist/handlers/auth-handler.d.ts.map +1 -1
- package/dist/handlers/auth-handler.js +11 -32
- package/dist/handlers/auth-handler.js.map +1 -1
- package/dist/handlers/branding-handler.d.ts +17 -0
- package/dist/handlers/branding-handler.d.ts.map +1 -1
- package/dist/handlers/branding-handler.js +107 -5
- package/dist/handlers/branding-handler.js.map +1 -1
- package/dist/identity/gravatar.d.ts +0 -2
- package/dist/identity/gravatar.d.ts.map +1 -1
- package/dist/identity/gravatar.js +0 -9
- package/dist/identity/gravatar.js.map +1 -1
- package/dist/og/emoji.d.ts +12 -0
- package/dist/og/emoji.d.ts.map +1 -0
- package/dist/og/emoji.js +71 -0
- package/dist/og/emoji.js.map +1 -0
- package/dist/og/generator.d.ts +3 -0
- package/dist/og/generator.d.ts.map +1 -0
- package/dist/og/generator.js +338 -0
- package/dist/og/generator.js.map +1 -0
- package/dist/og/index.d.ts +6 -0
- package/dist/og/index.d.ts.map +1 -0
- package/dist/og/index.js +4 -0
- package/dist/og/index.js.map +1 -0
- package/dist/og/passport-svg.d.ts +52 -0
- package/dist/og/passport-svg.d.ts.map +1 -0
- package/dist/og/passport-svg.js +157 -0
- package/dist/og/passport-svg.js.map +1 -0
- package/dist/og/ssrf-guard.d.ts +38 -0
- package/dist/og/ssrf-guard.d.ts.map +1 -0
- package/dist/og/ssrf-guard.js +188 -0
- package/dist/og/ssrf-guard.js.map +1 -0
- package/dist/og/templates.d.ts +26 -0
- package/dist/og/templates.d.ts.map +1 -0
- package/dist/og/templates.js +302 -0
- package/dist/og/templates.js.map +1 -0
- package/dist/og/types.d.ts +74 -0
- package/dist/og/types.d.ts.map +1 -0
- package/dist/og/types.js +14 -0
- package/dist/og/types.js.map +1 -0
- package/dist/pages/admin/index.d.ts.map +1 -1
- package/dist/pages/admin/index.js +25 -41
- package/dist/pages/admin/index.js.map +1 -1
- package/dist/pages/admin/tab-access.d.ts +1 -1
- package/dist/pages/admin/tab-access.d.ts.map +1 -1
- package/dist/pages/admin/tab-access.js +5 -2
- package/dist/pages/admin/tab-access.js.map +1 -1
- package/dist/pages/admin/tab-appearance.d.ts +1 -1
- package/dist/pages/admin/tab-appearance.d.ts.map +1 -1
- package/dist/pages/admin/tab-appearance.js +4 -2
- package/dist/pages/admin/tab-appearance.js.map +1 -1
- package/dist/pages/admin/tab-branding.d.ts.map +1 -1
- package/dist/pages/admin/tab-branding.js +4 -2
- package/dist/pages/admin/tab-branding.js.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.d.ts.map +1 -1
- package/dist/pages/admin/tab-profile-accounts.js +4 -2
- package/dist/pages/admin/tab-profile-accounts.js.map +1 -1
- package/dist/pages/admin/tab-settings.d.ts.map +1 -1
- package/dist/pages/admin/tab-settings.js +4 -2
- package/dist/pages/admin/tab-settings.js.map +1 -1
- package/dist/pages/admin-instances-page.d.ts.map +1 -1
- package/dist/pages/admin-instances-page.js +4 -6
- package/dist/pages/admin-instances-page.js.map +1 -1
- package/dist/pages/error-page.d.ts.map +1 -1
- package/dist/pages/error-page.js +3 -2
- package/dist/pages/error-page.js.map +1 -1
- package/dist/pages/gen-access-key-page.d.ts.map +1 -1
- package/dist/pages/gen-access-key-page.js +3 -4
- package/dist/pages/gen-access-key-page.js.map +1 -1
- package/dist/pages/homepage.d.ts.map +1 -1
- package/dist/pages/homepage.js +4 -3
- package/dist/pages/homepage.js.map +1 -1
- package/dist/pages/invite-page.d.ts.map +1 -1
- package/dist/pages/invite-page.js +4 -4
- package/dist/pages/invite-page.js.map +1 -1
- package/dist/pages/login-page.d.ts.map +1 -1
- package/dist/pages/login-page.js +3 -4
- package/dist/pages/login-page.js.map +1 -1
- package/package.json +21 -5
- package/dist/access-key-handler.d.ts +0 -37
- package/dist/access-key-handler.d.ts.map +0 -1
- package/dist/access-key-handler.js +0 -316
- package/dist/access-key-handler.js.map +0 -1
- package/dist/access-key-util.d.ts +0 -19
- package/dist/access-key-util.d.ts.map +0 -1
- package/dist/access-key-util.js +0 -45
- package/dist/access-key-util.js.map +0 -1
- package/dist/access-policy.d.ts +0 -53
- package/dist/access-policy.d.ts.map +0 -1
- package/dist/access-policy.js +0 -153
- package/dist/access-policy.js.map +0 -1
- package/dist/auth-client.d.ts +0 -20
- package/dist/auth-client.d.ts.map +0 -1
- package/dist/auth-client.js +0 -42
- package/dist/auth-client.js.map +0 -1
- package/dist/auth-entrypoint.d.ts +0 -45
- package/dist/auth-entrypoint.d.ts.map +0 -1
- package/dist/auth-entrypoint.js +0 -31
- package/dist/auth-entrypoint.js.map +0 -1
- package/dist/auth-handler.d.ts +0 -136
- package/dist/auth-handler.d.ts.map +0 -1
- package/dist/auth-handler.js +0 -408
- package/dist/auth-handler.js.map +0 -1
- package/dist/auth-rpc-types.d.ts +0 -139
- package/dist/auth-rpc-types.d.ts.map +0 -1
- package/dist/auth-rpc-types.js +0 -11
- package/dist/auth-rpc-types.js.map +0 -1
- package/dist/auth-rpc.d.ts +0 -80
- package/dist/auth-rpc.d.ts.map +0 -1
- package/dist/auth-rpc.js +0 -257
- package/dist/auth-rpc.js.map +0 -1
- package/dist/auth-worker.d.ts +0 -42
- package/dist/auth-worker.d.ts.map +0 -1
- package/dist/auth-worker.js +0 -120
- package/dist/auth-worker.js.map +0 -1
- package/dist/blocklet-js-handler.d.ts +0 -22
- package/dist/blocklet-js-handler.d.ts.map +0 -1
- package/dist/blocklet-js-handler.js +0 -205
- package/dist/blocklet-js-handler.js.map +0 -1
- package/dist/branding-handler.d.ts +0 -42
- package/dist/branding-handler.d.ts.map +0 -1
- package/dist/branding-handler.js +0 -326
- package/dist/branding-handler.js.map +0 -1
- package/dist/d1-token-storage.d.ts +0 -31
- package/dist/d1-token-storage.d.ts.map +0 -1
- package/dist/d1-token-storage.js +0 -83
- package/dist/d1-token-storage.js.map +0 -1
- package/dist/did-connect-handler.d.ts +0 -57
- package/dist/did-connect-handler.d.ts.map +0 -1
- package/dist/did-connect-handler.js +0 -182
- package/dist/did-connect-handler.js.map +0 -1
- package/dist/did.d.ts +0 -14
- package/dist/did.d.ts.map +0 -1
- package/dist/did.js +0 -17
- package/dist/did.js.map +0 -1
- package/dist/email-login-handler.d.ts +0 -50
- package/dist/email-login-handler.d.ts.map +0 -1
- package/dist/email-login-handler.js +0 -238
- package/dist/email-login-handler.js.map +0 -1
- package/dist/federation-utils.d.ts +0 -23
- package/dist/federation-utils.d.ts.map +0 -1
- package/dist/federation-utils.js +0 -25
- package/dist/federation-utils.js.map +0 -1
- package/dist/handler.d.ts +0 -90
- package/dist/handler.d.ts.map +0 -1
- package/dist/handler.js +0 -591
- package/dist/handler.js.map +0 -1
- package/dist/identity/csrf.d.ts +0 -17
- package/dist/identity/csrf.d.ts.map +0 -1
- package/dist/identity/csrf.js +0 -56
- package/dist/identity/csrf.js.map +0 -1
- package/dist/identity/invitation-util.d.ts +0 -7
- package/dist/identity/invitation-util.d.ts.map +0 -1
- package/dist/identity/invitation-util.js +0 -66
- package/dist/identity/invitation-util.js.map +0 -1
- package/dist/instance-role.d.ts +0 -10
- package/dist/instance-role.d.ts.map +0 -1
- package/dist/instance-role.js +0 -20
- package/dist/instance-role.js.map +0 -1
- package/dist/jwt.d.ts +0 -7
- package/dist/jwt.d.ts.map +0 -1
- package/dist/jwt.js +0 -72
- package/dist/jwt.js.map +0 -1
- package/dist/login-entry.d.ts +0 -9
- package/dist/login-entry.d.ts.map +0 -1
- package/dist/login-entry.js +0 -9
- package/dist/login-entry.js.map +0 -1
- package/dist/membership-handler.d.ts +0 -27
- package/dist/membership-handler.d.ts.map +0 -1
- package/dist/membership-handler.js +0 -111
- package/dist/membership-handler.js.map +0 -1
- package/dist/oauth-callback-page.d.ts +0 -9
- package/dist/oauth-callback-page.d.ts.map +0 -1
- package/dist/oauth-callback-page.js +0 -31
- package/dist/oauth-callback-page.js.map +0 -1
- package/dist/oauth-handler.d.ts +0 -72
- package/dist/oauth-handler.d.ts.map +0 -1
- package/dist/oauth-handler.js +0 -423
- package/dist/oauth-handler.js.map +0 -1
- package/dist/page.d.ts +0 -33
- package/dist/page.d.ts.map +0 -1
- package/dist/page.js +0 -59
- package/dist/page.js.map +0 -1
- package/dist/pages/auth-script.d.ts +0 -18
- package/dist/pages/auth-script.d.ts.map +0 -1
- package/dist/pages/auth-script.js +0 -185
- package/dist/pages/auth-script.js.map +0 -1
- package/dist/pages/design-tokens.d.ts +0 -86
- package/dist/pages/design-tokens.d.ts.map +0 -1
- package/dist/pages/design-tokens.js +0 -159
- package/dist/pages/design-tokens.js.map +0 -1
- package/dist/pages/did-connect-script.d.ts +0 -16
- package/dist/pages/did-connect-script.d.ts.map +0 -1
- package/dist/pages/did-connect-script.js +0 -105
- package/dist/pages/did-connect-script.js.map +0 -1
- package/dist/pages/shared-styles.d.ts +0 -6
- package/dist/pages/shared-styles.d.ts.map +0 -1
- package/dist/pages/shared-styles.js +0 -109
- package/dist/pages/shared-styles.js.map +0 -1
- package/dist/rbac.d.ts +0 -19
- package/dist/rbac.d.ts.map +0 -1
- package/dist/rbac.js +0 -76
- package/dist/rbac.js.map +0 -1
- package/dist/session-context.d.ts +0 -35
- package/dist/session-context.d.ts.map +0 -1
- package/dist/session-context.js +0 -39
- package/dist/session-context.js.map +0 -1
- package/dist/store.d.ts +0 -222
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -1366
- package/dist/store.js.map +0 -1
- package/dist/team-handler.d.ts +0 -90
- package/dist/team-handler.d.ts.map +0 -1
- package/dist/team-handler.js +0 -1225
- package/dist/team-handler.js.map +0 -1
- package/dist/ticket-handler.d.ts +0 -28
- package/dist/ticket-handler.d.ts.map +0 -1
- package/dist/ticket-handler.js +0 -74
- package/dist/ticket-handler.js.map +0 -1
- package/dist/wallet-identity.d.ts +0 -32
- package/dist/wallet-identity.d.ts.map +0 -1
- package/dist/wallet-identity.js +0 -43
- package/dist/wallet-identity.js.map +0 -1
- package/dist/webauthn.d.ts +0 -65
- package/dist/webauthn.d.ts.map +0 -1
- package/dist/webauthn.js +0 -112
- package/dist/webauthn.js.map +0 -1
package/dist/d1-token-storage.js
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* D1TokenStorage — DID Connect token storage backed by D1 (strongly consistent).
|
|
3
|
-
*
|
|
4
|
-
* Drop-in replacement for CloudflareKVStorage. D1 is a single-writer database
|
|
5
|
-
* with consistent reads, avoiding the KV eventual consistency problem where
|
|
6
|
-
* browser polls and wallet writes hit different edge nodes.
|
|
7
|
-
*
|
|
8
|
-
* The `connect_tokens` table schema is managed by D1Store (SCHEMA_SQL).
|
|
9
|
-
* Expired rows are cleaned up lazily on read and probabilistically on create().
|
|
10
|
-
*/
|
|
11
|
-
import { EventEmitter } from "events";
|
|
12
|
-
export class D1TokenStorage extends EventEmitter {
|
|
13
|
-
db;
|
|
14
|
-
ttl;
|
|
15
|
-
constructor(db, options = {}) {
|
|
16
|
-
super();
|
|
17
|
-
this.db = db;
|
|
18
|
-
this.ttl = options.ttl ?? 300;
|
|
19
|
-
}
|
|
20
|
-
async create(token, status = "created") {
|
|
21
|
-
const record = { token, status };
|
|
22
|
-
const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
|
|
23
|
-
await this.db
|
|
24
|
-
.prepare("INSERT OR REPLACE INTO connect_tokens (token, data, expiresAt) VALUES (?, ?, ?)")
|
|
25
|
-
.bind(token, JSON.stringify(record), expiresAt)
|
|
26
|
-
.run();
|
|
27
|
-
this.emit("create", record);
|
|
28
|
-
// Probabilistic cleanup: ~5% chance per create
|
|
29
|
-
if (Math.random() < 0.05) {
|
|
30
|
-
this.cleanup().catch(() => { });
|
|
31
|
-
}
|
|
32
|
-
return record;
|
|
33
|
-
}
|
|
34
|
-
async read(token) {
|
|
35
|
-
const row = await this.db
|
|
36
|
-
.prepare("SELECT data, expiresAt FROM connect_tokens WHERE token = ?")
|
|
37
|
-
.bind(token)
|
|
38
|
-
.first();
|
|
39
|
-
if (!row)
|
|
40
|
-
return null;
|
|
41
|
-
// Check expiry
|
|
42
|
-
if (row.expiresAt < Math.floor(Date.now() / 1000)) {
|
|
43
|
-
await this.db.prepare("DELETE FROM connect_tokens WHERE token = ?").bind(token).run();
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
return JSON.parse(row.data);
|
|
47
|
-
}
|
|
48
|
-
async update(token, updates) {
|
|
49
|
-
const existing = await this.read(token);
|
|
50
|
-
if (!existing)
|
|
51
|
-
return null;
|
|
52
|
-
delete updates.token; // prevent token field overwrite
|
|
53
|
-
const merged = { ...existing, ...updates };
|
|
54
|
-
const expiresAt = Math.floor(Date.now() / 1000) + this.ttl;
|
|
55
|
-
await this.db
|
|
56
|
-
.prepare("UPDATE connect_tokens SET data = ?, expiresAt = ? WHERE token = ?")
|
|
57
|
-
.bind(JSON.stringify(merged), expiresAt, token)
|
|
58
|
-
.run();
|
|
59
|
-
this.emit("update", merged);
|
|
60
|
-
return merged;
|
|
61
|
-
}
|
|
62
|
-
async delete(token) {
|
|
63
|
-
const existing = await this.read(token);
|
|
64
|
-
if (existing) {
|
|
65
|
-
this.emit("destroy", existing);
|
|
66
|
-
}
|
|
67
|
-
await this.db.prepare("DELETE FROM connect_tokens WHERE token = ?").bind(token).run();
|
|
68
|
-
}
|
|
69
|
-
async exist(token, did) {
|
|
70
|
-
const record = await this.read(token);
|
|
71
|
-
if (!record)
|
|
72
|
-
return false;
|
|
73
|
-
if (did)
|
|
74
|
-
return record.did === did;
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
/** Remove expired rows. Called probabilistically from create(). */
|
|
78
|
-
async cleanup() {
|
|
79
|
-
const now = Math.floor(Date.now() / 1000);
|
|
80
|
-
await this.db.prepare("DELETE FROM connect_tokens WHERE expiresAt < ?").bind(now).run();
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
//# sourceMappingURL=d1-token-storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"d1-token-storage.js","sourceRoot":"","sources":["../src/d1-token-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DIDConnectHandler — DID Wallet authentication for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Uses WalletAuthenticator + WalletHandlers from connect-server with an
|
|
5
|
-
* internal Hono app. The browser polls for status, then calls /complete
|
|
6
|
-
* to receive a JWT cookie.
|
|
7
|
-
*
|
|
8
|
-
* Routes (under /.well-known/service/api/did):
|
|
9
|
-
* GET/POST /login/token — create new connect session
|
|
10
|
-
* GET /login/status — poll session status
|
|
11
|
-
* GET /login/timeout — expire session
|
|
12
|
-
* GET /login/auth — wallet fetches auth request
|
|
13
|
-
* POST /login/auth — wallet submits auth response
|
|
14
|
-
* POST /connect/complete — browser claims JWT cookie after succeed
|
|
15
|
-
*/
|
|
16
|
-
import type { D1Store } from "./store/d1-store.js";
|
|
17
|
-
export interface DIDConnectHandlerOptions {
|
|
18
|
-
store: D1Store;
|
|
19
|
-
db: D1Database;
|
|
20
|
-
appSk: string;
|
|
21
|
-
jwtSecret: string;
|
|
22
|
-
jwtExpiresIn: number;
|
|
23
|
-
cookieName: string;
|
|
24
|
-
rpID?: string | ((request: Request) => string);
|
|
25
|
-
appInfo?: {
|
|
26
|
-
name: string;
|
|
27
|
-
description?: string;
|
|
28
|
-
icon?: string;
|
|
29
|
-
};
|
|
30
|
-
/** Federation: delegator must use { address, pk } (not { did, pk })
|
|
31
|
-
* because WalletAuthenticator internally calls toDid(delegator.address). */
|
|
32
|
-
delegator?: {
|
|
33
|
-
address: string;
|
|
34
|
-
pk: string;
|
|
35
|
-
};
|
|
36
|
-
/** Federation: master-signed delegation JWT. */
|
|
37
|
-
delegation?: string;
|
|
38
|
-
/** Permanent secret key (PSK) — for auto-delegation when SK has been rotated. */
|
|
39
|
-
appPsk?: string;
|
|
40
|
-
}
|
|
41
|
-
export declare class DIDConnectHandler {
|
|
42
|
-
private app;
|
|
43
|
-
private storage;
|
|
44
|
-
private options;
|
|
45
|
-
constructor(options: DIDConnectHandlerOptions);
|
|
46
|
-
/**
|
|
47
|
-
* Handle an incoming request. Returns a Response if matched, null otherwise.
|
|
48
|
-
* Hono returns 404 for unmatched routes — we convert that to null so the
|
|
49
|
-
* caller can fall through to the next handler.
|
|
50
|
-
*/
|
|
51
|
-
fetch(request: Request): Promise<Response | null>;
|
|
52
|
-
/** onAuth callback — create/update user, upsert connected account, audit log. */
|
|
53
|
-
private handleAuth;
|
|
54
|
-
/** Exchange a succeed token for a JWT cookie (called by browser after status poll). */
|
|
55
|
-
private handleComplete;
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=did-connect-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"did-connect-handler.d.ts","sourceRoot":"","sources":["../src/did-connect-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChE;iFAC6E;IAC7E,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,GAAG,CAAO;IAClB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IA2D7C;;;;OAIG;IACG,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAMvD,iFAAiF;YACnE,UAAU;IAqDxB,uFAAuF;YACzE,cAAc;CA+C7B"}
|
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DIDConnectHandler — DID Wallet authentication for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Uses WalletAuthenticator + WalletHandlers from connect-server with an
|
|
5
|
-
* internal Hono app. The browser polls for status, then calls /complete
|
|
6
|
-
* to receive a JWT cookie.
|
|
7
|
-
*
|
|
8
|
-
* Routes (under /.well-known/service/api/did):
|
|
9
|
-
* GET/POST /login/token — create new connect session
|
|
10
|
-
* GET /login/status — poll session status
|
|
11
|
-
* GET /login/timeout — expire session
|
|
12
|
-
* GET /login/auth — wallet fetches auth request
|
|
13
|
-
* POST /login/auth — wallet submits auth response
|
|
14
|
-
* POST /connect/complete — browser claims JWT cookie after succeed
|
|
15
|
-
*/
|
|
16
|
-
import { WalletAuthenticator, WalletHandlers } from "@arcblock/did-connect-js";
|
|
17
|
-
import { fromSecretKey } from "@ocap/wallet";
|
|
18
|
-
import { Hono } from "hono";
|
|
19
|
-
import { LOGIN_PROVIDER } from "./constants.js";
|
|
20
|
-
import { D1TokenStorage } from "./store/d1-token-storage.js";
|
|
21
|
-
import { signJWT } from "./identity/jwt.js";
|
|
22
|
-
import { generateDelegation, resolveWalletIdentity } from "./identity/wallet-identity.js";
|
|
23
|
-
export class DIDConnectHandler {
|
|
24
|
-
app;
|
|
25
|
-
storage;
|
|
26
|
-
options;
|
|
27
|
-
constructor(options) {
|
|
28
|
-
this.options = options;
|
|
29
|
-
const identity = resolveWalletIdentity(options.appSk, options.appPsk);
|
|
30
|
-
this.storage = new D1TokenStorage(options.db, { ttl: 300 });
|
|
31
|
-
// Delegation priority: explicit > auto (from appPsk) > none
|
|
32
|
-
const hasDelegation = !!(options.delegator || options.delegation);
|
|
33
|
-
const useAutoDelegation = !hasDelegation && identity.needsDelegation;
|
|
34
|
-
let delegationJwt;
|
|
35
|
-
if (useAutoDelegation) {
|
|
36
|
-
// Cache the delegation JWT promise — resolved lazily on first call
|
|
37
|
-
const delegationPromise = generateDelegation(identity);
|
|
38
|
-
delegationJwt = undefined; // Will be set asynchronously
|
|
39
|
-
delegationPromise.then((jwt) => {
|
|
40
|
-
delegationJwt = jwt;
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
const authenticator = new WalletAuthenticator({
|
|
44
|
-
wallet: identity.wallet,
|
|
45
|
-
appInfo: ({ baseUrl }) => ({
|
|
46
|
-
name: options.appInfo?.name || "App",
|
|
47
|
-
description: options.appInfo?.description || "",
|
|
48
|
-
icon: options.appInfo?.icon || `${baseUrl}/favicon.ico`,
|
|
49
|
-
link: baseUrl,
|
|
50
|
-
}),
|
|
51
|
-
chainInfo: { type: "arcblock", host: "none", id: "none" },
|
|
52
|
-
...(options.delegator && { delegator: () => options.delegator }),
|
|
53
|
-
...(options.delegation && { delegation: () => options.delegation }),
|
|
54
|
-
...(useAutoDelegation && {
|
|
55
|
-
delegator: () => ({
|
|
56
|
-
address: identity.permanentWallet.address,
|
|
57
|
-
pk: identity.permanentWallet.pk,
|
|
58
|
-
}),
|
|
59
|
-
delegation: () => delegationJwt || "",
|
|
60
|
-
}),
|
|
61
|
-
});
|
|
62
|
-
const handlers = new WalletHandlers({
|
|
63
|
-
tokenStorage: this.storage,
|
|
64
|
-
authenticator,
|
|
65
|
-
options: { prefix: "/.well-known/service/api/did" },
|
|
66
|
-
});
|
|
67
|
-
this.app = new Hono();
|
|
68
|
-
handlers.attach({
|
|
69
|
-
app: this.app,
|
|
70
|
-
action: "login",
|
|
71
|
-
claims: {
|
|
72
|
-
profile: () => ({ fields: ["fullName", "email", "avatar"] }),
|
|
73
|
-
},
|
|
74
|
-
onAuth: ({ userDid, userPk, claims }) => this.handleAuth(userDid, userPk, claims),
|
|
75
|
-
});
|
|
76
|
-
this.app.post("/.well-known/service/api/did/connect/complete", (c) => this.handleComplete(c));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Handle an incoming request. Returns a Response if matched, null otherwise.
|
|
80
|
-
* Hono returns 404 for unmatched routes — we convert that to null so the
|
|
81
|
-
* caller can fall through to the next handler.
|
|
82
|
-
*/
|
|
83
|
-
async fetch(request) {
|
|
84
|
-
const response = await this.app.fetch(request);
|
|
85
|
-
if (response.status === 404)
|
|
86
|
-
return null;
|
|
87
|
-
return response;
|
|
88
|
-
}
|
|
89
|
-
/** onAuth callback — create/update user, upsert connected account, audit log. */
|
|
90
|
-
async handleAuth(userDid, userPk, claims) {
|
|
91
|
-
const { store } = this.options;
|
|
92
|
-
// claims is an array of claim objects — find the profile claim
|
|
93
|
-
const profileClaim = Array.isArray(claims)
|
|
94
|
-
? claims.find((c) => c.type === "profile")
|
|
95
|
-
: claims?.profile;
|
|
96
|
-
const profile = profileClaim || {};
|
|
97
|
-
const existingUser = await store.getUserByDid(userDid);
|
|
98
|
-
const isNewUser = !existingUser;
|
|
99
|
-
if (isNewUser) {
|
|
100
|
-
await store.createUser({
|
|
101
|
-
did: userDid,
|
|
102
|
-
pk: userPk,
|
|
103
|
-
fullName: profile.fullName,
|
|
104
|
-
email: profile.email,
|
|
105
|
-
sourceProvider: LOGIN_PROVIDER.WALLET,
|
|
106
|
-
});
|
|
107
|
-
// First user becomes owner
|
|
108
|
-
const userCount = await store.getUserCount();
|
|
109
|
-
if (userCount === 1) {
|
|
110
|
-
await store.updateUserRole(userDid, "owner");
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
await store.updateLastLogin(userDid);
|
|
115
|
-
// Update profile if wallet provided new data
|
|
116
|
-
if (profile.fullName || profile.email || profile.avatar) {
|
|
117
|
-
await store.updateUserProfile(userDid, {
|
|
118
|
-
fullName: profile.fullName,
|
|
119
|
-
email: profile.email,
|
|
120
|
-
avatar: profile.avatar,
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
await store.upsertConnectedAccount({
|
|
125
|
-
did: userDid,
|
|
126
|
-
pk: userPk,
|
|
127
|
-
userDid,
|
|
128
|
-
provider: "did-connect",
|
|
129
|
-
id: userDid,
|
|
130
|
-
});
|
|
131
|
-
await store.createAuditLog({
|
|
132
|
-
action: isNewUser ? "user.register" : "user.login",
|
|
133
|
-
operatorDid: userDid,
|
|
134
|
-
metadata: { provider: "did-connect" },
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/** Exchange a succeed token for a JWT cookie (called by browser after status poll). */
|
|
138
|
-
async handleComplete(c) {
|
|
139
|
-
let body;
|
|
140
|
-
try {
|
|
141
|
-
body = await c.req.json();
|
|
142
|
-
}
|
|
143
|
-
catch {
|
|
144
|
-
return c.json({ error: "Invalid request body" }, 400);
|
|
145
|
-
}
|
|
146
|
-
const token = body?.token;
|
|
147
|
-
if (!token) {
|
|
148
|
-
return c.json({ error: "Missing token" }, 400);
|
|
149
|
-
}
|
|
150
|
-
// Read session — must be in "succeed" status
|
|
151
|
-
const session = await this.storage.read(token);
|
|
152
|
-
if (!session || session.status !== "succeed") {
|
|
153
|
-
return c.json({ error: "Invalid or incomplete session" }, 400);
|
|
154
|
-
}
|
|
155
|
-
const userDid = session.did;
|
|
156
|
-
const userPk = session.pk;
|
|
157
|
-
if (!userDid || !userPk) {
|
|
158
|
-
return c.json({ error: "Session missing user info" }, 400);
|
|
159
|
-
}
|
|
160
|
-
// Look up user for role + display name
|
|
161
|
-
const user = await this.options.store.getUserByDid(userDid);
|
|
162
|
-
if (!user) {
|
|
163
|
-
return c.json({ error: "User not found" }, 400);
|
|
164
|
-
}
|
|
165
|
-
const payload = { did: userDid, pk: userPk };
|
|
166
|
-
if (user.fullName)
|
|
167
|
-
payload.displayName = user.fullName;
|
|
168
|
-
if (user.role)
|
|
169
|
-
payload.role = user.role;
|
|
170
|
-
const jwt = await signJWT(payload, this.options.jwtSecret, this.options.jwtExpiresIn);
|
|
171
|
-
const isSecure = new URL(c.req.url).protocol === "https:";
|
|
172
|
-
const securePart = isSecure ? " Secure;" : "";
|
|
173
|
-
let cookie = `${this.options.cookieName}=${jwt}; Path=/; HttpOnly;${securePart} SameSite=Lax; Max-Age=${this.options.jwtExpiresIn}`;
|
|
174
|
-
const cookieDomain = typeof this.options.rpID === "string" ? this.options.rpID : undefined;
|
|
175
|
-
if (cookieDomain?.includes("."))
|
|
176
|
-
cookie += `; Domain=${cookieDomain}`;
|
|
177
|
-
await this.storage.delete(token);
|
|
178
|
-
c.header("Set-Cookie", cookie);
|
|
179
|
-
return c.json({ ok: true, did: userDid });
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=did-connect-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"did-connect-handler.js","sourceRoot":"","sources":["../src/did-connect-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/did.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DID derivation from passkey public key using @arcblock/did.
|
|
3
|
-
*
|
|
4
|
-
* Matches blocklet-server's pattern: pass raw Uint8Array to fromPublicKey.
|
|
5
|
-
* Uses @noble/hashes (pure JS SHA-256) — Workers compatible.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Derive a `did:abt` DID from a WebAuthn credential public key.
|
|
9
|
-
*
|
|
10
|
-
* @param publicKey - The COSE public key bytes from WebAuthn registration
|
|
11
|
-
* @returns DID string (e.g. "z1abc...")
|
|
12
|
-
*/
|
|
13
|
-
export declare function derivePasskeyDID(publicKey: Uint8Array): string;
|
|
14
|
-
//# sourceMappingURL=did.d.ts.map
|
package/dist/did.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAE9D"}
|
package/dist/did.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* DID derivation from passkey public key using @arcblock/did.
|
|
3
|
-
*
|
|
4
|
-
* Matches blocklet-server's pattern: pass raw Uint8Array to fromPublicKey.
|
|
5
|
-
* Uses @noble/hashes (pure JS SHA-256) — Workers compatible.
|
|
6
|
-
*/
|
|
7
|
-
import { fromPublicKey } from "@arcblock/did";
|
|
8
|
-
/**
|
|
9
|
-
* Derive a `did:abt` DID from a WebAuthn credential public key.
|
|
10
|
-
*
|
|
11
|
-
* @param publicKey - The COSE public key bytes from WebAuthn registration
|
|
12
|
-
* @returns DID string (e.g. "z1abc...")
|
|
13
|
-
*/
|
|
14
|
-
export function derivePasskeyDID(publicKey) {
|
|
15
|
-
return fromPublicKey(publicKey, "passkey");
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=did.js.map
|
package/dist/did.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAqB;IACpD,OAAO,aAAa,CAAC,SAAS,EAAE,SAAS,CAAW,CAAC;AACvD,CAAC"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* EmailLoginHandler — email code + magic link login for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Flow:
|
|
5
|
-
* 1. POST /sendCode — generate 6-digit code, send via Resend, return { id }
|
|
6
|
-
* 2. GET /status — poll whether code has been verified (for UX)
|
|
7
|
-
* 3. POST /login — verify code (or magic token JWT), derive DID, issue JWT
|
|
8
|
-
*
|
|
9
|
-
* Routes (under /.well-known/service/api/email):
|
|
10
|
-
* POST /sendCode
|
|
11
|
-
* GET /status
|
|
12
|
-
* POST /login
|
|
13
|
-
*/
|
|
14
|
-
import type { AuthEntrypointInterface } from "./identity/auth-entrypoint.js";
|
|
15
|
-
import type { D1Store } from "./store/d1-store.js";
|
|
16
|
-
export interface EmailLoginHandlerOptions {
|
|
17
|
-
store: D1Store;
|
|
18
|
-
appSk: string;
|
|
19
|
-
jwtSecret: string;
|
|
20
|
-
jwtExpiresIn: number;
|
|
21
|
-
cookieName: string;
|
|
22
|
-
rpID?: string | ((request: Request) => string);
|
|
23
|
-
/** Resend API key for sending emails. Falls back to D1 email:config at runtime. */
|
|
24
|
-
resendApiKey?: string;
|
|
25
|
-
/** From address for verification emails. Falls back to D1 email:config at runtime. */
|
|
26
|
-
emailFrom?: string;
|
|
27
|
-
/** Instance DID for loading settings from D1. */
|
|
28
|
-
instanceDid?: string;
|
|
29
|
-
/** Service Binding to master Worker (federated mode). */
|
|
30
|
-
authMaster?: AuthEntrypointInterface;
|
|
31
|
-
}
|
|
32
|
-
export declare class EmailLoginHandler {
|
|
33
|
-
private options;
|
|
34
|
-
constructor(options: EmailLoginHandlerOptions);
|
|
35
|
-
/** Resolve email config: constructor options take priority, fall back to D1 email:config. */
|
|
36
|
-
resolveEmailConfig(): Promise<{
|
|
37
|
-
resendApiKey: string;
|
|
38
|
-
emailFrom: string;
|
|
39
|
-
} | null>;
|
|
40
|
-
/** Check whether email login is available (config exists in env or D1). */
|
|
41
|
-
isEnabled(): Promise<boolean>;
|
|
42
|
-
fetch(request: Request): Promise<Response | null>;
|
|
43
|
-
/** POST /sendCode — generate code, send email, return { id }. */
|
|
44
|
-
private sendCode;
|
|
45
|
-
/** GET /status — check if a verification code has been used. */
|
|
46
|
-
private checkStatus;
|
|
47
|
-
/** POST /login — verify code or magic token, derive DID, issue JWT. */
|
|
48
|
-
private login;
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=email-login-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"email-login-handler.d.ts","sourceRoot":"","sources":["../src/email-login-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAI7E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC;IAC/C,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,UAAU,CAAC,EAAE,uBAAuB,CAAC;CACtC;AAID,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,EAAE,wBAAwB;IAI7C,6FAA6F;IACvF,kBAAkB,IAAI,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAoBvF,2EAA2E;IACrE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAI7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBvD,iEAAiE;YACnD,QAAQ;IA6DtB,gEAAgE;YAClD,WAAW;IASzB,uEAAuE;YACzD,KAAK;CA+FpB"}
|