@arikajs/auth 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +175 -53
- package/dist/AuthContext.d.ts +24 -0
- package/dist/AuthContext.d.ts.map +1 -0
- package/dist/AuthContext.js +65 -0
- package/dist/AuthContext.js.map +1 -0
- package/dist/AuthManager.d.ts +33 -8
- package/dist/AuthManager.d.ts.map +1 -1
- package/dist/AuthManager.js +194 -51
- package/dist/AuthManager.js.map +1 -1
- package/dist/Contracts/CanResetPassword.d.ts +11 -0
- package/dist/Contracts/CanResetPassword.d.ts.map +1 -0
- package/dist/Contracts/CanResetPassword.js +3 -0
- package/dist/Contracts/CanResetPassword.js.map +1 -0
- package/dist/Contracts/CanVerifyEmail.d.ts +19 -0
- package/dist/Contracts/CanVerifyEmail.d.ts.map +1 -0
- package/dist/Contracts/CanVerifyEmail.js +3 -0
- package/dist/Contracts/CanVerifyEmail.js.map +1 -0
- package/dist/Contracts/EventDispatcher.d.ts +7 -0
- package/dist/Contracts/EventDispatcher.d.ts.map +1 -0
- package/dist/Contracts/EventDispatcher.js +3 -0
- package/dist/Contracts/EventDispatcher.js.map +1 -0
- package/dist/Contracts/PasswordBroker.d.ts +18 -0
- package/dist/Contracts/PasswordBroker.d.ts.map +1 -0
- package/dist/Contracts/PasswordBroker.js +11 -0
- package/dist/Contracts/PasswordBroker.js.map +1 -0
- package/dist/Contracts/RateLimiter.d.ts +15 -0
- package/dist/Contracts/RateLimiter.d.ts.map +1 -0
- package/dist/Contracts/RateLimiter.js +3 -0
- package/dist/Contracts/RateLimiter.js.map +1 -0
- package/dist/Contracts/UserProvider.d.ts +4 -0
- package/dist/Contracts/UserProvider.d.ts.map +1 -1
- package/dist/Guards/BasicGuard.d.ts +17 -0
- package/dist/Guards/BasicGuard.d.ts.map +1 -0
- package/dist/Guards/BasicGuard.js +59 -0
- package/dist/Guards/BasicGuard.js.map +1 -0
- package/dist/Guards/JwtGuard.d.ts +36 -0
- package/dist/Guards/JwtGuard.d.ts.map +1 -0
- package/dist/Guards/JwtGuard.js +158 -0
- package/dist/Guards/JwtGuard.js.map +1 -0
- package/dist/Guards/SessionGuard.d.ts +7 -3
- package/dist/Guards/SessionGuard.d.ts.map +1 -1
- package/dist/Guards/SessionGuard.js +104 -10
- package/dist/Guards/SessionGuard.js.map +1 -1
- package/dist/Hasher.d.ts +4 -0
- package/dist/Hasher.d.ts.map +1 -1
- package/dist/Hasher.js +6 -0
- package/dist/Hasher.js.map +1 -1
- package/dist/Middleware/Authenticate.d.ts +11 -2
- package/dist/Middleware/Authenticate.d.ts.map +1 -1
- package/dist/Middleware/Authenticate.js +42 -14
- package/dist/Middleware/Authenticate.js.map +1 -1
- package/dist/Middleware/EnsureEmailIsVerified.d.ts +8 -0
- package/dist/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
- package/dist/Middleware/EnsureEmailIsVerified.js +27 -0
- package/dist/Middleware/EnsureEmailIsVerified.js.map +1 -0
- package/dist/Passwords/PasswordResetBroker.d.ts +37 -0
- package/dist/Passwords/PasswordResetBroker.d.ts.map +1 -0
- package/dist/Passwords/PasswordResetBroker.js +128 -0
- package/dist/Passwords/PasswordResetBroker.js.map +1 -0
- package/dist/Providers/EloquentUserProvider.d.ts +30 -0
- package/dist/Providers/EloquentUserProvider.d.ts.map +1 -0
- package/dist/Providers/EloquentUserProvider.js +63 -0
- package/dist/Providers/EloquentUserProvider.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/src/AuthContext.d.ts +24 -0
- package/dist/src/AuthContext.d.ts.map +1 -0
- package/dist/src/AuthContext.js +65 -0
- package/dist/src/AuthContext.js.map +1 -0
- package/dist/src/AuthManager.d.ts +52 -0
- package/dist/src/AuthManager.d.ts.map +1 -0
- package/dist/src/AuthManager.js +255 -0
- package/dist/src/AuthManager.js.map +1 -0
- package/dist/src/Contracts/CanResetPassword.d.ts +11 -0
- package/dist/src/Contracts/CanResetPassword.d.ts.map +1 -0
- package/dist/src/Contracts/CanResetPassword.js +3 -0
- package/dist/src/Contracts/CanResetPassword.js.map +1 -0
- package/dist/src/Contracts/CanVerifyEmail.d.ts +19 -0
- package/dist/src/Contracts/CanVerifyEmail.d.ts.map +1 -0
- package/dist/src/Contracts/CanVerifyEmail.js +3 -0
- package/dist/src/Contracts/CanVerifyEmail.js.map +1 -0
- package/dist/src/Contracts/EventDispatcher.d.ts +7 -0
- package/dist/src/Contracts/EventDispatcher.d.ts.map +1 -0
- package/dist/src/Contracts/EventDispatcher.js +3 -0
- package/dist/src/Contracts/EventDispatcher.js.map +1 -0
- package/dist/src/Contracts/PasswordBroker.d.ts +18 -0
- package/dist/src/Contracts/PasswordBroker.d.ts.map +1 -0
- package/dist/src/Contracts/PasswordBroker.js +11 -0
- package/dist/src/Contracts/PasswordBroker.js.map +1 -0
- package/dist/src/Contracts/RateLimiter.d.ts +15 -0
- package/dist/src/Contracts/RateLimiter.d.ts.map +1 -0
- package/dist/src/Contracts/RateLimiter.js +3 -0
- package/dist/src/Contracts/RateLimiter.js.map +1 -0
- package/dist/src/Contracts/UserProvider.d.ts +10 -0
- package/dist/src/Contracts/UserProvider.d.ts.map +1 -0
- package/dist/src/Contracts/UserProvider.js +3 -0
- package/dist/src/Contracts/UserProvider.js.map +1 -0
- package/dist/src/Guard.d.ts +10 -0
- package/dist/src/Guard.d.ts.map +1 -0
- package/dist/src/Guard.js +3 -0
- package/dist/src/Guard.js.map +1 -0
- package/dist/src/Guards/BasicGuard.d.ts +17 -0
- package/dist/src/Guards/BasicGuard.d.ts.map +1 -0
- package/dist/src/Guards/BasicGuard.js +59 -0
- package/dist/src/Guards/BasicGuard.js.map +1 -0
- package/dist/src/Guards/JwtGuard.d.ts +36 -0
- package/dist/src/Guards/JwtGuard.d.ts.map +1 -0
- package/dist/src/Guards/JwtGuard.js +158 -0
- package/dist/src/Guards/JwtGuard.js.map +1 -0
- package/dist/src/Guards/SessionGuard.d.ts +23 -0
- package/dist/src/Guards/SessionGuard.d.ts.map +1 -0
- package/dist/src/Guards/SessionGuard.js +162 -0
- package/dist/src/Guards/SessionGuard.js.map +1 -0
- package/dist/src/Guards/TokenGuard.d.ts +17 -0
- package/dist/src/Guards/TokenGuard.d.ts.map +1 -0
- package/dist/src/Guards/TokenGuard.js +60 -0
- package/dist/src/Guards/TokenGuard.js.map +1 -0
- package/dist/src/Hasher.d.ts +15 -0
- package/dist/src/Hasher.d.ts.map +1 -0
- package/dist/src/Hasher.js +59 -0
- package/dist/src/Hasher.js.map +1 -0
- package/dist/src/Middleware/Authenticate.d.ts +24 -0
- package/dist/src/Middleware/Authenticate.d.ts.map +1 -0
- package/dist/src/Middleware/Authenticate.js +66 -0
- package/dist/src/Middleware/Authenticate.js.map +1 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.d.ts +8 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.d.ts.map +1 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.js +27 -0
- package/dist/src/Middleware/EnsureEmailIsVerified.js.map +1 -0
- package/dist/src/Passwords/PasswordResetBroker.d.ts +37 -0
- package/dist/src/Passwords/PasswordResetBroker.d.ts.map +1 -0
- package/dist/src/Passwords/PasswordResetBroker.js +128 -0
- package/dist/src/Passwords/PasswordResetBroker.js.map +1 -0
- package/dist/src/Providers/EloquentUserProvider.d.ts +30 -0
- package/dist/src/Providers/EloquentUserProvider.d.ts.map +1 -0
- package/dist/src/Providers/EloquentUserProvider.js +63 -0
- package/dist/src/Providers/EloquentUserProvider.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +35 -0
- package/dist/src/index.js.map +1 -0
- package/dist/tests/Auth.test.d.ts +2 -0
- package/dist/tests/Auth.test.d.ts.map +1 -0
- package/dist/tests/Auth.test.js +177 -0
- package/dist/tests/Auth.test.js.map +1 -0
- package/package.json +51 -47
package/README.md
CHANGED
|
@@ -7,9 +7,8 @@ It enables applications to authenticate users using session-based (web) or token
|
|
|
7
7
|
```ts
|
|
8
8
|
import { AuthManager } from '@arikajs/auth';
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
10
|
+
// Per-request scoped — safe for concurrent requests
|
|
11
|
+
const user = await req.auth.user();
|
|
13
12
|
```
|
|
14
13
|
|
|
15
14
|
---
|
|
@@ -63,18 +62,26 @@ This package is responsible for:
|
|
|
63
62
|
|
|
64
63
|
## Features
|
|
65
64
|
|
|
65
|
+
- **Request-scoped auth context**
|
|
66
|
+
- Memory-safe, per-request isolation via `req.auth` — no leaks under concurrency.
|
|
66
67
|
- **Multiple authentication guards**
|
|
67
|
-
- Configure different strategies for API vs Web.
|
|
68
|
-
- **
|
|
69
|
-
-
|
|
70
|
-
- **
|
|
71
|
-
-
|
|
68
|
+
- Configure different strategies for API vs Web (Session, JWT, Token, Basic).
|
|
69
|
+
- **Stateless JWT with Refresh Tokens**
|
|
70
|
+
- Short-lived access tokens + rotating refresh tokens for modern APIs.
|
|
71
|
+
- **"Remember Me" support**
|
|
72
|
+
- Persistent login across browser restarts with secure cookie rotation.
|
|
73
|
+
- **Email verification system**
|
|
74
|
+
- Verify user emails with a simple API and `verified` middleware.
|
|
75
|
+
- **Password reset flow**
|
|
76
|
+
- Token-based resets with expiry and hash-secured storage.
|
|
77
|
+
- **Account locking & throttling**
|
|
78
|
+
- Soft lock after N failures, auto-unlock, manual unlock.
|
|
79
|
+
- **Auth event dispatching**
|
|
80
|
+
- Hook into `Auth.Login`, `Auth.Failed`, `Auth.Lockout`, etc.
|
|
72
81
|
- **Pluggable user providers**
|
|
73
82
|
- Connect to any database or ORM.
|
|
74
83
|
- **Secure password hashing**
|
|
75
84
|
- Industry-standard hashing algorithms (Bcrypt/Argon2).
|
|
76
|
-
- **Middleware-based protection**
|
|
77
|
-
- Easily secure routes.
|
|
78
85
|
|
|
79
86
|
---
|
|
80
87
|
|
|
@@ -95,13 +102,13 @@ pnpm add @arikajs/auth
|
|
|
95
102
|
```
|
|
96
103
|
Request
|
|
97
104
|
↓
|
|
98
|
-
Authenticate Middleware
|
|
105
|
+
Authenticate Middleware ← creates req.auth (AuthContext)
|
|
99
106
|
↓
|
|
100
|
-
|
|
107
|
+
AuthContext → Guard (Session / JWT / Token / Basic)
|
|
101
108
|
↓
|
|
102
109
|
User Provider
|
|
103
110
|
↓
|
|
104
|
-
Authenticated User (or
|
|
111
|
+
Authenticated User (or reject)
|
|
105
112
|
```
|
|
106
113
|
|
|
107
114
|
---
|
|
@@ -114,8 +121,10 @@ Guards define how users are authenticated.
|
|
|
114
121
|
|
|
115
122
|
| Guard | Description |
|
|
116
123
|
| :--- | :--- |
|
|
117
|
-
| `session` | Cookie/session-based authentication |
|
|
124
|
+
| `session` | Cookie/session-based authentication with "Remember Me" support |
|
|
125
|
+
| `jwt` | Stateless API authentication using JSON Web Tokens (JWT) |
|
|
118
126
|
| `token` | Header-based token authentication |
|
|
127
|
+
| `basic` | HTTP Basic Authentication support |
|
|
119
128
|
|
|
120
129
|
---
|
|
121
130
|
|
|
@@ -126,8 +135,12 @@ User providers define how users are retrieved.
|
|
|
126
135
|
```ts
|
|
127
136
|
export interface UserProvider {
|
|
128
137
|
retrieveById(id: string | number): Promise<any>;
|
|
129
|
-
|
|
130
|
-
|
|
138
|
+
retrieveByToken?(id: string | number, token: string): Promise<any>;
|
|
139
|
+
updateRememberToken?(user: any, token: string | null): Promise<void>;
|
|
140
|
+
updateRefreshToken?(user: any, token: string | null): Promise<void>;
|
|
141
|
+
retrieveByRefreshToken?(token: string): Promise<any>;
|
|
142
|
+
retrieveByCredentials(credentials: Record<string, any>): Promise<any>;
|
|
143
|
+
validateCredentials(user: any, credentials: Record<string, any>): boolean | Promise<boolean>;
|
|
131
144
|
}
|
|
132
145
|
```
|
|
133
146
|
|
|
@@ -137,23 +150,27 @@ Providers allow you to integrate any database or user store.
|
|
|
137
150
|
|
|
138
151
|
## 🔌 Basic Usage
|
|
139
152
|
|
|
140
|
-
### Checking Authentication State
|
|
153
|
+
### Checking Authentication State (per-request)
|
|
141
154
|
|
|
142
155
|
```ts
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const user = auth.user();
|
|
156
|
+
// In your controller — req.auth is automatically bound by the Authenticate middleware
|
|
157
|
+
if (await req.auth.check()) {
|
|
158
|
+
const user = await req.auth.user();
|
|
147
159
|
}
|
|
160
|
+
|
|
161
|
+
// Or via the global facade (backed by AsyncLocalStorage):
|
|
162
|
+
import { auth } from '@arikajs/auth';
|
|
163
|
+
const user = await auth.user();
|
|
148
164
|
```
|
|
149
165
|
|
|
150
166
|
### Attempting Login
|
|
151
167
|
|
|
152
168
|
```ts
|
|
169
|
+
// The second parameter `true` enables "Remember Me"
|
|
153
170
|
const success = await auth.attempt({
|
|
154
171
|
email: 'test@example.com',
|
|
155
172
|
password: 'secret',
|
|
156
|
-
});
|
|
173
|
+
}, true);
|
|
157
174
|
|
|
158
175
|
if (!success) {
|
|
159
176
|
throw new Error('Invalid credentials');
|
|
@@ -163,7 +180,7 @@ if (!success) {
|
|
|
163
180
|
### Logging Out
|
|
164
181
|
|
|
165
182
|
```ts
|
|
166
|
-
auth.logout();
|
|
183
|
+
await auth.logout();
|
|
167
184
|
```
|
|
168
185
|
|
|
169
186
|
---
|
|
@@ -181,27 +198,117 @@ Route.get('/dashboard', handler)
|
|
|
181
198
|
|
|
182
199
|
```ts
|
|
183
200
|
Route.get('/api/user', handler)
|
|
184
|
-
.middleware(['auth:
|
|
201
|
+
.middleware(['auth:jwt']); // or auth:token, auth:basic
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 🚀 Advanced Features
|
|
207
|
+
|
|
208
|
+
### 🔒 Request-Scoped Auth Context (Critical for Concurrency)
|
|
209
|
+
Every incoming request gets its own isolated `AuthContext`. No shared mutable state, no memory leaks under concurrent load.
|
|
210
|
+
```ts
|
|
211
|
+
// The Authenticate middleware does this automatically:
|
|
212
|
+
const context = authManager.createContext(request);
|
|
213
|
+
// Now: req.auth.user(), req.auth.check(), req.auth.attempt() are all request-scoped
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 🔑 Stateless JWT with Refresh Tokens
|
|
217
|
+
Short-lived access tokens + secure refresh token rotation for modern API architectures:
|
|
218
|
+
```ts
|
|
219
|
+
// Login returns both tokens
|
|
220
|
+
const result = await req.auth.guard('jwt').attempt({ email, password });
|
|
221
|
+
// result = { access_token: 'eyJhbG...', refresh_token: '9f3a7b...' }
|
|
222
|
+
|
|
223
|
+
// Refresh when the access token expires
|
|
224
|
+
const newTokens = await jwtGuard.refresh(oldRefreshToken);
|
|
225
|
+
// Returns rotated access + refresh tokens
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 🍪 "Remember Me" Capability
|
|
229
|
+
Keep users logged in seamlessly across browser restarts using long-lived secure cookies.
|
|
230
|
+
```ts
|
|
231
|
+
await req.auth.attempt(credentials, true); // true = remember me
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### ✉️ Email Verification System
|
|
235
|
+
Verify user emails with a simple API and protect routes that require verification:
|
|
236
|
+
```ts
|
|
237
|
+
// Send verification email
|
|
238
|
+
await req.auth.sendVerification(user);
|
|
239
|
+
|
|
240
|
+
// Protect routes requiring email verification
|
|
241
|
+
Route.get('/billing', handler)
|
|
242
|
+
.middleware(['auth', 'verified']);
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### 🔐 Password Reset Flow
|
|
246
|
+
Full token-based password reset with expiry and hash-secured storage:
|
|
247
|
+
```ts
|
|
248
|
+
import { PasswordResetBroker } from '@arikajs/auth';
|
|
249
|
+
|
|
250
|
+
const broker = new PasswordResetBroker(userProvider);
|
|
251
|
+
|
|
252
|
+
// Send reset link
|
|
253
|
+
const status = await broker.sendResetLink({ email: 'user@example.com' });
|
|
254
|
+
|
|
255
|
+
// Reset password with token
|
|
256
|
+
const result = await broker.reset(
|
|
257
|
+
{ email, token, password: newPassword },
|
|
258
|
+
async (user, password) => {
|
|
259
|
+
user.password = await Hasher.make(password);
|
|
260
|
+
await user.save();
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### 🛡️ Account Locking Strategy
|
|
266
|
+
Soft lock accounts after too many failed attempts. Auto-unlock after configured duration. Manual unlock for admins.
|
|
267
|
+
```ts
|
|
268
|
+
// Check if account is locked
|
|
269
|
+
const locked = await req.auth.isLocked({ email });
|
|
270
|
+
|
|
271
|
+
// Manually unlock (e.g., admin action)
|
|
272
|
+
await req.auth.unlockAccount({ email });
|
|
273
|
+
|
|
274
|
+
// Configuration:
|
|
275
|
+
// { lockout: { maxAttempts: 5, decayMinutes: 15 } }
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### 🛡️ Login Throttling (Rate Limiting)
|
|
279
|
+
ArikaJS Auth automatically integrates with RateLimiters to protect against brute-force attacks!
|
|
280
|
+
```ts
|
|
281
|
+
authManager.setRateLimiter(new RedisRateLimiter());
|
|
185
282
|
```
|
|
186
283
|
|
|
284
|
+
### 📡 Event Dispatching
|
|
285
|
+
ArikaJS fires core auth events so you can hook into the lifecycle:
|
|
286
|
+
- `Auth.Attempting` — login attempt started
|
|
287
|
+
- `Auth.Login` — successful login
|
|
288
|
+
- `Auth.Failed` — failed login attempt
|
|
289
|
+
- `Auth.Logout` — user logged out
|
|
290
|
+
- `Auth.Lockout` — account locked due to too many failures
|
|
291
|
+
- `Auth.VerificationSent` — verification email dispatched
|
|
292
|
+
- `Auth.AccountUnlocked` — account manually unlocked
|
|
293
|
+
|
|
187
294
|
---
|
|
188
295
|
|
|
189
296
|
## ⚙️ Configuration
|
|
190
297
|
|
|
191
298
|
Example configuration:
|
|
192
299
|
|
|
193
|
-
```
|
|
300
|
+
```ts
|
|
194
301
|
{
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
302
|
+
default: 'session',
|
|
303
|
+
guards: {
|
|
304
|
+
session: { driver: 'session', provider: 'users' },
|
|
305
|
+
jwt: { driver: 'jwt', provider: 'users', secret: 'your-jwt-secret', options: { expiresIn: '15m' } },
|
|
306
|
+
token: { driver: 'token', provider: 'users' },
|
|
307
|
+
basic: { driver: 'basic', provider: 'users' }
|
|
308
|
+
},
|
|
309
|
+
lockout: {
|
|
310
|
+
maxAttempts: 5,
|
|
311
|
+
decayMinutes: 15
|
|
205
312
|
}
|
|
206
313
|
}
|
|
207
314
|
```
|
|
@@ -221,23 +328,38 @@ Uses industry-standard hashing algorithms.
|
|
|
221
328
|
|
|
222
329
|
---
|
|
223
330
|
|
|
224
|
-
##
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
331
|
+
## 🏗 Architecture
|
|
332
|
+
|
|
333
|
+
```text
|
|
334
|
+
auth/
|
|
335
|
+
├── src/
|
|
336
|
+
│ ├── Contracts
|
|
337
|
+
│ │ ├── CanResetPassword.ts
|
|
338
|
+
│ │ ├── CanVerifyEmail.ts
|
|
339
|
+
│ │ ├── EventDispatcher.ts
|
|
340
|
+
│ │ ├── PasswordBroker.ts
|
|
341
|
+
│ │ ├── RateLimiter.ts
|
|
342
|
+
│ │ └── UserProvider.ts
|
|
343
|
+
│ ├── Guards
|
|
344
|
+
│ │ ├── BasicGuard.ts
|
|
345
|
+
│ │ ├── JwtGuard.ts
|
|
346
|
+
│ │ ├── SessionGuard.ts
|
|
347
|
+
│ │ └── TokenGuard.ts
|
|
348
|
+
│ ├── Middleware
|
|
349
|
+
│ │ ├── Authenticate.ts
|
|
350
|
+
│ │ └── EnsureEmailIsVerified.ts
|
|
351
|
+
│ ├── Passwords
|
|
352
|
+
│ │ └── PasswordResetBroker.ts
|
|
353
|
+
│ ├── AuthContext.ts
|
|
354
|
+
│ ├── AuthManager.ts
|
|
355
|
+
│ ├── Guard.ts
|
|
356
|
+
│ ├── Hasher.ts
|
|
357
|
+
│ └── index.ts
|
|
358
|
+
├── tests/
|
|
359
|
+
├── package.json
|
|
360
|
+
├── tsconfig.json
|
|
361
|
+
└── README.md
|
|
362
|
+
```
|
|
241
363
|
|
|
242
364
|
---
|
|
243
365
|
|
|
@@ -257,4 +379,4 @@ Uses industry-standard hashing algorithms.
|
|
|
257
379
|
|
|
258
380
|
## 🧠 Philosophy
|
|
259
381
|
|
|
260
|
-
> “Authentication identifies the user. Authorization defines their power.”
|
|
382
|
+
> “Authentication identifies the user. Authorization defines their power.”
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Guard } from './Guard';
|
|
2
|
+
import { AuthManager } from './AuthManager';
|
|
3
|
+
export declare class AuthContext {
|
|
4
|
+
private guards;
|
|
5
|
+
private request;
|
|
6
|
+
private manager;
|
|
7
|
+
constructor(manager: AuthManager, request: any);
|
|
8
|
+
guard(name?: string): Guard;
|
|
9
|
+
check(): Promise<boolean>;
|
|
10
|
+
guest(): Promise<boolean>;
|
|
11
|
+
user(): Promise<any>;
|
|
12
|
+
id(): Promise<string | number | null>;
|
|
13
|
+
validate(credentials: Record<string, any>): Promise<boolean>;
|
|
14
|
+
setUser(user: any): void;
|
|
15
|
+
attempt(credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
|
|
16
|
+
login(user: any, remember?: boolean): Promise<void>;
|
|
17
|
+
logout(): Promise<void>;
|
|
18
|
+
sendVerification(user?: any): Promise<void>;
|
|
19
|
+
isLocked(credentials: Record<string, any>): Promise<boolean>;
|
|
20
|
+
unlockAccount(credentials: Record<string, any>): Promise<void>;
|
|
21
|
+
getRequest(): any;
|
|
22
|
+
resolve(token: any): any;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=AuthContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthContext.d.ts","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,qBAAa,WAAW;IACpB,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG;IAKvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;IAerB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAIpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAIrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAIvB,gBAAgB,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5D,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpE,UAAU,IAAI,GAAG;IAIjB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;CAGlC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthContext = void 0;
|
|
4
|
+
class AuthContext {
|
|
5
|
+
constructor(manager, request) {
|
|
6
|
+
this.guards = new Map();
|
|
7
|
+
this.manager = manager;
|
|
8
|
+
this.request = request;
|
|
9
|
+
}
|
|
10
|
+
guard(name) {
|
|
11
|
+
name = name || this.manager.getDefaultGuard();
|
|
12
|
+
if (!name) {
|
|
13
|
+
throw new Error('No auth guard defined.');
|
|
14
|
+
}
|
|
15
|
+
if (!this.guards.has(name)) {
|
|
16
|
+
this.guards.set(name, this.manager.resolveGuard(name, this.request));
|
|
17
|
+
}
|
|
18
|
+
return this.guards.get(name);
|
|
19
|
+
}
|
|
20
|
+
// Proxy methods to the default guard
|
|
21
|
+
async check() {
|
|
22
|
+
return await this.guard().check();
|
|
23
|
+
}
|
|
24
|
+
async guest() {
|
|
25
|
+
return await this.guard().guest();
|
|
26
|
+
}
|
|
27
|
+
async user() {
|
|
28
|
+
return await this.guard().user();
|
|
29
|
+
}
|
|
30
|
+
async id() {
|
|
31
|
+
return await this.guard().id();
|
|
32
|
+
}
|
|
33
|
+
async validate(credentials) {
|
|
34
|
+
return await this.guard().validate(credentials);
|
|
35
|
+
}
|
|
36
|
+
setUser(user) {
|
|
37
|
+
this.guard().setUser(user);
|
|
38
|
+
}
|
|
39
|
+
async attempt(credentials, remember = false) {
|
|
40
|
+
return await this.manager.attemptForContext(this, credentials, remember);
|
|
41
|
+
}
|
|
42
|
+
async login(user, remember = false) {
|
|
43
|
+
return await this.manager.loginForContext(this, user, remember);
|
|
44
|
+
}
|
|
45
|
+
async logout() {
|
|
46
|
+
return await this.manager.logoutForContext(this);
|
|
47
|
+
}
|
|
48
|
+
async sendVerification(user) {
|
|
49
|
+
return await this.manager.sendVerification(this, user);
|
|
50
|
+
}
|
|
51
|
+
async isLocked(credentials) {
|
|
52
|
+
return await this.manager.isLocked(this, credentials);
|
|
53
|
+
}
|
|
54
|
+
async unlockAccount(credentials) {
|
|
55
|
+
return await this.manager.unlockAccount(this, credentials);
|
|
56
|
+
}
|
|
57
|
+
getRequest() {
|
|
58
|
+
return this.request;
|
|
59
|
+
}
|
|
60
|
+
resolve(token) {
|
|
61
|
+
return this.guard(token);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.AuthContext = AuthContext;
|
|
65
|
+
//# sourceMappingURL=AuthContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthContext.js","sourceRoot":"","sources":["../src/AuthContext.ts"],"names":[],"mappings":";;;AAGA,MAAa,WAAW;IAKpB,YAAY,OAAoB,EAAE,OAAY;QAJtC,WAAM,GAAuB,IAAI,GAAG,EAAE,CAAC;QAK3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,IAAa;QACtB,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAE9C,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;IAClC,CAAC;IAED,qCAAqC;IAC9B,KAAK,CAAC,KAAK;QACd,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,KAAK;QACd,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEM,KAAK,CAAC,IAAI;QACb,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,EAAE;QACX,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAgC;QAClD,OAAO,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACpD,CAAC;IAEM,OAAO,CAAC,IAAS;QACpB,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,WAAgC,EAAE,WAAoB,KAAK;QAC5E,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,IAAS,EAAE,WAAoB,KAAK;QACnD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,MAAM;QACf,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAAC,IAAU;QACpC,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,WAAgC;QAClD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,WAAgC;QACvD,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC/D,CAAC;IAEM,UAAU;QACb,OAAO,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IAEM,OAAO,CAAC,KAAU;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,CAAC;IACvC,CAAC;CACJ;AAhFD,kCAgFC"}
|
package/dist/AuthManager.d.ts
CHANGED
|
@@ -1,27 +1,52 @@
|
|
|
1
1
|
import { Guard } from './Guard';
|
|
2
2
|
import { UserProvider } from './Contracts/UserProvider';
|
|
3
|
+
import { EventDispatcher } from './Contracts/EventDispatcher';
|
|
4
|
+
import { RateLimiter } from './Contracts/RateLimiter';
|
|
5
|
+
import { AuthContext } from './AuthContext';
|
|
3
6
|
export declare class AuthManager {
|
|
4
|
-
private guards;
|
|
5
7
|
private providers;
|
|
8
|
+
private eventDispatcher;
|
|
9
|
+
private rateLimiter;
|
|
6
10
|
private config;
|
|
11
|
+
private defaultGuard;
|
|
12
|
+
private als;
|
|
7
13
|
constructor(config: any);
|
|
14
|
+
setEventDispatcher(dispatcher: EventDispatcher): void;
|
|
15
|
+
setRateLimiter(limiter: RateLimiter): void;
|
|
8
16
|
registerProvider(name: string, provider: UserProvider): void;
|
|
9
17
|
extend(name: string, callback: (app: any) => Guard): void;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
setRequest(request: any): void;
|
|
18
|
+
getDefaultGuard(): string;
|
|
19
|
+
createContext(request: any): AuthContext;
|
|
20
|
+
resolveGuard(name: string, request: any): Guard;
|
|
14
21
|
private createSessionDriver;
|
|
15
22
|
private createTokenDriver;
|
|
23
|
+
private createJwtDriver;
|
|
24
|
+
private createBasicDriver;
|
|
25
|
+
private getProvider;
|
|
16
26
|
shouldUse(name: string): void;
|
|
27
|
+
runWithContext<T>(context: AuthContext, fn: () => T | Promise<T>): T | Promise<T>;
|
|
28
|
+
private getContext;
|
|
29
|
+
guard(name?: string): Guard;
|
|
30
|
+
resolve(token: any): any;
|
|
17
31
|
check(): Promise<boolean>;
|
|
18
32
|
guest(): Promise<boolean>;
|
|
19
33
|
user(): Promise<any>;
|
|
20
34
|
id(): Promise<string | number | null>;
|
|
21
35
|
validate(credentials: Record<string, any>): Promise<boolean>;
|
|
22
36
|
setUser(user: any): void;
|
|
23
|
-
attempt(credentials: Record<string, any
|
|
24
|
-
login(user: any): void
|
|
25
|
-
logout(): void
|
|
37
|
+
attempt(credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
|
|
38
|
+
login(user: any, remember?: boolean): Promise<void>;
|
|
39
|
+
logout(): Promise<void>;
|
|
40
|
+
attemptForContext(context: AuthContext, credentials: Record<string, any>, remember?: boolean): Promise<boolean | string>;
|
|
41
|
+
loginForContext(context: AuthContext, user: any, remember?: boolean): Promise<void>;
|
|
42
|
+
logoutForContext(context: AuthContext): Promise<void>;
|
|
43
|
+
sendVerification(context: AuthContext, user?: any): Promise<void>;
|
|
44
|
+
private get lockoutThreshold();
|
|
45
|
+
private get lockoutDuration();
|
|
46
|
+
isLocked(context: AuthContext, credentials: Record<string, any>): Promise<boolean>;
|
|
47
|
+
unlockAccount(context: AuthContext, credentials: Record<string, any>): Promise<void>;
|
|
48
|
+
private getLockKey;
|
|
49
|
+
private fireEvent;
|
|
50
|
+
private getThrottleKey;
|
|
26
51
|
}
|
|
27
52
|
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../src/AuthManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAI5C,qBAAa,WAAW;IACpB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,GAAG,CAAwC;gBAEvC,MAAM,EAAE,GAAG;IAKhB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAIrD,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAI1C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAI5D,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,GAAG,IAAI;IAIzD,eAAe,IAAI,MAAM;IAIzB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,WAAW;IAWxC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,KAAK;IA0BtD,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,WAAW;IAqBZ,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI7B,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIxF,OAAO,CAAC,UAAU;IASX,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK;IAI3B,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG;IAIlB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAIzB,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAIpB,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAIrC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIlB,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAI/F,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1D,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAKvB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;IAqC/H,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAW1F,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAarD,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9E,OAAO,KAAK,gBAAgB,GAE3B;IAED,OAAO,KAAK,eAAe,GAE1B;IAEY,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IASlF,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjG,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,cAAc;CAOzB"}
|