@awesome-lang-auth/node 1.10.1
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/LICENSE +21 -0
- package/README.detailed.md +4059 -0
- package/README.md +248 -0
- package/dist/abstract/base-auth-strategy.abstract.d.ts +7 -0
- package/dist/abstract/base-auth-strategy.abstract.d.ts.map +1 -0
- package/dist/abstract/base-auth-strategy.abstract.js +7 -0
- package/dist/abstract/base-auth-strategy.abstract.js.map +1 -0
- package/dist/abstract/base-oauth-strategy.abstract.d.ts +27 -0
- package/dist/abstract/base-oauth-strategy.abstract.d.ts.map +1 -0
- package/dist/abstract/base-oauth-strategy.abstract.js +11 -0
- package/dist/abstract/base-oauth-strategy.abstract.js.map +1 -0
- package/dist/adapters/express.d.ts +45 -0
- package/dist/adapters/express.d.ts.map +1 -0
- package/dist/adapters/express.js +49 -0
- package/dist/adapters/express.js.map +1 -0
- package/dist/adapters/fastify.d.ts +72 -0
- package/dist/adapters/fastify.d.ts.map +1 -0
- package/dist/adapters/fastify.js +63 -0
- package/dist/adapters/fastify.js.map +1 -0
- package/dist/auth-configurator.d.ts +65 -0
- package/dist/auth-configurator.d.ts.map +1 -0
- package/dist/auth-configurator.js +127 -0
- package/dist/auth-configurator.js.map +1 -0
- package/dist/events/auth-event-bus.d.ts +68 -0
- package/dist/events/auth-event-bus.d.ts.map +1 -0
- package/dist/events/auth-event-bus.js +60 -0
- package/dist/events/auth-event-bus.js.map +1 -0
- package/dist/events/auth-event-names.d.ts +34 -0
- package/dist/events/auth-event-names.d.ts.map +1 -0
- package/dist/events/auth-event-names.js +41 -0
- package/dist/events/auth-event-names.js.map +1 -0
- package/dist/http-types.d.ts +135 -0
- package/dist/http-types.d.ts.map +1 -0
- package/dist/http-types.js +18 -0
- package/dist/http-types.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/api-key-store.interface.d.ts +94 -0
- package/dist/interfaces/api-key-store.interface.d.ts.map +1 -0
- package/dist/interfaces/api-key-store.interface.js +3 -0
- package/dist/interfaces/api-key-store.interface.js.map +1 -0
- package/dist/interfaces/auth-strategy.interface.d.ts +6 -0
- package/dist/interfaces/auth-strategy.interface.d.ts.map +1 -0
- package/dist/interfaces/auth-strategy.interface.js +3 -0
- package/dist/interfaces/auth-strategy.interface.js.map +1 -0
- package/dist/interfaces/linked-accounts-store.interface.d.ts +74 -0
- package/dist/interfaces/linked-accounts-store.interface.d.ts.map +1 -0
- package/dist/interfaces/linked-accounts-store.interface.js +3 -0
- package/dist/interfaces/linked-accounts-store.interface.js.map +1 -0
- package/dist/interfaces/pending-link-store.interface.d.ts +77 -0
- package/dist/interfaces/pending-link-store.interface.d.ts.map +1 -0
- package/dist/interfaces/pending-link-store.interface.js +3 -0
- package/dist/interfaces/pending-link-store.interface.js.map +1 -0
- package/dist/interfaces/roles-permissions-store.interface.d.ts +129 -0
- package/dist/interfaces/roles-permissions-store.interface.d.ts.map +1 -0
- package/dist/interfaces/roles-permissions-store.interface.js +3 -0
- package/dist/interfaces/roles-permissions-store.interface.js.map +1 -0
- package/dist/interfaces/session-store.interface.d.ts +92 -0
- package/dist/interfaces/session-store.interface.d.ts.map +1 -0
- package/dist/interfaces/session-store.interface.js +3 -0
- package/dist/interfaces/session-store.interface.js.map +1 -0
- package/dist/interfaces/settings-store.interface.d.ts +91 -0
- package/dist/interfaces/settings-store.interface.d.ts.map +1 -0
- package/dist/interfaces/settings-store.interface.js +3 -0
- package/dist/interfaces/settings-store.interface.js.map +1 -0
- package/dist/interfaces/sse-distributor.interface.d.ts +25 -0
- package/dist/interfaces/sse-distributor.interface.d.ts.map +1 -0
- package/dist/interfaces/sse-distributor.interface.js +3 -0
- package/dist/interfaces/sse-distributor.interface.js.map +1 -0
- package/dist/interfaces/telemetry-store.interface.d.ts +72 -0
- package/dist/interfaces/telemetry-store.interface.d.ts.map +1 -0
- package/dist/interfaces/telemetry-store.interface.js +3 -0
- package/dist/interfaces/telemetry-store.interface.js.map +1 -0
- package/dist/interfaces/template-store.interface.d.ts +37 -0
- package/dist/interfaces/template-store.interface.d.ts.map +1 -0
- package/dist/interfaces/template-store.interface.js +3 -0
- package/dist/interfaces/template-store.interface.js.map +1 -0
- package/dist/interfaces/tenant-store.interface.d.ts +97 -0
- package/dist/interfaces/tenant-store.interface.d.ts.map +1 -0
- package/dist/interfaces/tenant-store.interface.js +3 -0
- package/dist/interfaces/tenant-store.interface.js.map +1 -0
- package/dist/interfaces/token-store.interface.d.ts +10 -0
- package/dist/interfaces/token-store.interface.d.ts.map +1 -0
- package/dist/interfaces/token-store.interface.js +3 -0
- package/dist/interfaces/token-store.interface.js.map +1 -0
- package/dist/interfaces/user-metadata-store.interface.d.ts +50 -0
- package/dist/interfaces/user-metadata-store.interface.d.ts.map +1 -0
- package/dist/interfaces/user-metadata-store.interface.js +3 -0
- package/dist/interfaces/user-metadata-store.interface.js.map +1 -0
- package/dist/interfaces/user-store.interface.d.ts +113 -0
- package/dist/interfaces/user-store.interface.d.ts.map +1 -0
- package/dist/interfaces/user-store.interface.js +3 -0
- package/dist/interfaces/user-store.interface.js.map +1 -0
- package/dist/interfaces/webhook-store.interface.d.ts +139 -0
- package/dist/interfaces/webhook-store.interface.d.ts.map +1 -0
- package/dist/interfaces/webhook-store.interface.js +3 -0
- package/dist/interfaces/webhook-store.interface.js.map +1 -0
- package/dist/middleware/api-key.middleware.d.ts +35 -0
- package/dist/middleware/api-key.middleware.d.ts.map +1 -0
- package/dist/middleware/api-key.middleware.js +45 -0
- package/dist/middleware/api-key.middleware.js.map +1 -0
- package/dist/middleware/auth.middleware.d.ts +13 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +55 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/middleware/jwks-auth.middleware.d.ts +18 -0
- package/dist/middleware/jwks-auth.middleware.d.ts.map +1 -0
- package/dist/middleware/jwks-auth.middleware.js +77 -0
- package/dist/middleware/jwks-auth.middleware.js.map +1 -0
- package/dist/models/api-key.model.d.ts +66 -0
- package/dist/models/api-key.model.d.ts.map +1 -0
- package/dist/models/api-key.model.js +3 -0
- package/dist/models/api-key.model.js.map +1 -0
- package/dist/models/auth-config.model.d.ts +387 -0
- package/dist/models/auth-config.model.d.ts.map +1 -0
- package/dist/models/auth-config.model.js +3 -0
- package/dist/models/auth-config.model.js.map +1 -0
- package/dist/models/errors.d.ts +7 -0
- package/dist/models/errors.d.ts.map +1 -0
- package/dist/models/errors.js +14 -0
- package/dist/models/errors.js.map +1 -0
- package/dist/models/session.model.d.ts +28 -0
- package/dist/models/session.model.d.ts.map +1 -0
- package/dist/models/session.model.js +3 -0
- package/dist/models/session.model.js.map +1 -0
- package/dist/models/tenant.model.d.ts +20 -0
- package/dist/models/tenant.model.d.ts.map +1 -0
- package/dist/models/tenant.model.js +3 -0
- package/dist/models/tenant.model.js.map +1 -0
- package/dist/models/token.model.d.ts +21 -0
- package/dist/models/token.model.d.ts.map +1 -0
- package/dist/models/token.model.js +3 -0
- package/dist/models/token.model.js.map +1 -0
- package/dist/models/user.model.d.ts +92 -0
- package/dist/models/user.model.d.ts.map +1 -0
- package/dist/models/user.model.js +3 -0
- package/dist/models/user.model.js.map +1 -0
- package/dist/router/admin.router.d.ts +188 -0
- package/dist/router/admin.router.d.ts.map +1 -0
- package/dist/router/admin.router.js +1507 -0
- package/dist/router/admin.router.js.map +1 -0
- package/dist/router/auth.router.d.ts +199 -0
- package/dist/router/auth.router.d.ts.map +1 -0
- package/dist/router/auth.router.js +1636 -0
- package/dist/router/auth.router.js.map +1 -0
- package/dist/router/openapi.d.ts +98 -0
- package/dist/router/openapi.d.ts.map +1 -0
- package/dist/router/openapi.js +1518 -0
- package/dist/router/openapi.js.map +1 -0
- package/dist/router/router-events.d.ts +38 -0
- package/dist/router/router-events.d.ts.map +1 -0
- package/dist/router/router-events.js +74 -0
- package/dist/router/router-events.js.map +1 -0
- package/dist/router/tools.router.d.ts +104 -0
- package/dist/router/tools.router.d.ts.map +1 -0
- package/dist/router/tools.router.js +227 -0
- package/dist/router/tools.router.js.map +1 -0
- package/dist/router/ui.router.d.ts +49 -0
- package/dist/router/ui.router.d.ts.map +1 -0
- package/dist/router/ui.router.js +272 -0
- package/dist/router/ui.router.js.map +1 -0
- package/dist/services/api-key.service.d.ts +53 -0
- package/dist/services/api-key.service.d.ts.map +1 -0
- package/dist/services/api-key.service.js +66 -0
- package/dist/services/api-key.service.js.map +1 -0
- package/dist/services/jwks.service.d.ts +73 -0
- package/dist/services/jwks.service.d.ts.map +1 -0
- package/dist/services/jwks.service.js +174 -0
- package/dist/services/jwks.service.js.map +1 -0
- package/dist/services/mailer.service.d.ts +30 -0
- package/dist/services/mailer.service.d.ts.map +1 -0
- package/dist/services/mailer.service.js +248 -0
- package/dist/services/mailer.service.js.map +1 -0
- package/dist/services/notification.service.d.ts +110 -0
- package/dist/services/notification.service.d.ts.map +1 -0
- package/dist/services/notification.service.js +79 -0
- package/dist/services/notification.service.js.map +1 -0
- package/dist/services/password.service.d.ts +5 -0
- package/dist/services/password.service.d.ts.map +1 -0
- package/dist/services/password.service.js +17 -0
- package/dist/services/password.service.js.map +1 -0
- package/dist/services/sms.service.d.ts +14 -0
- package/dist/services/sms.service.d.ts.map +1 -0
- package/dist/services/sms.service.js +51 -0
- package/dist/services/sms.service.js.map +1 -0
- package/dist/services/token.service.d.ts +62 -0
- package/dist/services/token.service.d.ts.map +1 -0
- package/dist/services/token.service.js +354 -0
- package/dist/services/token.service.js.map +1 -0
- package/dist/stores/memory-template.store.d.ts +12 -0
- package/dist/stores/memory-template.store.d.ts.map +1 -0
- package/dist/stores/memory-template.store.js +35 -0
- package/dist/stores/memory-template.store.js.map +1 -0
- package/dist/strategies/api-key/api-key.strategy.d.ts +72 -0
- package/dist/strategies/api-key/api-key.strategy.d.ts.map +1 -0
- package/dist/strategies/api-key/api-key.strategy.js +182 -0
- package/dist/strategies/api-key/api-key.strategy.js.map +1 -0
- package/dist/strategies/local/local.strategy.d.ts +19 -0
- package/dist/strategies/local/local.strategy.d.ts.map +1 -0
- package/dist/strategies/local/local.strategy.js +45 -0
- package/dist/strategies/local/local.strategy.js.map +1 -0
- package/dist/strategies/magic-link/magic-link.strategy.d.ts +8 -0
- package/dist/strategies/magic-link/magic-link.strategy.d.ts.map +1 -0
- package/dist/strategies/magic-link/magic-link.strategy.js +53 -0
- package/dist/strategies/magic-link/magic-link.strategy.js.map +1 -0
- package/dist/strategies/oauth/generic-oauth.strategy.d.ts +120 -0
- package/dist/strategies/oauth/generic-oauth.strategy.d.ts.map +1 -0
- package/dist/strategies/oauth/generic-oauth.strategy.js +88 -0
- package/dist/strategies/oauth/generic-oauth.strategy.js.map +1 -0
- package/dist/strategies/oauth/github.strategy.d.ts +31 -0
- package/dist/strategies/oauth/github.strategy.d.ts.map +1 -0
- package/dist/strategies/oauth/github.strategy.js +72 -0
- package/dist/strategies/oauth/github.strategy.js.map +1 -0
- package/dist/strategies/oauth/google.strategy.d.ts +31 -0
- package/dist/strategies/oauth/google.strategy.d.ts.map +1 -0
- package/dist/strategies/oauth/google.strategy.js +61 -0
- package/dist/strategies/oauth/google.strategy.js.map +1 -0
- package/dist/strategies/sms/sms.strategy.d.ts +7 -0
- package/dist/strategies/sms/sms.strategy.d.ts.map +1 -0
- package/dist/strategies/sms/sms.strategy.js +39 -0
- package/dist/strategies/sms/sms.strategy.js.map +1 -0
- package/dist/strategies/two-factor/totp.strategy.d.ts +12 -0
- package/dist/strategies/two-factor/totp.strategy.d.ts.map +1 -0
- package/dist/strategies/two-factor/totp.strategy.js +32 -0
- package/dist/strategies/two-factor/totp.strategy.js.map +1 -0
- package/dist/tools/auth-tools.d.ts +200 -0
- package/dist/tools/auth-tools.d.ts.map +1 -0
- package/dist/tools/auth-tools.js +232 -0
- package/dist/tools/auth-tools.js.map +1 -0
- package/dist/tools/sse-manager.d.ts +118 -0
- package/dist/tools/sse-manager.d.ts.map +1 -0
- package/dist/tools/sse-manager.js +163 -0
- package/dist/tools/sse-manager.js.map +1 -0
- package/dist/tools/sse-notify.decorator.d.ts +74 -0
- package/dist/tools/sse-notify.decorator.d.ts.map +1 -0
- package/dist/tools/sse-notify.decorator.js +78 -0
- package/dist/tools/sse-notify.decorator.js.map +1 -0
- package/dist/tools/webhook-action.d.ts +130 -0
- package/dist/tools/webhook-action.d.ts.map +1 -0
- package/dist/tools/webhook-action.js +144 -0
- package/dist/tools/webhook-action.js.map +1 -0
- package/dist/tools/webhook-sender.d.ts +31 -0
- package/dist/tools/webhook-sender.d.ts.map +1 -0
- package/dist/tools/webhook-sender.js +80 -0
- package/dist/tools/webhook-sender.js.map +1 -0
- package/dist/ui-assets/2fa.html +115 -0
- package/dist/ui-assets/account-conflict.html +108 -0
- package/dist/ui-assets/admin.css +263 -0
- package/dist/ui-assets/admin.js +1927 -0
- package/dist/ui-assets/auth.js +725 -0
- package/dist/ui-assets/base.css +219 -0
- package/dist/ui-assets/forgot-password.html +93 -0
- package/dist/ui-assets/link-verify.html +74 -0
- package/dist/ui-assets/login.html +135 -0
- package/dist/ui-assets/magic-link.html +112 -0
- package/dist/ui-assets/register.html +122 -0
- package/dist/ui-assets/reset-password.html +103 -0
- package/dist/ui-assets/ui-i18n-keys.json +78 -0
- package/dist/ui-assets/verify-email.html +66 -0
- package/package.json +89 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Register - Awesome Node Auth</title>
|
|
8
|
+
<link rel="stylesheet" href="base.css">
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<div class="auth-container">
|
|
13
|
+
<img src="" alt="Logo" class="logo hidden">
|
|
14
|
+
<h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
|
|
15
|
+
<h2 data-i18n="register_title">Create Account</h2>
|
|
16
|
+
|
|
17
|
+
<div id="alert" class="alert hidden"></div>
|
|
18
|
+
|
|
19
|
+
<form id="register-form">
|
|
20
|
+
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
|
|
21
|
+
<div class="form-group">
|
|
22
|
+
<label for="firstName">First Name</label>
|
|
23
|
+
<input type="text" id="firstName" name="firstName" required>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="form-group">
|
|
26
|
+
<label for="lastName">Last Name</label>
|
|
27
|
+
<input type="text" id="lastName" name="lastName" required>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="form-group">
|
|
31
|
+
<label for="email" data-i18n="email_label">Email</label>
|
|
32
|
+
<input type="email" id="email" name="email" required data-i18n="email_placeholder">
|
|
33
|
+
</div>
|
|
34
|
+
<div class="form-group">
|
|
35
|
+
<label for="password">Password</label>
|
|
36
|
+
<input type="password" id="password" name="password" required>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="form-group">
|
|
39
|
+
<label for="confirmPassword">Confirm Password</label>
|
|
40
|
+
<input type="password" id="confirmPassword" name="confirmPassword" required>
|
|
41
|
+
</div>
|
|
42
|
+
<button type="submit" id="submit-btn">Register</button>
|
|
43
|
+
</form>
|
|
44
|
+
|
|
45
|
+
<div class="footer-links">
|
|
46
|
+
<p>Already have an account? <a href="login">Login</a></p>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<script src="auth.js?v=2"></script>
|
|
51
|
+
<script>
|
|
52
|
+
document.addEventListener('DOMContentLoaded', async () => {
|
|
53
|
+
await AuthService.init();
|
|
54
|
+
|
|
55
|
+
if (AuthService.user) {
|
|
56
|
+
window.location.href = '/';
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const form = document.getElementById('register-form');
|
|
61
|
+
const alert = document.getElementById('alert');
|
|
62
|
+
const submitBtn = document.getElementById('submit-btn');
|
|
63
|
+
|
|
64
|
+
form.addEventListener('submit', async (e) => {
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
alert.className = 'alert hidden';
|
|
67
|
+
|
|
68
|
+
if (form.password.value !== form.confirmPassword.value) {
|
|
69
|
+
alert.textContent = 'Passwords do not match';
|
|
70
|
+
alert.classList.add('alert-error');
|
|
71
|
+
alert.classList.remove('hidden');
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
submitBtn.disabled = true;
|
|
76
|
+
submitBtn.textContent = 'Creating account...';
|
|
77
|
+
|
|
78
|
+
const payload = {
|
|
79
|
+
email: form.email.value,
|
|
80
|
+
password: form.password.value,
|
|
81
|
+
firstName: form.firstName.value,
|
|
82
|
+
lastName: form.lastName.value
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
const result = await AuthService.apiCall('/register', 'POST', payload);
|
|
87
|
+
|
|
88
|
+
if (result.success) {
|
|
89
|
+
alert.textContent = 'Registration successful! Redirecting...';
|
|
90
|
+
alert.classList.add('alert-success');
|
|
91
|
+
alert.classList.remove('hidden');
|
|
92
|
+
|
|
93
|
+
// Attempt auto-login if library returns success
|
|
94
|
+
const loginRes = await AuthService.apiCall('/login', 'POST', {
|
|
95
|
+
email: payload.email,
|
|
96
|
+
password: payload.password
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
if (loginRes.success) {
|
|
100
|
+
window.location.href = '/';
|
|
101
|
+
} else {
|
|
102
|
+
window.location.href = 'login?registered=true';
|
|
103
|
+
}
|
|
104
|
+
} else {
|
|
105
|
+
alert.textContent = result.error || 'Registration failed';
|
|
106
|
+
alert.classList.add('alert-error');
|
|
107
|
+
alert.classList.remove('hidden');
|
|
108
|
+
}
|
|
109
|
+
} catch (err) {
|
|
110
|
+
alert.textContent = 'An unexpected error occurred';
|
|
111
|
+
alert.classList.add('alert-error');
|
|
112
|
+
alert.classList.remove('hidden');
|
|
113
|
+
} finally {
|
|
114
|
+
submitBtn.disabled = false;
|
|
115
|
+
submitBtn.textContent = 'Register';
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
</script>
|
|
120
|
+
</body>
|
|
121
|
+
|
|
122
|
+
</html>
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Reset Password - Awesome Node Auth</title>
|
|
8
|
+
<link rel="stylesheet" href="base.css">
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<div class="auth-container">
|
|
13
|
+
<img src="" alt="Logo" class="logo hidden">
|
|
14
|
+
<h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
|
|
15
|
+
<h2 data-i18n="reset_password_title">Set New Password</h2>
|
|
16
|
+
|
|
17
|
+
<div id="alert" class="alert hidden"></div>
|
|
18
|
+
|
|
19
|
+
<form id="reset-form">
|
|
20
|
+
<div class="form-group">
|
|
21
|
+
<label for="password" data-i18n="new_password_label">New Password</label>
|
|
22
|
+
<input type="password" id="password" name="password" required data-i18n="new_password_placeholder">
|
|
23
|
+
</div>
|
|
24
|
+
<div class="form-group">
|
|
25
|
+
<label for="confirmPassword" data-i18n="confirm_password_label">Confirm Password</label>
|
|
26
|
+
<input type="password" id="confirmPassword" name="confirmPassword" required data-i18n="confirm_password_placeholder">
|
|
27
|
+
</div>
|
|
28
|
+
<button type="submit" id="submit-btn" data-i18n="save_password_button">Save New Password</button>
|
|
29
|
+
</form>
|
|
30
|
+
|
|
31
|
+
<div id="success-message" class="hidden">
|
|
32
|
+
<div class="alert alert-success" data-i18n="reset_password_success">
|
|
33
|
+
Your password has been successfully reset.
|
|
34
|
+
</div>
|
|
35
|
+
<p class="footer-links">
|
|
36
|
+
<a href="login" data-i18n="proceed_to_login_link">Proceed to login</a>
|
|
37
|
+
</p>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<script src="auth.js?v=2"></script>
|
|
42
|
+
<script>
|
|
43
|
+
document.addEventListener('DOMContentLoaded', async () => {
|
|
44
|
+
await AuthService.init();
|
|
45
|
+
|
|
46
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
47
|
+
const token = urlParams.get('token');
|
|
48
|
+
|
|
49
|
+
const form = document.getElementById('reset-form');
|
|
50
|
+
const alert = document.getElementById('alert');
|
|
51
|
+
const submitBtn = document.getElementById('submit-btn');
|
|
52
|
+
const successContainer = document.getElementById('success-message');
|
|
53
|
+
|
|
54
|
+
if (!token) {
|
|
55
|
+
alert.textContent = 'Invalid or missing reset token.';
|
|
56
|
+
alert.classList.add('alert-error');
|
|
57
|
+
alert.classList.remove('hidden');
|
|
58
|
+
form.classList.add('hidden');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
form.addEventListener('submit', async (e) => {
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
alert.className = 'alert hidden';
|
|
65
|
+
|
|
66
|
+
if (form.password.value !== form.confirmPassword.value) {
|
|
67
|
+
alert.textContent = 'Passwords do not match';
|
|
68
|
+
alert.classList.add('alert-error');
|
|
69
|
+
alert.classList.remove('hidden');
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
submitBtn.disabled = true;
|
|
74
|
+
submitBtn.textContent = 'Saving...';
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
const result = await AuthService.apiCall('/reset-password', 'POST', {
|
|
78
|
+
password: form.password.value,
|
|
79
|
+
token
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (result.success) {
|
|
83
|
+
form.classList.add('hidden');
|
|
84
|
+
successContainer.classList.remove('hidden');
|
|
85
|
+
} else {
|
|
86
|
+
alert.textContent = result.error || 'Failed to reset password';
|
|
87
|
+
alert.classList.add('alert-error');
|
|
88
|
+
alert.classList.remove('hidden');
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
alert.textContent = 'An unexpected error occurred';
|
|
92
|
+
alert.classList.add('alert-error');
|
|
93
|
+
alert.classList.remove('hidden');
|
|
94
|
+
} finally {
|
|
95
|
+
submitBtn.disabled = false;
|
|
96
|
+
submitBtn.textContent = 'Save New Password';
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
</script>
|
|
101
|
+
</body>
|
|
102
|
+
|
|
103
|
+
</html>
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
{
|
|
2
|
+
"2fa": [
|
|
3
|
+
"site_name",
|
|
4
|
+
"two_fa_code_label",
|
|
5
|
+
"two_fa_code_placeholder",
|
|
6
|
+
"two_fa_setup_instruction",
|
|
7
|
+
"two_fa_title",
|
|
8
|
+
"verify_code_button"
|
|
9
|
+
],
|
|
10
|
+
"account-conflict": [
|
|
11
|
+
"account_linking_instruction",
|
|
12
|
+
"account_linking_title",
|
|
13
|
+
"send_verification_email_button",
|
|
14
|
+
"site_name"
|
|
15
|
+
],
|
|
16
|
+
"forgot-password": [
|
|
17
|
+
"email_label",
|
|
18
|
+
"email_placeholder",
|
|
19
|
+
"forgot_password_instruction",
|
|
20
|
+
"forgot_password_success",
|
|
21
|
+
"forgot_password_title",
|
|
22
|
+
"login_link",
|
|
23
|
+
"remember_password_text",
|
|
24
|
+
"return_to_login_link",
|
|
25
|
+
"send_reset_link_button",
|
|
26
|
+
"site_name"
|
|
27
|
+
],
|
|
28
|
+
"link-verify": [
|
|
29
|
+
"account_linking_loading",
|
|
30
|
+
"account_linking_title",
|
|
31
|
+
"go_to_login_link",
|
|
32
|
+
"site_name"
|
|
33
|
+
],
|
|
34
|
+
"login": [
|
|
35
|
+
"email_label",
|
|
36
|
+
"email_placeholder",
|
|
37
|
+
"forgot_password_link",
|
|
38
|
+
"login_button",
|
|
39
|
+
"login_title",
|
|
40
|
+
"no_account_text",
|
|
41
|
+
"password_label",
|
|
42
|
+
"password_placeholder",
|
|
43
|
+
"signup_link",
|
|
44
|
+
"site_name",
|
|
45
|
+
"social_divider"
|
|
46
|
+
],
|
|
47
|
+
"magic-link": [
|
|
48
|
+
"email_label",
|
|
49
|
+
"email_placeholder",
|
|
50
|
+
"magic_link_instruction",
|
|
51
|
+
"magic_link_title",
|
|
52
|
+
"send_magic_link_button",
|
|
53
|
+
"site_name"
|
|
54
|
+
],
|
|
55
|
+
"register": [
|
|
56
|
+
"email_label",
|
|
57
|
+
"email_placeholder",
|
|
58
|
+
"register_title",
|
|
59
|
+
"site_name"
|
|
60
|
+
],
|
|
61
|
+
"reset-password": [
|
|
62
|
+
"confirm_password_label",
|
|
63
|
+
"confirm_password_placeholder",
|
|
64
|
+
"new_password_label",
|
|
65
|
+
"new_password_placeholder",
|
|
66
|
+
"proceed_to_login_link",
|
|
67
|
+
"reset_password_success",
|
|
68
|
+
"reset_password_title",
|
|
69
|
+
"save_password_button",
|
|
70
|
+
"site_name"
|
|
71
|
+
],
|
|
72
|
+
"verify-email": [
|
|
73
|
+
"go_to_login_link",
|
|
74
|
+
"site_name",
|
|
75
|
+
"verify_email_loading",
|
|
76
|
+
"verify_email_title"
|
|
77
|
+
]
|
|
78
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="UTF-8">
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
7
|
+
<title>Verify Email - Awesome Node Auth</title>
|
|
8
|
+
<link rel="stylesheet" href="base.css">
|
|
9
|
+
</head>
|
|
10
|
+
|
|
11
|
+
<body>
|
|
12
|
+
<div class="auth-container">
|
|
13
|
+
<img src="" alt="Logo" class="logo hidden">
|
|
14
|
+
<h1 class="site-name" data-i18n="site_name">Awesome Node Auth</h1>
|
|
15
|
+
<h2 data-i18n="verify_email_title">Email Verification</h2>
|
|
16
|
+
|
|
17
|
+
<div id="alert" class="alert hidden"></div>
|
|
18
|
+
|
|
19
|
+
<div id="loading" class="footer-links" data-i18n="verify_email_loading">
|
|
20
|
+
Verifying your email address, please wait...
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<div class="footer-links">
|
|
24
|
+
<a href="login" data-i18n="go_to_login_link">Go to login</a>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
<script src="auth.js?v=2"></script>
|
|
29
|
+
<script>
|
|
30
|
+
document.addEventListener('DOMContentLoaded', async () => {
|
|
31
|
+
await AuthService.init();
|
|
32
|
+
|
|
33
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
34
|
+
const token = urlParams.get('token');
|
|
35
|
+
const alert = document.getElementById('alert');
|
|
36
|
+
const loading = document.getElementById('loading');
|
|
37
|
+
|
|
38
|
+
if (!token) {
|
|
39
|
+
alert.textContent = 'Invalid or missing verification token.';
|
|
40
|
+
alert.className = 'alert alert-error';
|
|
41
|
+
loading.classList.add('hidden');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
// GET /auth/verify-email?token=...
|
|
47
|
+
const result = await AuthService.apiCall(`/verify-email?token=${token}`, 'GET');
|
|
48
|
+
|
|
49
|
+
loading.classList.add('hidden');
|
|
50
|
+
if (result.success) {
|
|
51
|
+
alert.textContent = 'Your email has been successfully verified!';
|
|
52
|
+
alert.className = 'alert alert-success';
|
|
53
|
+
} else {
|
|
54
|
+
alert.textContent = result.error || 'Verification failed';
|
|
55
|
+
alert.className = 'alert alert-error';
|
|
56
|
+
}
|
|
57
|
+
} catch (err) {
|
|
58
|
+
loading.classList.add('hidden');
|
|
59
|
+
alert.textContent = 'An unexpected error occurred';
|
|
60
|
+
alert.className = 'alert alert-error';
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
</script>
|
|
64
|
+
</body>
|
|
65
|
+
|
|
66
|
+
</html>
|
package/package.json
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@awesome-lang-auth/node",
|
|
3
|
+
"version": "1.10.1",
|
|
4
|
+
"description": "Database-agnostic JWT authentication and communication bus for Node.js",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"extract-i18n": "node scripts/extract-i18n-keys.js",
|
|
8
|
+
"build": "npm run extract-i18n && tsc && mkdir -p dist/ui-assets && cp -r src/ui/assets/* dist/ui-assets",
|
|
9
|
+
"test": "vitest run",
|
|
10
|
+
"test:coverage": "vitest run --coverage"
|
|
11
|
+
},
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/awesome-lang-auth/awesome-node-auth.git"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"auth",
|
|
18
|
+
"node",
|
|
19
|
+
"nodejs",
|
|
20
|
+
"awesome-node-auth",
|
|
21
|
+
"awesome-lang-auth",
|
|
22
|
+
"authentication",
|
|
23
|
+
"middleware",
|
|
24
|
+
"express-auth",
|
|
25
|
+
"jwt",
|
|
26
|
+
"security",
|
|
27
|
+
"backend",
|
|
28
|
+
"authorization",
|
|
29
|
+
"nestjs",
|
|
30
|
+
"nextjs",
|
|
31
|
+
"angular",
|
|
32
|
+
"react",
|
|
33
|
+
"vue",
|
|
34
|
+
"ssr",
|
|
35
|
+
"ios",
|
|
36
|
+
"android",
|
|
37
|
+
"2fa",
|
|
38
|
+
"totp",
|
|
39
|
+
"flutter",
|
|
40
|
+
"bearer token",
|
|
41
|
+
"sms",
|
|
42
|
+
"event-bus",
|
|
43
|
+
"pub-sub",
|
|
44
|
+
"message-queue",
|
|
45
|
+
"redis"
|
|
46
|
+
],
|
|
47
|
+
"author": "Nicola Brecciaroli",
|
|
48
|
+
"license": "MIT",
|
|
49
|
+
"type": "commonjs",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/awesome-lang-auth/awesome-node-auth/issues"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://www.awesomenodeauth.com/",
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"bcryptjs": "^3.0.3",
|
|
56
|
+
"jsonwebtoken": "^9.0.3",
|
|
57
|
+
"multer": "^2.1.1",
|
|
58
|
+
"otplib": "^13.3.0",
|
|
59
|
+
"qrcode": "^1.5.4"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/bcryptjs": "^2.4.6",
|
|
63
|
+
"@types/express": "^5.0.6",
|
|
64
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
65
|
+
"@types/multer": "^2.1.0",
|
|
66
|
+
"@types/node": "^25.3.0",
|
|
67
|
+
"@types/qrcode": "^1.5.6",
|
|
68
|
+
"@types/supertest": "^6.0.3",
|
|
69
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
70
|
+
"express": "^5.2.1",
|
|
71
|
+
"happy-dom": "^20.8.3",
|
|
72
|
+
"supertest": "^7.2.2",
|
|
73
|
+
"typescript": "^5.9.3",
|
|
74
|
+
"vitest": "^4.0.18"
|
|
75
|
+
},
|
|
76
|
+
"types": "dist/index.d.ts",
|
|
77
|
+
"files": [
|
|
78
|
+
"dist",
|
|
79
|
+
"dist/ui-assets",
|
|
80
|
+
"README.md",
|
|
81
|
+
"LICENSE"
|
|
82
|
+
],
|
|
83
|
+
"overrides": {
|
|
84
|
+
"rollup": "^4.59.0"
|
|
85
|
+
},
|
|
86
|
+
"publishConfig": {
|
|
87
|
+
"access": "public"
|
|
88
|
+
}
|
|
89
|
+
}
|