@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/oauth-handler.js
DELETED
|
@@ -1,423 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OAuthHandler — OAuth login/bind/unbind for Cloudflare Workers.
|
|
3
|
-
*
|
|
4
|
-
* Supports pluggable adapters (Google, GitHub, Apple, etc.).
|
|
5
|
-
* OAuth configs are stored in D1 settings table as `oauth:{provider}` JSON.
|
|
6
|
-
*
|
|
7
|
-
* Routes (under /.well-known/service):
|
|
8
|
-
* GET /api/oauth/configs — list configured providers
|
|
9
|
-
* GET /api/oauth/:provider/login — redirect to OAuth provider
|
|
10
|
-
* GET /oauth/callback/:provider — handle OAuth callback
|
|
11
|
-
* POST /oauth/callback/:provider — handle Apple POST callback
|
|
12
|
-
* POST /api/oauth/login — API-based code exchange + login
|
|
13
|
-
* POST /api/oauth/bind — bind OAuth to existing account
|
|
14
|
-
* POST /api/oauth/unbind — unbind OAuth from account
|
|
15
|
-
*/
|
|
16
|
-
import { deriveDID } from "./identity/federation.js";
|
|
17
|
-
import { signJWT, verifyJWT } from "./identity/jwt.js";
|
|
18
|
-
import { AppleAdapter } from "./oauth-adapters/apple.js";
|
|
19
|
-
import { Auth0Adapter } from "./oauth-adapters/auth0.js";
|
|
20
|
-
import { Auth0LegacyAdapter } from "./oauth-adapters/auth0-legacy.js";
|
|
21
|
-
import { FacebookAdapter } from "./oauth-adapters/facebook.js";
|
|
22
|
-
import { GitHubAdapter } from "./oauth-adapters/github.js";
|
|
23
|
-
import { GoogleAdapter } from "./oauth-adapters/google.js";
|
|
24
|
-
import { TwitterAdapter } from "./oauth-adapters/twitter.js";
|
|
25
|
-
import { renderOAuthCallbackPage } from "./pages/oauth-callback-page.js";
|
|
26
|
-
/** Map of provider name → adapter instance. */
|
|
27
|
-
const ADAPTERS = {
|
|
28
|
-
google: new GoogleAdapter(),
|
|
29
|
-
github: new GitHubAdapter(),
|
|
30
|
-
apple: new AppleAdapter(),
|
|
31
|
-
twitter: new TwitterAdapter(),
|
|
32
|
-
facebook: new FacebookAdapter(),
|
|
33
|
-
auth0: new Auth0Adapter(),
|
|
34
|
-
"auth0-legacy": new Auth0LegacyAdapter(),
|
|
35
|
-
};
|
|
36
|
-
export class OAuthHandler {
|
|
37
|
-
options;
|
|
38
|
-
constructor(options) {
|
|
39
|
-
this.options = options;
|
|
40
|
-
}
|
|
41
|
-
/** Register additional adapters (for Phase 2e providers). */
|
|
42
|
-
static registerAdapter(adapter) {
|
|
43
|
-
ADAPTERS[adapter.name] = adapter;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Handle an incoming request. Returns Response if matched, null otherwise.
|
|
47
|
-
*/
|
|
48
|
-
async fetch(request) {
|
|
49
|
-
const url = new URL(request.url);
|
|
50
|
-
const path = url.pathname;
|
|
51
|
-
const method = request.method;
|
|
52
|
-
// GET /api/oauth/configs
|
|
53
|
-
if (path === "/.well-known/service/api/oauth/configs" && method === "GET") {
|
|
54
|
-
return this.handleGetConfigs();
|
|
55
|
-
}
|
|
56
|
-
// GET /api/oauth/:provider/login
|
|
57
|
-
const loginMatch = path.match(/^\/\.well-known\/service\/api\/oauth\/([a-z0-9_-]+)\/login$/);
|
|
58
|
-
if (loginMatch && method === "GET") {
|
|
59
|
-
return this.handleLogin(request, loginMatch[1]);
|
|
60
|
-
}
|
|
61
|
-
// GET or POST /oauth/callback/:provider
|
|
62
|
-
const callbackMatch = path.match(/^\/\.well-known\/service\/oauth\/callback\/([a-z0-9_-]+)$/);
|
|
63
|
-
if (callbackMatch && (method === "GET" || method === "POST")) {
|
|
64
|
-
return this.handleCallback(request, callbackMatch[1]);
|
|
65
|
-
}
|
|
66
|
-
// POST /api/oauth/login
|
|
67
|
-
if (path === "/.well-known/service/api/oauth/login" && method === "POST") {
|
|
68
|
-
return this.handleApiLogin(request);
|
|
69
|
-
}
|
|
70
|
-
// POST /api/oauth/bind
|
|
71
|
-
if (path === "/.well-known/service/api/oauth/bind" && method === "POST") {
|
|
72
|
-
return this.handleBind(request);
|
|
73
|
-
}
|
|
74
|
-
// POST /api/oauth/unbind
|
|
75
|
-
if (path === "/.well-known/service/api/oauth/unbind" && method === "POST") {
|
|
76
|
-
return this.handleUnbind(request);
|
|
77
|
-
}
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
|
-
/** GET /api/oauth/configs — list enabled providers (public, no secrets). */
|
|
81
|
-
async handleGetConfigs() {
|
|
82
|
-
const configs = await this.loadAllConfigs();
|
|
83
|
-
const providers = Object.keys(configs)
|
|
84
|
-
.map((name) => {
|
|
85
|
-
const cfg = configs[name];
|
|
86
|
-
return {
|
|
87
|
-
name,
|
|
88
|
-
clientId: cfg.clientId ?? "",
|
|
89
|
-
enabled: cfg.enabled ?? true,
|
|
90
|
-
order: cfg.order ?? 999,
|
|
91
|
-
};
|
|
92
|
-
})
|
|
93
|
-
.filter((p) => p.enabled !== false)
|
|
94
|
-
.sort((a, b) => a.order - b.order)
|
|
95
|
-
.map(({ name, clientId }) => ({ name, clientId }));
|
|
96
|
-
return jsonResponse({ providers });
|
|
97
|
-
}
|
|
98
|
-
/** GET /api/oauth/:provider/login — redirect to OAuth authorization URL. */
|
|
99
|
-
async handleLogin(request, provider) {
|
|
100
|
-
const config = await this.loadProviderConfig(provider);
|
|
101
|
-
if (!config)
|
|
102
|
-
return jsonResponse({ error: `Provider "${provider}" not configured` }, 404);
|
|
103
|
-
const adapter = ADAPTERS[provider];
|
|
104
|
-
if (!adapter)
|
|
105
|
-
return jsonResponse({ error: `Provider "${provider}" not supported` }, 404);
|
|
106
|
-
const url = new URL(request.url);
|
|
107
|
-
const returnUrl = url.searchParams.get("returnUrl") || "/";
|
|
108
|
-
const redirectUri = this.getCallbackUrl(request, provider);
|
|
109
|
-
// Generate CSRF state and store in KV
|
|
110
|
-
const nonce = crypto.randomUUID();
|
|
111
|
-
const statePayload = { nonce, returnUrl, provider };
|
|
112
|
-
const stateStr = JSON.stringify(statePayload);
|
|
113
|
-
if (this.options.kv) {
|
|
114
|
-
await this.options.kv.put(`oauth-state:${nonce}`, stateStr, { expirationTtl: 600 });
|
|
115
|
-
}
|
|
116
|
-
const authUrl = adapter.getAuthorizationUrl({
|
|
117
|
-
config,
|
|
118
|
-
redirectUri,
|
|
119
|
-
state: stateStr,
|
|
120
|
-
});
|
|
121
|
-
// Render an intermediate page instead of a raw 302 redirect.
|
|
122
|
-
// This avoids the jarring blank-page flash in popup mode and gives
|
|
123
|
-
// the user a moment to see where they're being sent.
|
|
124
|
-
const providerName = provider.charAt(0).toUpperCase() + provider.slice(1);
|
|
125
|
-
const html = `<!DOCTYPE html>
|
|
126
|
-
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
127
|
-
<style>
|
|
128
|
-
body{margin:0;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#0a0a0b;color:#f5f5f7;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;font-size:14px}
|
|
129
|
-
.wrap{text-align:center}
|
|
130
|
-
@keyframes spin{to{transform:rotate(360deg)}}
|
|
131
|
-
.spinner{display:inline-block;width:24px;height:24px;border:2.5px solid rgba(255,255,255,0.12);border-top-color:#9280ff;border-radius:50%;animation:spin .6s linear infinite;margin-bottom:16px}
|
|
132
|
-
p{color:#9394a1;margin:0}
|
|
133
|
-
</style></head><body>
|
|
134
|
-
<div class="wrap">
|
|
135
|
-
<div class="spinner"></div>
|
|
136
|
-
<p>Redirecting to ${providerName}...</p>
|
|
137
|
-
</div>
|
|
138
|
-
<script>location.replace(${JSON.stringify(authUrl)});</script>
|
|
139
|
-
</body></html>`;
|
|
140
|
-
return new Response(html, { headers: { "Content-Type": "text/html; charset=utf-8" } });
|
|
141
|
-
}
|
|
142
|
-
/** GET/POST /oauth/callback/:provider — handle OAuth callback. */
|
|
143
|
-
async handleCallback(request, provider) {
|
|
144
|
-
const url = new URL(request.url);
|
|
145
|
-
// For POST callbacks (Apple), read form body
|
|
146
|
-
let code;
|
|
147
|
-
let stateParam;
|
|
148
|
-
if (request.method === "POST") {
|
|
149
|
-
const formData = await request.formData();
|
|
150
|
-
code = formData.get("code");
|
|
151
|
-
stateParam = formData.get("state");
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
code = url.searchParams.get("code");
|
|
155
|
-
stateParam = url.searchParams.get("state");
|
|
156
|
-
}
|
|
157
|
-
// Check for error response
|
|
158
|
-
const error = url.searchParams.get("error");
|
|
159
|
-
if (error) {
|
|
160
|
-
return renderCallbackError(url.origin, error);
|
|
161
|
-
}
|
|
162
|
-
if (!code || !stateParam) {
|
|
163
|
-
return renderCallbackError(url.origin, "Missing code or state");
|
|
164
|
-
}
|
|
165
|
-
// Validate CSRF state
|
|
166
|
-
let statePayload;
|
|
167
|
-
try {
|
|
168
|
-
statePayload = JSON.parse(stateParam);
|
|
169
|
-
}
|
|
170
|
-
catch {
|
|
171
|
-
return renderCallbackError(url.origin, "Invalid state");
|
|
172
|
-
}
|
|
173
|
-
if (this.options.kv) {
|
|
174
|
-
const stored = await this.options.kv.get(`oauth-state:${statePayload.nonce}`);
|
|
175
|
-
if (!stored) {
|
|
176
|
-
return renderCallbackError(url.origin, "Invalid or expired OAuth state");
|
|
177
|
-
}
|
|
178
|
-
await this.options.kv.delete(`oauth-state:${statePayload.nonce}`); // single-use
|
|
179
|
-
}
|
|
180
|
-
// Send callback page that posts back to opener
|
|
181
|
-
return new Response(renderOAuthCallbackPage(url.origin), {
|
|
182
|
-
headers: { "Content-Type": "text/html" },
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
/** POST /api/oauth/login — exchange code for JWT cookie. */
|
|
186
|
-
async handleApiLogin(request) {
|
|
187
|
-
const result = await this.exchangeOAuthCode(request);
|
|
188
|
-
if (result instanceof Response)
|
|
189
|
-
return result;
|
|
190
|
-
const { provider, profile, wallet } = result;
|
|
191
|
-
const userDid = wallet.address;
|
|
192
|
-
const userPk = wallet.publicKey;
|
|
193
|
-
// Create or update user
|
|
194
|
-
const { store } = this.options;
|
|
195
|
-
const existingUser = await store.getUserByDid(userDid);
|
|
196
|
-
const isNewUser = !existingUser;
|
|
197
|
-
if (isNewUser) {
|
|
198
|
-
await store.createUser({
|
|
199
|
-
did: userDid,
|
|
200
|
-
pk: userPk,
|
|
201
|
-
fullName: profile.name,
|
|
202
|
-
email: profile.email,
|
|
203
|
-
sourceProvider: provider,
|
|
204
|
-
});
|
|
205
|
-
const userCount = await store.getUserCount();
|
|
206
|
-
if (userCount === 1) {
|
|
207
|
-
await store.updateUserRole(userDid, "owner");
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
await store.updateLastLogin(userDid);
|
|
212
|
-
}
|
|
213
|
-
// Upsert connected account
|
|
214
|
-
await store.upsertConnectedAccount({
|
|
215
|
-
did: userDid,
|
|
216
|
-
pk: userPk,
|
|
217
|
-
userDid,
|
|
218
|
-
provider,
|
|
219
|
-
id: profile.sub,
|
|
220
|
-
userInfo: JSON.stringify({
|
|
221
|
-
name: profile.name,
|
|
222
|
-
email: profile.email,
|
|
223
|
-
avatar: profile.avatar,
|
|
224
|
-
}),
|
|
225
|
-
});
|
|
226
|
-
// Audit log
|
|
227
|
-
await store.createAuditLog({
|
|
228
|
-
action: isNewUser ? "user.register" : "user.login",
|
|
229
|
-
operatorDid: userDid,
|
|
230
|
-
metadata: { provider },
|
|
231
|
-
});
|
|
232
|
-
// Sign JWT and set cookie
|
|
233
|
-
const user = await store.getUserByDid(userDid);
|
|
234
|
-
const payload = { did: userDid, pk: userPk };
|
|
235
|
-
if (user?.fullName)
|
|
236
|
-
payload.displayName = user.fullName;
|
|
237
|
-
if (user?.role)
|
|
238
|
-
payload.role = user.role;
|
|
239
|
-
const jwt = await signJWT(payload, this.options.jwtSecret, this.options.jwtExpiresIn);
|
|
240
|
-
let cookie = `${this.options.cookieName}=${jwt}; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=${this.options.jwtExpiresIn}`;
|
|
241
|
-
const cookieDomain = typeof this.options.rpID === "string" ? this.options.rpID : undefined;
|
|
242
|
-
if (cookieDomain?.includes("."))
|
|
243
|
-
cookie += `; Domain=${cookieDomain}`;
|
|
244
|
-
return new Response(JSON.stringify({ ok: true, did: userDid }), {
|
|
245
|
-
status: 200,
|
|
246
|
-
headers: {
|
|
247
|
-
"Content-Type": "application/json",
|
|
248
|
-
"Set-Cookie": cookie,
|
|
249
|
-
"Cache-Control": "private, no-store",
|
|
250
|
-
},
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
/** POST /api/oauth/bind — bind OAuth provider to current user. */
|
|
254
|
-
async handleBind(request) {
|
|
255
|
-
const caller = await this.verifyCaller(request);
|
|
256
|
-
if (!caller)
|
|
257
|
-
return jsonResponse({ error: "Authentication required" }, 401);
|
|
258
|
-
const result = await this.exchangeOAuthCode(request);
|
|
259
|
-
if (result instanceof Response)
|
|
260
|
-
return result;
|
|
261
|
-
const { provider, profile, wallet } = result;
|
|
262
|
-
await this.options.store.upsertConnectedAccount({
|
|
263
|
-
did: wallet.address,
|
|
264
|
-
pk: wallet.publicKey,
|
|
265
|
-
userDid: caller.did,
|
|
266
|
-
provider,
|
|
267
|
-
id: profile.sub,
|
|
268
|
-
userInfo: JSON.stringify({
|
|
269
|
-
name: profile.name,
|
|
270
|
-
email: profile.email,
|
|
271
|
-
avatar: profile.avatar,
|
|
272
|
-
}),
|
|
273
|
-
});
|
|
274
|
-
await this.options.store.createAuditLog({
|
|
275
|
-
action: "oauth.bind",
|
|
276
|
-
operatorDid: caller.did,
|
|
277
|
-
metadata: { provider },
|
|
278
|
-
});
|
|
279
|
-
return jsonResponse({ ok: true, provider });
|
|
280
|
-
}
|
|
281
|
-
/** POST /api/oauth/unbind — unbind OAuth provider from current user. */
|
|
282
|
-
async handleUnbind(request) {
|
|
283
|
-
const caller = await this.verifyCaller(request);
|
|
284
|
-
if (!caller)
|
|
285
|
-
return jsonResponse({ error: "Authentication required" }, 401);
|
|
286
|
-
let body;
|
|
287
|
-
try {
|
|
288
|
-
body = await request.json();
|
|
289
|
-
}
|
|
290
|
-
catch {
|
|
291
|
-
return jsonResponse({ error: "Invalid request body" }, 400);
|
|
292
|
-
}
|
|
293
|
-
const { provider } = body;
|
|
294
|
-
if (!provider)
|
|
295
|
-
return jsonResponse({ error: "Missing provider" }, 400);
|
|
296
|
-
// Prevent unbinding the user's registration provider
|
|
297
|
-
const user = await this.options.store.getUserByDid(caller.did);
|
|
298
|
-
if (user?.sourceProvider === provider) {
|
|
299
|
-
return jsonResponse({ error: "Cannot unbind your registration provider" }, 403);
|
|
300
|
-
}
|
|
301
|
-
const account = await this.options.store.getConnectedAccountByProviderAndUser(provider, caller.did);
|
|
302
|
-
if (!account)
|
|
303
|
-
return jsonResponse({ error: "Account not bound" }, 404);
|
|
304
|
-
await this.options.store.deleteConnectedAccount(account.did);
|
|
305
|
-
await this.options.store.createAuditLog({
|
|
306
|
-
action: "oauth.unbind",
|
|
307
|
-
operatorDid: caller.did,
|
|
308
|
-
metadata: { provider },
|
|
309
|
-
});
|
|
310
|
-
return jsonResponse({ ok: true, provider });
|
|
311
|
-
}
|
|
312
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────
|
|
313
|
-
/**
|
|
314
|
-
* Parse request body, resolve provider config/adapter, and exchange OAuth code.
|
|
315
|
-
* Returns a Response on validation/exchange error, or the resolved result.
|
|
316
|
-
*/
|
|
317
|
-
async exchangeOAuthCode(request) {
|
|
318
|
-
let body;
|
|
319
|
-
try {
|
|
320
|
-
body = await request.json();
|
|
321
|
-
}
|
|
322
|
-
catch {
|
|
323
|
-
return jsonResponse({ error: "Invalid request body" }, 400);
|
|
324
|
-
}
|
|
325
|
-
const { provider, code, redirectUri } = body;
|
|
326
|
-
if (!provider || !code) {
|
|
327
|
-
return jsonResponse({ error: "Missing provider or code" }, 400);
|
|
328
|
-
}
|
|
329
|
-
const config = await this.loadProviderConfig(provider);
|
|
330
|
-
if (!config)
|
|
331
|
-
return jsonResponse({ error: `Provider "${provider}" not configured` }, 404);
|
|
332
|
-
const adapter = ADAPTERS[provider];
|
|
333
|
-
if (!adapter)
|
|
334
|
-
return jsonResponse({ error: `Provider "${provider}" not supported` }, 404);
|
|
335
|
-
const callbackUrl = redirectUri || this.getCallbackUrl(request, provider);
|
|
336
|
-
let profile;
|
|
337
|
-
try {
|
|
338
|
-
profile = await adapter.exchangeCode({
|
|
339
|
-
config,
|
|
340
|
-
code,
|
|
341
|
-
redirectUri: callbackUrl,
|
|
342
|
-
kv: this.options.kv,
|
|
343
|
-
});
|
|
344
|
-
}
|
|
345
|
-
catch (err) {
|
|
346
|
-
const message = err instanceof Error ? err.message : "OAuth exchange failed";
|
|
347
|
-
return jsonResponse({ error: message }, 400);
|
|
348
|
-
}
|
|
349
|
-
const wallet = await deriveDID(profile.sub, {
|
|
350
|
-
appSk: this.options.appSk,
|
|
351
|
-
authMaster: this.options.authMaster,
|
|
352
|
-
});
|
|
353
|
-
return { provider, profile, wallet: { address: wallet.did, publicKey: wallet.pk } };
|
|
354
|
-
}
|
|
355
|
-
/** Resolve the instance DID to use for settings lookup. */
|
|
356
|
-
get instanceDid() {
|
|
357
|
-
return this.options.instanceDid ?? "_global_";
|
|
358
|
-
}
|
|
359
|
-
/** Load all OAuth configs from D1 settings. */
|
|
360
|
-
async loadAllConfigs() {
|
|
361
|
-
const settings = await this.options.store.listSettings(this.instanceDid);
|
|
362
|
-
const configs = {};
|
|
363
|
-
for (const s of settings) {
|
|
364
|
-
if (s.key.startsWith("oauth:") && s.value) {
|
|
365
|
-
const provider = s.key.slice(6);
|
|
366
|
-
try {
|
|
367
|
-
configs[provider] = JSON.parse(s.value);
|
|
368
|
-
}
|
|
369
|
-
catch {
|
|
370
|
-
// Skip invalid config
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
return configs;
|
|
375
|
-
}
|
|
376
|
-
/** Load a single provider's config from D1 settings. */
|
|
377
|
-
async loadProviderConfig(provider) {
|
|
378
|
-
const raw = await this.options.store.getSetting(this.instanceDid, `oauth:${provider}`);
|
|
379
|
-
if (!raw)
|
|
380
|
-
return null;
|
|
381
|
-
try {
|
|
382
|
-
return JSON.parse(raw);
|
|
383
|
-
}
|
|
384
|
-
catch {
|
|
385
|
-
return null;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
/** Build the callback URL for a provider. In federated mode, uses master origin. */
|
|
389
|
-
getCallbackUrl(request, provider) {
|
|
390
|
-
const origin = this.options.masterOAuthOrigin || new URL(request.url).origin;
|
|
391
|
-
return `${origin}/.well-known/service/oauth/callback/${provider}`;
|
|
392
|
-
}
|
|
393
|
-
/** Verify JWT from cookie — returns caller identity or null. */
|
|
394
|
-
async verifyCaller(request) {
|
|
395
|
-
const cookies = request.headers.get("Cookie") || "";
|
|
396
|
-
const match = cookies.match(new RegExp(`${this.options.cookieName}=([^;]+)`));
|
|
397
|
-
if (!match)
|
|
398
|
-
return null;
|
|
399
|
-
const payload = await verifyJWT(match[1], this.options.jwtSecret);
|
|
400
|
-
if (!payload || typeof payload.did !== "string" || typeof payload.pk !== "string")
|
|
401
|
-
return null;
|
|
402
|
-
return { did: payload.did, pk: payload.pk };
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
function jsonResponse(data, status = 200) {
|
|
406
|
-
return new Response(JSON.stringify(data), {
|
|
407
|
-
status,
|
|
408
|
-
headers: { "Content-Type": "application/json", "Cache-Control": "private, no-store" },
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
function renderCallbackError(origin, error) {
|
|
412
|
-
const html = `<!DOCTYPE html><html><body><script>
|
|
413
|
-
if (window.opener) {
|
|
414
|
-
window.opener.postMessage({
|
|
415
|
-
type: 'authorization_response',
|
|
416
|
-
error: ${JSON.stringify(error)}
|
|
417
|
-
}, '${origin}');
|
|
418
|
-
}
|
|
419
|
-
window.close();
|
|
420
|
-
</script></body></html>`;
|
|
421
|
-
return new Response(html, { headers: { "Content-Type": "text/html" } });
|
|
422
|
-
}
|
|
423
|
-
//# sourceMappingURL=oauth-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth-handler.js","sourceRoot":"","sources":["../src/oauth-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/page.d.ts
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth page HTML — self-contained login page with passkey and DID Wallet flows.
|
|
3
|
-
*
|
|
4
|
-
* CSS comes from @arcblock/did-connect-core/ui (single source of truth).
|
|
5
|
-
* JS uses a pre-built IIFE bundle from core/ui (LoginPage + runPasskeyAuth).
|
|
6
|
-
*/
|
|
7
|
-
export interface RenderLoginPageConfig {
|
|
8
|
-
/** API prefix for DID Connect endpoints */
|
|
9
|
-
apiPrefix: string;
|
|
10
|
-
/** Application name displayed on login page */
|
|
11
|
-
appName?: string;
|
|
12
|
-
/** Application PID for DID Wallet deep link */
|
|
13
|
-
appPid?: string;
|
|
14
|
-
/** Auth methods to show (default: ['passkey', 'did-connect']) */
|
|
15
|
-
methods?: string[];
|
|
16
|
-
/** OAuth provider list */
|
|
17
|
-
oauthProviders?: Array<{
|
|
18
|
-
name: string;
|
|
19
|
-
icon?: string;
|
|
20
|
-
}>;
|
|
21
|
-
/** Locale (default: 'en') */
|
|
22
|
-
locale?: string;
|
|
23
|
-
/** Application logo URL */
|
|
24
|
-
appLogo?: string;
|
|
25
|
-
/** Privacy policy URL */
|
|
26
|
-
privacyUrl?: string;
|
|
27
|
-
/** Terms of service URL */
|
|
28
|
-
termsUrl?: string;
|
|
29
|
-
/** Color theme */
|
|
30
|
-
theme?: 'light' | 'dark' | 'auto';
|
|
31
|
-
}
|
|
32
|
-
export declare function renderLoginPage(config: RenderLoginPageConfig): string;
|
|
33
|
-
//# sourceMappingURL=page.d.ts.map
|
package/dist/page.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0BAA0B;IAC1B,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;CACnC;AAOD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAgDrE"}
|
package/dist/page.js
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auth page HTML — self-contained login page with passkey and DID Wallet flows.
|
|
3
|
-
*
|
|
4
|
-
* CSS comes from @arcblock/did-connect-core/ui (single source of truth).
|
|
5
|
-
* JS uses a pre-built IIFE bundle from core/ui (LoginPage + runPasskeyAuth).
|
|
6
|
-
*/
|
|
7
|
-
import { LOGIN_PAGE_STYLES } from "@arcblock/did-connect-core/ui";
|
|
8
|
-
import loginBundle from "./_generated/login-bundle-string.js";
|
|
9
|
-
/** Escape string for safe embedding inside <script> — prevents XSS. */
|
|
10
|
-
function escapeForScript(s) {
|
|
11
|
-
return s.replace(/<\/(script)/gi, "<\\/$1");
|
|
12
|
-
}
|
|
13
|
-
export function renderLoginPage(config) {
|
|
14
|
-
const connectConfig = {
|
|
15
|
-
apiPrefix: config.apiPrefix,
|
|
16
|
-
appName: config.appName,
|
|
17
|
-
appPid: config.appPid,
|
|
18
|
-
};
|
|
19
|
-
const options = {
|
|
20
|
-
methods: config.methods || ["passkey", "did-connect"],
|
|
21
|
-
oauthProviders: config.oauthProviders,
|
|
22
|
-
locale: config.locale || "en",
|
|
23
|
-
onSuccess: "__reload__",
|
|
24
|
-
appName: config.appName,
|
|
25
|
-
appLogo: config.appLogo,
|
|
26
|
-
privacyUrl: config.privacyUrl,
|
|
27
|
-
termsUrl: config.termsUrl,
|
|
28
|
-
theme: config.theme,
|
|
29
|
-
};
|
|
30
|
-
const configJSON = escapeForScript(JSON.stringify(connectConfig));
|
|
31
|
-
const optionsJSON = escapeForScript(JSON.stringify(options));
|
|
32
|
-
return /* html */ `<!DOCTYPE html>
|
|
33
|
-
<html lang="en">
|
|
34
|
-
<head>
|
|
35
|
-
<meta charset="utf-8" />
|
|
36
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
37
|
-
<title>Sign In</title>
|
|
38
|
-
<style>${LOGIN_PAGE_STYLES}</style>
|
|
39
|
-
</head>
|
|
40
|
-
<body>
|
|
41
|
-
<div id="login-root"></div>
|
|
42
|
-
<script>
|
|
43
|
-
${loginBundle}
|
|
44
|
-
;(function() {
|
|
45
|
-
var LB = __LoginBundle;
|
|
46
|
-
var config = ${configJSON};
|
|
47
|
-
var options = ${optionsJSON};
|
|
48
|
-
if (options.onSuccess === "__reload__") {
|
|
49
|
-
options.onSuccess = function() { setTimeout(function() { location.reload(); }, 300); };
|
|
50
|
-
}
|
|
51
|
-
var http = new LB.FetchHttpAdapter({ prefix: config.apiPrefix });
|
|
52
|
-
var page = new LB.LoginPage(document.getElementById("login-root"), config, http, options);
|
|
53
|
-
page.mount();
|
|
54
|
-
})();
|
|
55
|
-
</script>
|
|
56
|
-
</body>
|
|
57
|
-
</html>`;
|
|
58
|
-
}
|
|
59
|
-
//# sourceMappingURL=page.js.map
|
package/dist/page.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page.js","sourceRoot":"","sources":["../src/page.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,WAAW,MAAM,qCAAqC,CAAC;AAyB9D,uEAAuE;AACvE,SAAS,eAAe,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAA6B;IAC3D,MAAM,aAAa,GAA2B;QAC5C,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC;QACrD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;QAC7B,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IAEF,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAE7D,OAAO,UAAU,CAAC;;;;;;WAMT,iBAAiB;;;;;EAK1B,WAAW;;;iBAGI,UAAU;kBACT,WAAW;;;;;;;;;;QAUrB,CAAC;AACT,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared passkey auth script — extracted from login page for reuse.
|
|
3
|
-
*
|
|
4
|
-
* Exposes `runPasskeyAuth(options)` which handles the full passkey flow:
|
|
5
|
-
* 1. GET /auth → authentication challenge options
|
|
6
|
-
* 2. Try credentials.get() (authentication)
|
|
7
|
-
* 3. Fallback: GET /register → registration challenge options
|
|
8
|
-
* 4. credentials.create() (registration)
|
|
9
|
-
* 5. POST /auth or POST /register to verify
|
|
10
|
-
*
|
|
11
|
-
* Used by invite page (inline JS string for SSR).
|
|
12
|
-
*
|
|
13
|
-
* @deprecated Use `runPasskeyAuth` from `@arcblock/did-connect-core/ui` instead.
|
|
14
|
-
* This inline JS string is kept for invite-page.ts backward compatibility.
|
|
15
|
-
* The canonical TS module is `packages/connect-core/src/ui/webauthn-browser.ts`.
|
|
16
|
-
*/
|
|
17
|
-
export declare const AUTH_SCRIPT = "\nfunction b64urlEncode(buf) {\n const bytes = new Uint8Array(buf);\n let str = \"\";\n for (let i = 0; i < bytes.length; i++) str += String.fromCharCode(bytes[i]);\n return btoa(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction b64urlDecode(str) {\n str = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const bin = atob(str);\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n return arr.buffer;\n}\n\nfunction serializeRegistration(cred) {\n return {\n id: cred.id,\n rawId: b64urlEncode(cred.rawId),\n type: cred.type,\n response: {\n attestationObject: b64urlEncode(cred.response.attestationObject),\n clientDataJSON: b64urlEncode(cred.response.clientDataJSON),\n },\n clientExtensionResults: cred.getClientExtensionResults(),\n authenticatorAttachment: cred.authenticatorAttachment,\n };\n}\n\nfunction serializeAuthentication(cred) {\n return {\n id: cred.id,\n rawId: b64urlEncode(cred.rawId),\n type: cred.type,\n response: {\n authenticatorData: b64urlEncode(cred.response.authenticatorData),\n clientDataJSON: b64urlEncode(cred.response.clientDataJSON),\n signature: b64urlEncode(cred.response.signature),\n userHandle: cred.response.userHandle ? b64urlEncode(cred.response.userHandle) : undefined,\n },\n clientExtensionResults: cred.getClientExtensionResults(),\n authenticatorAttachment: cred.authenticatorAttachment,\n };\n}\n\n/**\n * Run the full passkey auth flow.\n * @param {Object} options\n * @param {string} options.prefix - API base path (default: '/.well-known/service/api/passkey')\n * @param {string} [options.name] - User display name for registration\n * @param {boolean} [options.authOnly] - If true, only try authentication (no registration fallback)\n * @param {boolean} [options.registerOnly] - If true, skip authentication and go straight to registration\n * @param {function} options.onStatus - Status callback: (message, isError) => void\n * @returns {Promise<{success: boolean, error?: string}>}\n */\nasync function runPasskeyAuth(options) {\n const prefix = options.prefix || \"/.well-known/service/api/passkey\";\n const onStatus = options.onStatus || function() {};\n const authOnly = options.authOnly || false;\n const registerOnly = options.registerOnly || false;\n const invitationId = options.invitationId || undefined;\n\n async function fetchAuthChallenge() {\n const res = await fetch(prefix + \"/auth\", { method: \"GET\" });\n if (!res.ok) throw new Error(\"Failed to get auth challenge\");\n return res.json();\n }\n\n async function fetchRegisterChallenge(name) {\n var params = [];\n if (name) params.push(\"name=\" + encodeURIComponent(name));\n if (invitationId) params.push(\"invitationId=\" + encodeURIComponent(invitationId));\n var qs = params.length ? \"?\" + params.join(\"&\") : \"\";\n const res = await fetch(prefix + \"/register\" + qs, { method: \"GET\" });\n if (!res.ok) throw new Error(\"Failed to get register challenge\");\n return res.json();\n }\n\n async function verifyAuth(challengeId, credential) {\n const res = await fetch(prefix + \"/auth\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ challengeId: challengeId, credential: credential }),\n });\n if (!res.ok) {\n const errData = await res.json().catch(function() { return {}; });\n throw new Error(errData.error || \"Authentication failed\");\n }\n return res.json();\n }\n\n async function verifyRegister(challengeId, credential, name) {\n const res = await fetch(prefix + \"/register\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ challengeId: challengeId, credential: credential, name: name || undefined }),\n });\n if (!res.ok) {\n const errData = await res.json().catch(function() { return {}; });\n throw new Error(errData.error || \"Registration failed\");\n }\n return res.json();\n }\n\n // Phase 1: try authentication (skip if registerOnly)\n if (!registerOnly) {\n onStatus(\"Waiting for passkey...\", false);\n try {\n const { challengeId, authentication } = await fetchAuthChallenge();\n const authOpts = {\n publicKey: {\n ...authentication,\n challenge: b64urlDecode(authentication.challenge),\n allowCredentials: (authentication.allowCredentials || []).map(function(c) {\n return { ...c, id: b64urlDecode(c.id) };\n }),\n },\n };\n const raw = await navigator.credentials.get(authOpts);\n const credential = serializeAuthentication(raw);\n\n onStatus(\"Verifying...\", false);\n await verifyAuth(challengeId, credential);\n return { success: true };\n } catch (authErr) {\n // Auth failed \u2014 if authOnly, return failure so caller can show name input\n if (authOnly) {\n return { success: false, error: \"no_passkey\" };\n }\n }\n } // end if (!registerOnly)\n\n // Phase 2: registration \u2014 check if server allows it\n var challengeData = await fetchRegisterChallenge(options.name || \"\");\n if (!challengeData.registrationAllowed) {\n onStatus(\"Registration requires an invitation.\", true);\n return { success: false, error: \"registration_closed\" };\n }\n\n onStatus(\"No existing passkey found. Creating new one...\", false);\n try {\n var regOpts = {\n publicKey: {\n ...challengeData.registration,\n challenge: b64urlDecode(challengeData.registration.challenge),\n user: {\n ...challengeData.registration.user,\n id: b64urlDecode(challengeData.registration.user.id),\n },\n excludeCredentials: (challengeData.registration.excludeCredentials || []).map(function(c) {\n return { ...c, id: b64urlDecode(c.id) };\n }),\n },\n };\n var raw = await navigator.credentials.create(regOpts);\n var credential = serializeRegistration(raw);\n\n onStatus(\"Verifying...\", false);\n await verifyRegister(challengeData.challengeId, credential, options.name || \"\");\n return { success: true };\n } catch (regErr) {\n var errMsg = regErr.message || \"Passkey setup failed\";\n onStatus(errMsg, true);\n return { success: false, error: errMsg };\n }\n}\n";
|
|
18
|
-
//# sourceMappingURL=auth-script.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auth-script.d.ts","sourceRoot":"","sources":["../../src/pages/auth-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,eAAO,MAAM,WAAW,6yMAuKvB,CAAC"}
|