@draftlab/auth 0.15.0 → 0.16.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/dist/esm/allow.js +26 -0
- package/dist/esm/client.js +254 -0
- package/dist/esm/core.js +597 -0
- package/dist/esm/css.d.js +0 -0
- package/dist/esm/error.js +88 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/keys.js +126 -0
- package/dist/esm/mutex.js +53 -0
- package/dist/esm/pkce.js +87 -0
- package/dist/esm/provider/apple.js +15 -0
- package/dist/esm/provider/code.js +62 -0
- package/dist/esm/provider/discord.js +15 -0
- package/dist/esm/provider/facebook.js +15 -0
- package/dist/esm/provider/github.js +15 -0
- package/dist/esm/provider/gitlab.js +15 -0
- package/dist/esm/provider/google.js +16 -0
- package/dist/esm/provider/linkedin.js +15 -0
- package/dist/esm/provider/magiclink.js +83 -0
- package/dist/esm/provider/microsoft.js +15 -0
- package/dist/esm/provider/oauth2.js +130 -0
- package/dist/esm/provider/password.js +331 -0
- package/dist/esm/provider/provider.js +18 -0
- package/dist/esm/provider/reddit.js +15 -0
- package/dist/esm/provider/slack.js +15 -0
- package/dist/esm/provider/spotify.js +15 -0
- package/dist/esm/provider/twitch.js +15 -0
- package/dist/esm/provider/vercel.js +17 -0
- package/dist/esm/random.js +40 -0
- package/dist/esm/revocation.js +27 -0
- package/dist/esm/storage/memory.js +110 -0
- package/dist/esm/storage/storage.js +56 -0
- package/dist/esm/storage/turso.js +93 -0
- package/dist/esm/storage/unstorage.js +78 -0
- package/dist/esm/subject.js +7 -0
- package/dist/esm/themes/theme.js +115 -0
- package/dist/esm/toolkit/client.js +119 -0
- package/dist/esm/toolkit/index.js +25 -0
- package/dist/esm/toolkit/providers/facebook.js +11 -0
- package/dist/esm/toolkit/providers/github.js +11 -0
- package/dist/esm/toolkit/providers/google.js +11 -0
- package/dist/esm/toolkit/providers/strategy.js +0 -0
- package/dist/esm/toolkit/storage.js +81 -0
- package/dist/esm/toolkit/utils.js +18 -0
- package/dist/esm/types.js +0 -0
- package/dist/esm/ui/base.js +478 -0
- package/dist/esm/ui/code.js +186 -0
- package/dist/esm/ui/form.js +46 -0
- package/dist/esm/ui/icon.js +242 -0
- package/dist/esm/ui/magiclink.js +158 -0
- package/dist/esm/ui/password.js +435 -0
- package/dist/esm/ui/select.js +102 -0
- package/dist/esm/util.js +59 -0
- package/dist/{allow.d.mts → types/allow.d.ts} +9 -11
- package/dist/types/allow.d.ts.map +1 -0
- package/dist/types/client.d.ts +462 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/core.d.ts +113 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/{error.d.mts → types/error.d.ts} +95 -97
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/{keys.d.mts → types/keys.d.ts} +20 -24
- package/dist/types/keys.d.ts.map +1 -0
- package/dist/types/mutex.d.ts +42 -0
- package/dist/types/mutex.d.ts.map +1 -0
- package/dist/{pkce.d.mts → types/pkce.d.ts} +10 -11
- package/dist/types/pkce.d.ts.map +1 -0
- package/dist/types/provider/apple.d.ts +197 -0
- package/dist/types/provider/apple.d.ts.map +1 -0
- package/dist/types/provider/code.d.ts +288 -0
- package/dist/types/provider/code.d.ts.map +1 -0
- package/dist/types/provider/discord.d.ts +206 -0
- package/dist/types/provider/discord.d.ts.map +1 -0
- package/dist/types/provider/facebook.d.ts +200 -0
- package/dist/types/provider/facebook.d.ts.map +1 -0
- package/dist/types/provider/github.d.ts +220 -0
- package/dist/types/provider/github.d.ts.map +1 -0
- package/dist/types/provider/gitlab.d.ts +180 -0
- package/dist/types/provider/gitlab.d.ts.map +1 -0
- package/dist/types/provider/google.d.ts +158 -0
- package/dist/types/provider/google.d.ts.map +1 -0
- package/dist/types/provider/linkedin.d.ts +190 -0
- package/dist/types/provider/linkedin.d.ts.map +1 -0
- package/dist/types/provider/magiclink.d.ts +141 -0
- package/dist/types/provider/magiclink.d.ts.map +1 -0
- package/dist/types/provider/microsoft.d.ts +247 -0
- package/dist/types/provider/microsoft.d.ts.map +1 -0
- package/dist/types/provider/oauth2.d.ts +229 -0
- package/dist/types/provider/oauth2.d.ts.map +1 -0
- package/dist/types/provider/password.d.ts +408 -0
- package/dist/types/provider/password.d.ts.map +1 -0
- package/dist/types/provider/provider.d.ts +226 -0
- package/dist/types/provider/provider.d.ts.map +1 -0
- package/dist/types/provider/reddit.d.ts +159 -0
- package/dist/types/provider/reddit.d.ts.map +1 -0
- package/dist/types/provider/slack.d.ts +171 -0
- package/dist/types/provider/slack.d.ts.map +1 -0
- package/dist/types/provider/spotify.d.ts +168 -0
- package/dist/types/provider/spotify.d.ts.map +1 -0
- package/dist/types/provider/twitch.d.ts +163 -0
- package/dist/types/provider/twitch.d.ts.map +1 -0
- package/dist/types/provider/vercel.d.ts +294 -0
- package/dist/types/provider/vercel.d.ts.map +1 -0
- package/dist/{random.d.mts → types/random.d.ts} +4 -6
- package/dist/types/random.d.ts.map +1 -0
- package/dist/types/revocation.d.ts +76 -0
- package/dist/types/revocation.d.ts.map +1 -0
- package/dist/{storage/memory.d.mts → types/storage/memory.d.ts} +17 -21
- package/dist/types/storage/memory.d.ts.map +1 -0
- package/dist/types/storage/storage.d.ts +177 -0
- package/dist/types/storage/storage.d.ts.map +1 -0
- package/dist/{storage/turso.d.mts → types/storage/turso.d.ts} +4 -8
- package/dist/types/storage/turso.d.ts.map +1 -0
- package/dist/{storage/unstorage.d.mts → types/storage/unstorage.d.ts} +12 -11
- package/dist/types/storage/unstorage.d.ts.map +1 -0
- package/dist/types/subject.d.ts +115 -0
- package/dist/types/subject.d.ts.map +1 -0
- package/dist/types/themes/theme.d.ts +207 -0
- package/dist/types/themes/theme.d.ts.map +1 -0
- package/dist/types/toolkit/client.d.ts +235 -0
- package/dist/types/toolkit/client.d.ts.map +1 -0
- package/dist/types/toolkit/index.d.ts +45 -0
- package/dist/types/toolkit/index.d.ts.map +1 -0
- package/dist/types/toolkit/providers/facebook.d.ts +8 -0
- package/dist/types/toolkit/providers/facebook.d.ts.map +1 -0
- package/dist/types/toolkit/providers/github.d.ts +8 -0
- package/dist/types/toolkit/providers/github.d.ts.map +1 -0
- package/dist/types/toolkit/providers/google.d.ts +8 -0
- package/dist/types/toolkit/providers/google.d.ts.map +1 -0
- package/dist/types/toolkit/providers/strategy.d.ts +38 -0
- package/dist/types/toolkit/providers/strategy.d.ts.map +1 -0
- package/dist/{toolkit/storage.d.mts → types/toolkit/storage.d.ts} +37 -39
- package/dist/types/toolkit/storage.d.ts.map +1 -0
- package/dist/{toolkit/utils.d.mts → types/toolkit/utils.d.ts} +2 -4
- package/dist/types/toolkit/utils.d.ts.map +1 -0
- package/dist/types/types.d.ts +92 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/ui/base.d.ts +18 -0
- package/dist/types/ui/base.d.ts.map +1 -0
- package/dist/types/ui/code.d.ts +43 -0
- package/dist/types/ui/code.d.ts.map +1 -0
- package/dist/types/ui/form.d.ts +24 -0
- package/dist/types/ui/form.d.ts.map +1 -0
- package/dist/types/ui/icon.d.ts +60 -0
- package/dist/types/ui/icon.d.ts.map +1 -0
- package/dist/types/ui/magiclink.d.ts +41 -0
- package/dist/types/ui/magiclink.d.ts.map +1 -0
- package/dist/types/ui/password.d.ts +43 -0
- package/dist/types/ui/password.d.ts.map +1 -0
- package/dist/types/ui/select.d.ts +33 -0
- package/dist/types/ui/select.d.ts.map +1 -0
- package/dist/{util.d.mts → types/util.d.ts} +11 -13
- package/dist/types/util.d.ts.map +1 -0
- package/package.json +10 -16
- package/dist/adapters/node.d.mts +0 -18
- package/dist/adapters/node.mjs +0 -69
- package/dist/allow.mjs +0 -63
- package/dist/client.d.mts +0 -456
- package/dist/client.mjs +0 -283
- package/dist/core.d.mts +0 -110
- package/dist/core.mjs +0 -595
- package/dist/error.mjs +0 -237
- package/dist/index.d.mts +0 -2
- package/dist/index.mjs +0 -3
- package/dist/keys.mjs +0 -146
- package/dist/mutex.d.mts +0 -44
- package/dist/mutex.mjs +0 -110
- package/dist/pkce.mjs +0 -157
- package/dist/provider/apple.d.mts +0 -111
- package/dist/provider/apple.mjs +0 -164
- package/dist/provider/code.d.mts +0 -228
- package/dist/provider/code.mjs +0 -246
- package/dist/provider/discord.d.mts +0 -146
- package/dist/provider/discord.mjs +0 -156
- package/dist/provider/facebook.d.mts +0 -142
- package/dist/provider/facebook.mjs +0 -150
- package/dist/provider/github.d.mts +0 -140
- package/dist/provider/github.mjs +0 -169
- package/dist/provider/gitlab.d.mts +0 -106
- package/dist/provider/gitlab.mjs +0 -147
- package/dist/provider/google.d.mts +0 -112
- package/dist/provider/google.mjs +0 -109
- package/dist/provider/linkedin.d.mts +0 -132
- package/dist/provider/linkedin.mjs +0 -142
- package/dist/provider/magiclink.d.mts +0 -89
- package/dist/provider/magiclink.mjs +0 -143
- package/dist/provider/microsoft.d.mts +0 -178
- package/dist/provider/microsoft.mjs +0 -177
- package/dist/provider/oauth2.d.mts +0 -176
- package/dist/provider/oauth2.mjs +0 -222
- package/dist/provider/passkey.d.mts +0 -104
- package/dist/provider/passkey.mjs +0 -320
- package/dist/provider/password.d.mts +0 -412
- package/dist/provider/password.mjs +0 -363
- package/dist/provider/provider.d.mts +0 -227
- package/dist/provider/provider.mjs +0 -44
- package/dist/provider/reddit.d.mts +0 -107
- package/dist/provider/reddit.mjs +0 -127
- package/dist/provider/slack.d.mts +0 -114
- package/dist/provider/slack.mjs +0 -138
- package/dist/provider/spotify.d.mts +0 -113
- package/dist/provider/spotify.mjs +0 -135
- package/dist/provider/totp.d.mts +0 -112
- package/dist/provider/totp.mjs +0 -191
- package/dist/provider/twitch.d.mts +0 -108
- package/dist/provider/twitch.mjs +0 -131
- package/dist/provider/vercel.d.mts +0 -177
- package/dist/provider/vercel.mjs +0 -230
- package/dist/random.mjs +0 -86
- package/dist/revocation.d.mts +0 -55
- package/dist/revocation.mjs +0 -63
- package/dist/router/context.d.mts +0 -21
- package/dist/router/context.mjs +0 -193
- package/dist/router/cookies.d.mts +0 -8
- package/dist/router/cookies.mjs +0 -13
- package/dist/router/index.d.mts +0 -21
- package/dist/router/index.mjs +0 -107
- package/dist/router/matcher.d.mts +0 -15
- package/dist/router/matcher.mjs +0 -76
- package/dist/router/middleware/cors.d.mts +0 -15
- package/dist/router/middleware/cors.mjs +0 -114
- package/dist/router/safe-request.d.mts +0 -52
- package/dist/router/safe-request.mjs +0 -160
- package/dist/router/types.d.mts +0 -67
- package/dist/router/types.mjs +0 -1
- package/dist/router/variables.d.mts +0 -12
- package/dist/router/variables.mjs +0 -20
- package/dist/storage/memory.mjs +0 -125
- package/dist/storage/storage.d.mts +0 -179
- package/dist/storage/storage.mjs +0 -104
- package/dist/storage/turso.mjs +0 -117
- package/dist/storage/unstorage.mjs +0 -103
- package/dist/subject.d.mts +0 -62
- package/dist/subject.mjs +0 -36
- package/dist/themes/theme.d.mts +0 -209
- package/dist/themes/theme.mjs +0 -120
- package/dist/toolkit/client.d.mts +0 -169
- package/dist/toolkit/client.mjs +0 -209
- package/dist/toolkit/index.d.mts +0 -9
- package/dist/toolkit/index.mjs +0 -9
- package/dist/toolkit/providers/facebook.d.mts +0 -12
- package/dist/toolkit/providers/facebook.mjs +0 -16
- package/dist/toolkit/providers/github.d.mts +0 -12
- package/dist/toolkit/providers/github.mjs +0 -16
- package/dist/toolkit/providers/google.d.mts +0 -12
- package/dist/toolkit/providers/google.mjs +0 -20
- package/dist/toolkit/providers/strategy.d.mts +0 -40
- package/dist/toolkit/providers/strategy.mjs +0 -1
- package/dist/toolkit/storage.mjs +0 -157
- package/dist/toolkit/utils.mjs +0 -30
- package/dist/types.d.mts +0 -94
- package/dist/types.mjs +0 -1
- package/dist/ui/base.d.mts +0 -30
- package/dist/ui/base.mjs +0 -407
- package/dist/ui/code.d.mts +0 -43
- package/dist/ui/code.mjs +0 -173
- package/dist/ui/form.d.mts +0 -32
- package/dist/ui/form.mjs +0 -49
- package/dist/ui/icon.d.mts +0 -58
- package/dist/ui/icon.mjs +0 -247
- package/dist/ui/magiclink.d.mts +0 -41
- package/dist/ui/magiclink.mjs +0 -152
- package/dist/ui/passkey.d.mts +0 -27
- package/dist/ui/passkey.mjs +0 -323
- package/dist/ui/password.d.mts +0 -42
- package/dist/ui/password.mjs +0 -402
- package/dist/ui/select.d.mts +0 -34
- package/dist/ui/select.mjs +0 -98
- package/dist/ui/totp.d.mts +0 -34
- package/dist/ui/totp.mjs +0 -270
- package/dist/util.mjs +0 -128
package/dist/ui/passkey.mjs
DELETED
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
import { Layout, renderToHTML } from "./base.mjs";
|
|
2
|
-
import { FormAlert } from "./form.mjs";
|
|
3
|
-
import { jsx, jsxs } from "preact/jsx-runtime";
|
|
4
|
-
|
|
5
|
-
//#region src/ui/passkey.tsx
|
|
6
|
-
const DEFAULT_COPY = {
|
|
7
|
-
register: "Register",
|
|
8
|
-
register_other_device: "Use another device",
|
|
9
|
-
register_prompt: "Don't have an account?",
|
|
10
|
-
login_prompt: "Already have an account?",
|
|
11
|
-
login: "Login",
|
|
12
|
-
button_continue: "Continue",
|
|
13
|
-
input_email: "Email",
|
|
14
|
-
error_register_already_registered: "This device is already registered. Please use the login page or try a different device.",
|
|
15
|
-
error_register_cancelled: "Registration was cancelled or timed out. Please try again.",
|
|
16
|
-
error_register_failed: "Registration failed. Please try again.",
|
|
17
|
-
error_auth_cancelled: "Authentication was cancelled or timed out. Please try again.",
|
|
18
|
-
error_auth_failed: "Authentication failed. Please try again."
|
|
19
|
-
};
|
|
20
|
-
const PasskeyUI = (options) => {
|
|
21
|
-
const { rpName, rpID, origin, userCanRegisterPasskey, authenticatorSelection, attestationType, timeout } = options;
|
|
22
|
-
const copy = {
|
|
23
|
-
...DEFAULT_COPY,
|
|
24
|
-
...options.copy
|
|
25
|
-
};
|
|
26
|
-
return {
|
|
27
|
-
authorize: async () => {
|
|
28
|
-
const jsx$1 = /* @__PURE__ */ jsxs(Layout, { children: [
|
|
29
|
-
/* @__PURE__ */ jsx("script", { dangerouslySetInnerHTML: { __html: `
|
|
30
|
-
window.addEventListener("load", async () => {
|
|
31
|
-
const { startAuthentication } = SimpleWebAuthnBrowser;
|
|
32
|
-
const authorizeForm = document.getElementById("authorizeForm");
|
|
33
|
-
const message = document.querySelector("[data-slot='message']");
|
|
34
|
-
const origin = window.location.origin;
|
|
35
|
-
const rpID = window.location.hostname;
|
|
36
|
-
|
|
37
|
-
authorizeForm.addEventListener("submit", async (e) => {
|
|
38
|
-
e.preventDefault();
|
|
39
|
-
const formData = new FormData(authorizeForm);
|
|
40
|
-
const email = formData.get("email");
|
|
41
|
-
|
|
42
|
-
message.textContent = "";
|
|
43
|
-
|
|
44
|
-
// GET authentication options from the endpoint that calls
|
|
45
|
-
// @simplewebauthn/server -> generateAuthenticationOptions()
|
|
46
|
-
const resp = await fetch(
|
|
47
|
-
"./authenticate-options?userId=" + email + "&rpID=" + rpID
|
|
48
|
-
);
|
|
49
|
-
|
|
50
|
-
const optionsJSON = await resp.json();
|
|
51
|
-
|
|
52
|
-
if (optionsJSON.error) {
|
|
53
|
-
message.textContent = optionsJSON.error;
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
let attResp;
|
|
58
|
-
try {
|
|
59
|
-
// Pass the options to the authenticator and wait for a response
|
|
60
|
-
attResp = await startAuthentication({ optionsJSON });
|
|
61
|
-
} catch (error) {
|
|
62
|
-
// Handle WebAuthn errors with friendly messages
|
|
63
|
-
const errorName = error.name;
|
|
64
|
-
if (errorName === "NotAllowedError") {
|
|
65
|
-
message.textContent = "${copy.error_auth_cancelled}";
|
|
66
|
-
} else if (errorName === "InvalidStateError") {
|
|
67
|
-
message.textContent = "${copy.error_auth_failed}";
|
|
68
|
-
} else {
|
|
69
|
-
message.textContent = error.message || "${copy.error_auth_failed}";
|
|
70
|
-
}
|
|
71
|
-
console.error(error);
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const verificationResp = await fetch(
|
|
76
|
-
"./authenticate-verify?userId=" +
|
|
77
|
-
email +
|
|
78
|
-
"&rpID=" +
|
|
79
|
-
rpID +
|
|
80
|
-
"&origin=" +
|
|
81
|
-
origin,
|
|
82
|
-
{
|
|
83
|
-
method: "POST",
|
|
84
|
-
headers: {
|
|
85
|
-
"Content-Type": "application/json",
|
|
86
|
-
},
|
|
87
|
-
body: JSON.stringify(attResp),
|
|
88
|
-
}
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Check if the request was redirected and the final response is OK
|
|
92
|
-
if (verificationResp.redirected && verificationResp.ok) {
|
|
93
|
-
// Navigate the browser to the final URL
|
|
94
|
-
window.location.href = verificationResp.url;
|
|
95
|
-
} else {
|
|
96
|
-
// Handle errors (e.g., 4xx, 5xx status codes from the final URL)
|
|
97
|
-
console.error(
|
|
98
|
-
"Request failed:",
|
|
99
|
-
verificationResp.status,
|
|
100
|
-
verificationResp.statusText
|
|
101
|
-
);
|
|
102
|
-
try {
|
|
103
|
-
const errorData = await verificationResp.json();
|
|
104
|
-
message.textContent = errorData.error;
|
|
105
|
-
} catch (error) {
|
|
106
|
-
message.textContent = "Something went wrong";
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
` } }),
|
|
112
|
-
/* @__PURE__ */ jsxs("form", {
|
|
113
|
-
id: "authorizeForm",
|
|
114
|
-
"data-component": "form",
|
|
115
|
-
children: [
|
|
116
|
-
/* @__PURE__ */ jsx(FormAlert, {}),
|
|
117
|
-
/* @__PURE__ */ jsx("input", {
|
|
118
|
-
id: "auth-email",
|
|
119
|
-
"data-component": "input",
|
|
120
|
-
type: "email",
|
|
121
|
-
name: "email",
|
|
122
|
-
"aria-required": "true",
|
|
123
|
-
"aria-describedby": "auth-email-help",
|
|
124
|
-
autoComplete: "email",
|
|
125
|
-
required: true,
|
|
126
|
-
placeholder: copy.input_email
|
|
127
|
-
}),
|
|
128
|
-
/* @__PURE__ */ jsx("button", {
|
|
129
|
-
type: "submit",
|
|
130
|
-
id: "btnLogin",
|
|
131
|
-
"data-component": "button",
|
|
132
|
-
children: copy.button_continue
|
|
133
|
-
}),
|
|
134
|
-
/* @__PURE__ */ jsx("div", {
|
|
135
|
-
"data-component": "form-footer",
|
|
136
|
-
children: /* @__PURE__ */ jsxs("span", { children: [
|
|
137
|
-
copy.register_prompt,
|
|
138
|
-
" ",
|
|
139
|
-
/* @__PURE__ */ jsx("a", {
|
|
140
|
-
"data-component": "link",
|
|
141
|
-
href: "./register",
|
|
142
|
-
children: copy.register
|
|
143
|
-
})
|
|
144
|
-
] })
|
|
145
|
-
})
|
|
146
|
-
]
|
|
147
|
-
}),
|
|
148
|
-
/* @__PURE__ */ jsx("script", { src: "https://unpkg.com/@simplewebauthn/browser/dist/bundle/index.umd.min.js" })
|
|
149
|
-
] });
|
|
150
|
-
return new Response(renderToHTML(jsx$1), {
|
|
151
|
-
status: 200,
|
|
152
|
-
headers: { "Content-Type": "text/html" }
|
|
153
|
-
});
|
|
154
|
-
},
|
|
155
|
-
register: async () => {
|
|
156
|
-
const jsx$1 = /* @__PURE__ */ jsxs(Layout, { children: [
|
|
157
|
-
/* @__PURE__ */ jsx("script", { dangerouslySetInnerHTML: { __html: `
|
|
158
|
-
window.addEventListener("load", async () => {
|
|
159
|
-
const { startRegistration } = SimpleWebAuthnBrowser;
|
|
160
|
-
const registerForm = document.getElementById("registerForm");
|
|
161
|
-
const btnOtherDevice = document.getElementById("btnOtherDevice");
|
|
162
|
-
const message = document.querySelector("[data-slot='message']");
|
|
163
|
-
const origin = window.location.origin;
|
|
164
|
-
const rpID = window.location.hostname;
|
|
165
|
-
|
|
166
|
-
// Start registration when the user clicks a button
|
|
167
|
-
const register = async (otherDevice = false) => {
|
|
168
|
-
const formData = new FormData(registerForm);
|
|
169
|
-
const email = formData.get("email");
|
|
170
|
-
message.textContent = "";
|
|
171
|
-
|
|
172
|
-
// GET registration options from the endpoint that calls
|
|
173
|
-
// @simplewebauthn/server -> generateRegistrationOptions()
|
|
174
|
-
const resp = await fetch(
|
|
175
|
-
"./register-request?userId=" +
|
|
176
|
-
email +
|
|
177
|
-
"&origin=" +
|
|
178
|
-
origin +
|
|
179
|
-
"&rpID=" +
|
|
180
|
-
rpID +
|
|
181
|
-
"&otherDevice=" +
|
|
182
|
-
otherDevice
|
|
183
|
-
);
|
|
184
|
-
const optionsJSON = await resp.json();
|
|
185
|
-
|
|
186
|
-
if (optionsJSON.error) {
|
|
187
|
-
message.textContent = optionsJSON.error;
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
let attResp;
|
|
192
|
-
try {
|
|
193
|
-
// Pass the options to the authenticator and wait for a response
|
|
194
|
-
attResp = await startRegistration({ optionsJSON });
|
|
195
|
-
} catch (error) {
|
|
196
|
-
// Handle WebAuthn errors with friendly messages
|
|
197
|
-
const errorName = error.name;
|
|
198
|
-
if (errorName === "InvalidStateError") {
|
|
199
|
-
message.textContent = "${copy.error_register_already_registered}";
|
|
200
|
-
} else if (errorName === "NotAllowedError") {
|
|
201
|
-
message.textContent = "${copy.error_register_cancelled}";
|
|
202
|
-
} else {
|
|
203
|
-
message.textContent = error.message || "${copy.error_register_failed}";
|
|
204
|
-
}
|
|
205
|
-
console.error(error);
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// POST the response to the endpoint that calls
|
|
210
|
-
// @simplewebauthn/server -> verifyRegistrationResponse()
|
|
211
|
-
try {
|
|
212
|
-
const verificationResp = await fetch(
|
|
213
|
-
"./register-verify?userId=" +
|
|
214
|
-
email +
|
|
215
|
-
"&origin=" +
|
|
216
|
-
origin +
|
|
217
|
-
"&rpID=" +
|
|
218
|
-
rpID,
|
|
219
|
-
{
|
|
220
|
-
method: "POST",
|
|
221
|
-
headers: {
|
|
222
|
-
"Content-Type": "application/json",
|
|
223
|
-
},
|
|
224
|
-
body: JSON.stringify(attResp),
|
|
225
|
-
}
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
// Check if the request was redirected and the final response is OK
|
|
229
|
-
if (verificationResp.redirected && verificationResp.ok) {
|
|
230
|
-
// Navigate the browser to the final URL
|
|
231
|
-
window.location.href = verificationResp.url;
|
|
232
|
-
} else {
|
|
233
|
-
// Handle errors (e.g., 4xx, 5xx status codes from the final URL)
|
|
234
|
-
console.error(
|
|
235
|
-
"Request failed:",
|
|
236
|
-
verificationResp.status,
|
|
237
|
-
verificationResp.statusText
|
|
238
|
-
);
|
|
239
|
-
try {
|
|
240
|
-
const errorData = await verificationResp.json();
|
|
241
|
-
message.textContent = errorData.error;
|
|
242
|
-
} catch (error) {
|
|
243
|
-
message.textContent = "Something went wrong";
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
} catch (error) {
|
|
247
|
-
console.error(error);
|
|
248
|
-
message.textContent = "Something went wrong";
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
registerForm.addEventListener("submit", (e) => {
|
|
253
|
-
e.preventDefault();
|
|
254
|
-
register();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
btnOtherDevice.addEventListener("click", (e) => {
|
|
258
|
-
e.preventDefault();
|
|
259
|
-
register(true);
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
` } }),
|
|
263
|
-
/* @__PURE__ */ jsxs("form", {
|
|
264
|
-
id: "registerForm",
|
|
265
|
-
"data-component": "form",
|
|
266
|
-
children: [
|
|
267
|
-
/* @__PURE__ */ jsx(FormAlert, {}),
|
|
268
|
-
/* @__PURE__ */ jsx("input", {
|
|
269
|
-
id: "reg-email",
|
|
270
|
-
"data-component": "input",
|
|
271
|
-
type: "email",
|
|
272
|
-
name: "email",
|
|
273
|
-
"aria-required": "true",
|
|
274
|
-
"aria-describedby": "reg-email-help",
|
|
275
|
-
autoComplete: "email",
|
|
276
|
-
required: true,
|
|
277
|
-
placeholder: copy.input_email
|
|
278
|
-
}),
|
|
279
|
-
/* @__PURE__ */ jsx("button", {
|
|
280
|
-
"data-component": "button",
|
|
281
|
-
type: "submit",
|
|
282
|
-
id: "btnRegister",
|
|
283
|
-
children: copy.button_continue
|
|
284
|
-
}),
|
|
285
|
-
/* @__PURE__ */ jsx("button", {
|
|
286
|
-
"data-component": "button",
|
|
287
|
-
type: "submit",
|
|
288
|
-
id: "btnOtherDevice",
|
|
289
|
-
children: copy.register_other_device
|
|
290
|
-
}),
|
|
291
|
-
/* @__PURE__ */ jsx("div", {
|
|
292
|
-
"data-component": "form-footer",
|
|
293
|
-
children: /* @__PURE__ */ jsxs("span", { children: [
|
|
294
|
-
copy.login_prompt,
|
|
295
|
-
" ",
|
|
296
|
-
/* @__PURE__ */ jsx("a", {
|
|
297
|
-
"data-component": "link",
|
|
298
|
-
href: "./authorize",
|
|
299
|
-
children: copy.login
|
|
300
|
-
})
|
|
301
|
-
] })
|
|
302
|
-
})
|
|
303
|
-
]
|
|
304
|
-
}),
|
|
305
|
-
/* @__PURE__ */ jsx("script", { src: "https://unpkg.com/@simplewebauthn/browser/dist/bundle/index.umd.min.js" })
|
|
306
|
-
] });
|
|
307
|
-
return new Response(renderToHTML(jsx$1), {
|
|
308
|
-
status: 200,
|
|
309
|
-
headers: { "Content-Type": "text/html" }
|
|
310
|
-
});
|
|
311
|
-
},
|
|
312
|
-
rpName,
|
|
313
|
-
rpID,
|
|
314
|
-
origin,
|
|
315
|
-
userCanRegisterPasskey,
|
|
316
|
-
authenticatorSelection,
|
|
317
|
-
attestationType,
|
|
318
|
-
timeout
|
|
319
|
-
};
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
//#endregion
|
|
323
|
-
export { PasskeyUI };
|
package/dist/ui/password.d.mts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { PasswordConfig } from "../provider/password.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/ui/password.d.ts
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Strongly typed copy text configuration for password UI
|
|
7
|
-
*/
|
|
8
|
-
interface PasswordUICopy {
|
|
9
|
-
readonly error_email_taken: string;
|
|
10
|
-
readonly error_invalid_code: string;
|
|
11
|
-
readonly error_invalid_email: string;
|
|
12
|
-
readonly error_invalid_password: string;
|
|
13
|
-
readonly error_password_mismatch: string;
|
|
14
|
-
readonly register: string;
|
|
15
|
-
readonly register_prompt: string;
|
|
16
|
-
readonly login_prompt: string;
|
|
17
|
-
readonly login: string;
|
|
18
|
-
readonly change_prompt: string;
|
|
19
|
-
readonly code_resend: string;
|
|
20
|
-
readonly code_return: string;
|
|
21
|
-
readonly input_email: string;
|
|
22
|
-
readonly input_password: string;
|
|
23
|
-
readonly input_code: string;
|
|
24
|
-
readonly input_repeat: string;
|
|
25
|
-
readonly button_continue: string;
|
|
26
|
-
readonly logo: string;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Configuration options for the PasswordUI component
|
|
30
|
-
*/
|
|
31
|
-
interface PasswordUIOptions extends Pick<PasswordConfig, "sendCode" | "validatePassword"> {
|
|
32
|
-
/**
|
|
33
|
-
* Custom text copy for UI labels, messages, and errors
|
|
34
|
-
*/
|
|
35
|
-
readonly copy?: Partial<PasswordUICopy>;
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Creates a complete UI configuration for password-based authentication
|
|
39
|
-
*/
|
|
40
|
-
declare const PasswordUI: (options: PasswordUIOptions) => PasswordConfig;
|
|
41
|
-
//#endregion
|
|
42
|
-
export { PasswordUI, PasswordUIOptions };
|